@@ -6,12 +6,12 @@ class PostsController < ApplicationController
|
||||
# GET /posts
|
||||
def index
|
||||
posts = filtered_posts
|
||||
render json: posts.as_json(include: { tags: { only: [:id, :name, :category] } })
|
||||
render json: posts.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } })
|
||||
end
|
||||
|
||||
def random
|
||||
post = filtered_posts.order('RAND()').first
|
||||
viewed = current_user&.viewed?(post)
|
||||
viewed = current_user&.viewed?(post) || false
|
||||
render json: (post
|
||||
.as_json(include: { tags: { only: [:id, :name, :category] } })
|
||||
.merge(viewed: viewed))
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
class TagsController < ApplicationController
|
||||
def index
|
||||
tags =
|
||||
if params[:post].present?
|
||||
Tag.joins(:posts).where(posts: { id: params[:post] })
|
||||
else
|
||||
Tag.all
|
||||
end
|
||||
post_id = params[:post]
|
||||
tags = if post_id.present?
|
||||
Tag.joins(:posts).where(posts: { id: post_id })
|
||||
else
|
||||
Tag.all
|
||||
end
|
||||
render json: tags
|
||||
end
|
||||
|
||||
@@ -14,23 +14,25 @@ class TagsController < ApplicationController
|
||||
return render json: [] if q.blank?
|
||||
|
||||
tags = (Tag
|
||||
.left_joins(:posts)
|
||||
.select('tags.id, tags.name, tags.category, COUNT(posts.id) AS post_count')
|
||||
.where('(tags.category = ? AND tags.name LIKE ?)
|
||||
OR tags.name LIKE ?',
|
||||
.where('(category = ? AND name LIKE ?) OR name LIKE ?',
|
||||
'nico', "nico:#{ q }%", "#{ q }%")
|
||||
.group('tags.id')
|
||||
.order('post_count DESC, tags.name ASC')
|
||||
.order('post_count DESC, name ASC')
|
||||
.limit(20))
|
||||
render json: tags.map { |tag| {
|
||||
id: tag.id,
|
||||
name: tag.name,
|
||||
category: tag.category,
|
||||
count: tag.post_count } }
|
||||
render json: tags
|
||||
end
|
||||
|
||||
def show
|
||||
render json: Tag.find(params[:id])
|
||||
tag = Tag.find(params[:id])
|
||||
render json: tag
|
||||
end
|
||||
|
||||
def show_by_name
|
||||
tag = Tag.find_by(name: params[:name])
|
||||
if tag
|
||||
render json: tag
|
||||
else
|
||||
head :not_found
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
|
||||
@@ -20,17 +20,18 @@ class WikiPagesController < ApplicationController
|
||||
|
||||
diffs = Diff::LCS.sdiff(wiki_page_from.body, wiki_page_to.body)
|
||||
diff_json = diffs.map { |change|
|
||||
case change.action
|
||||
when ?=
|
||||
{ type: 'context', content: change.old_element }
|
||||
when ?|
|
||||
[{ type: 'removed', content: change.old_element },
|
||||
{ type: 'added', content: change.new_element }]
|
||||
when ?+
|
||||
{ type: 'added', content: change.new_element }
|
||||
when ?-
|
||||
{ type: 'removed', content: change.old_element }
|
||||
end }.flatten.compact
|
||||
case change.action
|
||||
when ?=
|
||||
{ type: 'context', content: change.old_element }
|
||||
when ?|
|
||||
[{ type: 'removed', content: change.old_element },
|
||||
{ type: 'added', content: change.new_element }]
|
||||
when ?+
|
||||
{ type: 'added', content: change.new_element }
|
||||
when ?-
|
||||
{ type: 'removed', content: change.old_element }
|
||||
end
|
||||
}.flatten.compact
|
||||
|
||||
render json: { wiki_page_id: wiki_page_from.id,
|
||||
title: wiki_page_from.title,
|
||||
@@ -54,14 +55,19 @@ class WikiPagesController < ApplicationController
|
||||
|
||||
def update
|
||||
return head :unauthorized unless current_user
|
||||
return head :forbidden unless ['admin', 'member'].include?(current_user.role)
|
||||
return head :forbidden unless current_user.member?
|
||||
|
||||
title = params[:title]
|
||||
body = params[:body]
|
||||
|
||||
return head :unprocessable_entity if title.blank? || body.blank?
|
||||
|
||||
wiki_page = WikiPage.find(params[:id])
|
||||
return head :not_found unless wiki_page
|
||||
|
||||
wiki_page.title = title
|
||||
wiki_page.updated_user = current_user
|
||||
wiki_page.set_body params[:body], user: current_user
|
||||
wiki_page.set_body(body, user: current_user)
|
||||
wiki_page.save!
|
||||
|
||||
head :ok
|
||||
end
|
||||
|
||||
@@ -71,28 +77,34 @@ class WikiPagesController < ApplicationController
|
||||
q = WikiPage.all
|
||||
q = q.where('title LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%") if title.present?
|
||||
|
||||
render json: q.limit(20).map { |page|
|
||||
page.sha = nil
|
||||
page }
|
||||
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)
|
||||
log = if id.present?
|
||||
wiki.page("#{ id }.md")&.versions
|
||||
else
|
||||
wiki.repo.log('main', nil)
|
||||
end
|
||||
return render json: [] unless log
|
||||
|
||||
render json: log.map { |commit|
|
||||
wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i)
|
||||
wiki_page.sha = commit.id
|
||||
user = User.find(commit.author.name.to_i)
|
||||
{ sha: wiki_page.sha,
|
||||
pred: wiki_page.pred,
|
||||
succ: wiki_page.succ,
|
||||
wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i)
|
||||
wiki_page.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 } }
|
||||
next nil if wiki_page.sha.blank?
|
||||
|
||||
user = User.find(commit.author.name.to_i)
|
||||
|
||||
{ sha: wiki_page.sha,
|
||||
pred: wiki_page.pred,
|
||||
succ: wiki_page.succ,
|
||||
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 }
|
||||
}.compact
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user