require 'gollum-lib' class WikiPage < ApplicationRecord belongs_to :tag, optional: true belongs_to :created_user, class_name: 'User', foreign_key: 'created_user_id' belongs_to :updated_user, class_name: 'User', foreign_key: 'updated_user_id' validates :title, presence: true, length: { maximum: 255 }, uniqueness: true def as_json options = { } self.sha = nil super options end def sha= val if val.present? @sha = val @page = wiki.page("#{ id }.md", @sha) else @page = wiki.page("#{ id }.md") @sha = @page.versions.first.id end vers = @page.versions idx = vers.find_index { |ver| ver.id == @sha } if idx @pred = vers[idx + 1]&.id @succ = idx.positive? ? vers[idx - 1].id : nil @updated_at = vers[idx].authored_date else @sha = nil @pred = nil @succ = nil @updated_at = nil end @sha end def sha @sha end def pred @pred end def succ @succ end def updated_at @updated_at end def body sha = nil unless @page @page&.raw_data&.force_encoding('UTF-8') end def set_body content, user: commit_info = { name: user.id.to_s, email: 'dummy@example.com' } page = wiki.page("#{ id }.md") if page commit_info[:message] = "Updated #{ id }" wiki.update_page(page, id.to_s, :markdown, content, commit_info) else commit_info[:message] = "Created #{ id }" wiki.write_page(id.to_s, :markdown, content, commit_info) end end private WIKI_PATH = Rails.root.join('wiki').to_s def wiki @wiki ||= Gollum::Wiki.new(WIKI_PATH) end end