ぼざクリ タグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

136 lines
3.7 KiB

  1. class WikiPagesController < ApplicationController
  2. def index
  3. wiki_pages = WikiPage.all
  4. render json: wiki_pages
  5. end
  6. def show
  7. render_wiki_page_or_404 WikiPage.find(params[:id])
  8. end
  9. def show_by_title
  10. render_wiki_page_or_404 WikiPage.find_by(title: params[:title])
  11. end
  12. def diff
  13. id = params[:id]
  14. from = params[:from]
  15. to = params[:to].presence
  16. return head :bad_request if id.blank? || from.blank?
  17. wiki_page_from = WikiPage.find(id)
  18. wiki_page_to = WikiPage.find(id)
  19. wiki_page_from.sha = from
  20. wiki_page_to.sha = to
  21. diffs = Diff::LCS.sdiff(wiki_page_from.body, wiki_page_to.body)
  22. diff_json = diffs.map { |change|
  23. case change.action
  24. when ?=
  25. { type: 'context', content: change.old_element }
  26. when ?|
  27. [{ type: 'removed', content: change.old_element },
  28. { type: 'added', content: change.new_element }]
  29. when ?+
  30. { type: 'added', content: change.new_element }
  31. when ?-
  32. { type: 'removed', content: change.old_element }
  33. end
  34. }.flatten.compact
  35. render json: { wiki_page_id: wiki_page_from.id,
  36. title: wiki_page_from.title,
  37. older_sha: wiki_page_from.sha,
  38. newer_sha: wiki_page_to.sha,
  39. diff: diff_json }
  40. end
  41. def create
  42. return head :unauthorized unless current_user
  43. return head :forbidden unless ['admin', 'member'].include?(current_user.role)
  44. wiki_page = WikiPage.new(title: params[:title], created_user: current_user, updated_user: current_user)
  45. if wiki_page.save
  46. wiki_page.set_body params[:body], user: current_user
  47. render json: wiki_page, status: :created
  48. else
  49. render json: { errors: wiki_page.errors.full_messages }, status: :unprocessable_entity
  50. end
  51. end
  52. def update
  53. return head :unauthorized unless current_user
  54. return head :forbidden unless current_user.member?
  55. title = params[:title]
  56. body = params[:body]
  57. return head :unprocessable_entity if title.blank? || body.blank?
  58. wiki_page = WikiPage.find(params[:id])
  59. wiki_page.title = title
  60. wiki_page.updated_user = current_user
  61. wiki_page.set_body(body, user: current_user)
  62. wiki_page.save!
  63. head :ok
  64. end
  65. def search
  66. title = params[:title]&.strip
  67. q = WikiPage.all
  68. q = q.where('title LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%") if title.present?
  69. render json: q.limit(20)
  70. end
  71. def changes
  72. id = params[:id]
  73. log = if id.present?
  74. wiki.page("#{ id }.md")&.versions
  75. else
  76. wiki.repo.log('main', nil)
  77. end
  78. return render json: [] unless log
  79. render json: log.map { |commit|
  80. wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i)
  81. wiki_page.sha = commit.id
  82. next nil if wiki_page.sha.blank?
  83. user = User.find(commit.author.name.to_i)
  84. { sha: wiki_page.sha,
  85. pred: wiki_page.pred,
  86. succ: wiki_page.succ,
  87. wiki_page: wiki_page && { id: wiki_page.id, title: wiki_page.title },
  88. user: user && { id: user.id, name: user.name },
  89. change_type: commit.message.split(' ')[0].downcase[0...(-1)],
  90. timestamp: commit.authored_date }
  91. }.compact
  92. end
  93. private
  94. WIKI_PATH = Rails.root.join('wiki').to_s
  95. def wiki
  96. @wiki ||= Gollum::Wiki.new(WIKI_PATH)
  97. end
  98. def render_wiki_page_or_404 wiki_page
  99. return head :not_found unless wiki_page
  100. wiki_page.sha = params[:version].presence
  101. body = wiki_page.body
  102. sha = wiki_page.sha
  103. pred = wiki_page.pred
  104. succ = wiki_page.succ
  105. render json: wiki_page.as_json.merge(body:, sha:, pred:, succ:)
  106. end
  107. end