ぼざクリ タグ広場 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.
 
 
 
 
 
 

118 lines
3.5 KiB

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