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

121 lines
3.6 KiB

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