class WikiPagesController < ApplicationController def show wiki_page = WikiPage.find(params[:id]) return head :not_found unless wiki_page render json: wiki_page.as_json.merge(body: wiki_page.body) end def show_by_title wiki_page = WikiPage.find_by(title: params[:title]) return head :not_found unless wiki_page render json: wiki_page.as_json.merge(body: wiki_page.body) end def create return head :unauthorized unless current_user return head :forbidden unless ['admin', 'member'].include?(current_user.role) wiki_page = WikiPage.new(title: params[:title], created_user: current_user, updated_user: current_user) if wiki_page.save wiki_page.set_body params[:body], user: current_user render json: wiki_page, status: :created else render json: { errors: wiki_page.errors.full_messages }, status: :unprocessable_entity end end def update return head :unauthorized unless current_user return head :forbidden unless ['admin', 'member'].include?(current_user.role) wiki_page = WikiPage.find(params[:id]) return head :not_found unless wiki_page wiki_page.updated_user = current_user wiki_page.set_body params[:body], user: current_user wiki_page.save! head :ok end def search q = WikiPage.all if params[:title].present? title = params[:title].to_s.strip q = q.where('title LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%") end render json: q.limit(20) end def changes id = params[:id] log = id.present? ? wiki.page("#{ id }.md")&.versions : wiki.repo.log('main', nil, max_count: 50) return render json: [] unless log render json: log.map { |commit| wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i) user = User.find(commit.author.name.to_i) { sha: commit.id, wiki_page: wiki_page && { id: wiki_page.id, title: wiki_page.title }, user: user && { id: user.id, name: user.name }, change_type: commit.message.split(' ')[0].downcase[0...(-1)], timestamp: commit.authored_date } } end private WIKI_PATH = Rails.root.join('wiki').to_s def wiki @wiki ||= Gollum::Wiki.new(WIKI_PATH) end end