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

130 lines
3.6 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
  30. }.flatten.compact
  31. render json: { wiki_page_id: wiki_page_from.id,
  32. title: wiki_page_from.title,
  33. older_sha: wiki_page_from.sha,
  34. newer_sha: wiki_page_to.sha,
  35. diff: diff_json }
  36. end
  37. def create
  38. return head :unauthorized unless current_user
  39. return head :forbidden unless ['admin', 'member'].include?(current_user.role)
  40. wiki_page = WikiPage.new(title: params[:title], created_user: current_user, updated_user: current_user)
  41. if wiki_page.save
  42. wiki_page.set_body params[:body], user: current_user
  43. render json: wiki_page, status: :created
  44. else
  45. render json: { errors: wiki_page.errors.full_messages }, status: :unprocessable_entity
  46. end
  47. end
  48. def update
  49. return head :unauthorized unless current_user
  50. return head :forbidden unless current_user.member?
  51. title = params[:title]
  52. body = params[:body]
  53. return head :unprocessable_entity if title.blank? || body.blank?
  54. wiki_page = WikiPage.find(params[:id])
  55. wiki_page.title = title
  56. wiki_page.updated_user = current_user
  57. wiki_page.set_body(body, user: current_user)
  58. wiki_page.save!
  59. head :ok
  60. end
  61. def search
  62. title = params[:title]&.strip
  63. q = WikiPage.all
  64. q = q.where('title LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%") if title.present?
  65. render json: q.limit(20)
  66. end
  67. def changes
  68. id = params[:id]
  69. log = if id.present?
  70. wiki.page("#{ id }.md")&.versions
  71. else
  72. wiki.repo.log('main', nil)
  73. end
  74. return render json: [] unless log
  75. render json: log.map { |commit|
  76. wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i)
  77. wiki_page.sha = commit.id
  78. next nil if wiki_page.sha.blank?
  79. user = User.find(commit.author.name.to_i)
  80. { sha: wiki_page.sha,
  81. pred: wiki_page.pred,
  82. succ: wiki_page.succ,
  83. wiki_page: wiki_page && { id: wiki_page.id, title: wiki_page.title },
  84. user: user && { id: user.id, name: user.name },
  85. change_type: commit.message.split(' ')[0].downcase[0...(-1)],
  86. timestamp: commit.authored_date }
  87. }.compact
  88. end
  89. private
  90. WIKI_PATH = Rails.root.join('wiki').to_s
  91. def wiki
  92. @wiki ||= Gollum::Wiki.new(WIKI_PATH)
  93. end
  94. def render_wiki_page_or_404 wiki_page
  95. return head :not_found unless wiki_page
  96. wiki_page.sha = params[:version].presence
  97. body = wiki_page.body
  98. sha = wiki_page.sha
  99. pred = wiki_page.pred
  100. succ = wiki_page.succ
  101. render json: wiki_page.as_json.merge(body:, sha:, pred:, succ:)
  102. end
  103. end