This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
class PostsController < ApplicationController
|
||||
Event = Struct.new(:post, :tag, :user, :change_type, :timestamp, keyword_init: true)
|
||||
|
||||
# GET /posts
|
||||
def index
|
||||
page = (params[:page].presence || 1).to_i
|
||||
limit = (params[:limit].presence || 20).to_i
|
||||
@@ -18,7 +17,7 @@ class PostsController < ApplicationController
|
||||
'posts.created_at)'
|
||||
q =
|
||||
filtered_posts
|
||||
.preload(:tags)
|
||||
.preload(tags: :tag_name)
|
||||
.with_attached_thumbnail
|
||||
.select("posts.*, #{ sort_sql } AS sort_ts")
|
||||
.order(Arel.sql("#{ sort_sql } DESC"))
|
||||
@@ -36,7 +35,8 @@ class PostsController < ApplicationController
|
||||
end
|
||||
|
||||
render json: { posts: posts.map { |post|
|
||||
post.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } }).tap do |json|
|
||||
post.as_json(include: { tags: { only: [:id, :category, :post_count],
|
||||
methods: [:name] } }).tap do |json|
|
||||
json['thumbnail'] =
|
||||
if post.thumbnail.attached?
|
||||
rails_storage_proxy_url(post.thumbnail, only_path: false)
|
||||
@@ -48,19 +48,19 @@ class PostsController < ApplicationController
|
||||
end
|
||||
|
||||
def random
|
||||
post = filtered_posts.order('RAND()').first
|
||||
post = filtered_posts.preload(tags: :tag_name).order('RAND()').first
|
||||
return head :not_found unless post
|
||||
|
||||
viewed = current_user&.viewed?(post) || false
|
||||
|
||||
render json: (post
|
||||
.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } })
|
||||
.as_json(include: { tags: { only: [:id, :category, :post_count],
|
||||
methods: [:name] } })
|
||||
.merge(viewed:))
|
||||
end
|
||||
|
||||
# GET /posts/1
|
||||
def show
|
||||
post = Post.includes(:tags).find(params[:id])
|
||||
post = Post.includes(tags: :tag_name).find(params[:id])
|
||||
return head :not_found unless post
|
||||
|
||||
viewed = current_user&.viewed?(post) || false
|
||||
@@ -73,7 +73,6 @@ class PostsController < ApplicationController
|
||||
render json:
|
||||
end
|
||||
|
||||
# POST /posts
|
||||
def create
|
||||
return head :unauthorized unless current_user
|
||||
return head :forbidden unless current_user.member?
|
||||
@@ -96,7 +95,8 @@ class PostsController < ApplicationController
|
||||
tags = Tag.normalise_tags(tag_names)
|
||||
tags = Tag.expand_parent_tags(tags)
|
||||
sync_post_tags!(post, tags)
|
||||
render json: post.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } }),
|
||||
render json: post.as_json(include: { tags: { only: [:id, :category, :post_count],
|
||||
methods: [:name] } }),
|
||||
status: :created
|
||||
else
|
||||
render json: { errors: post.errors.full_messages }, status: :unprocessable_entity
|
||||
@@ -117,7 +117,6 @@ class PostsController < ApplicationController
|
||||
head :no_content
|
||||
end
|
||||
|
||||
# PATCH/PUT /posts/1
|
||||
def update
|
||||
return head :unauthorized unless current_user
|
||||
return head :forbidden unless current_user.member?
|
||||
@@ -153,7 +152,7 @@ class PostsController < ApplicationController
|
||||
|
||||
pts = PostTag.with_discarded
|
||||
pts = pts.where(post_id: id) if id.present?
|
||||
pts = pts.includes(:post, :tag, :created_user, :deleted_user)
|
||||
pts = pts.includes(:post, { tag: :tag_name }, :created_user, :deleted_user)
|
||||
|
||||
events = []
|
||||
pts.each do |pt|
|
||||
@@ -192,15 +191,15 @@ class PostsController < ApplicationController
|
||||
end
|
||||
|
||||
def filter_posts_by_tags tag_names, match_type
|
||||
posts = Post.joins(:tags)
|
||||
posts = Post.joins(tags: :tag_name)
|
||||
|
||||
if match_type == 'any'
|
||||
posts = posts.where(tags: { name: tag_names }).distinct
|
||||
posts.where(tag_names: { name: tag_names }).distinct
|
||||
else
|
||||
tag_names.each do |tag|
|
||||
posts = posts.where(id: Post.joins(:tags).where(tags: { name: tag }))
|
||||
end
|
||||
posts.where(tag_names: { name: tag_names })
|
||||
.group('posts.id')
|
||||
.having('COUNT(DISTINCT tag_names.id) = ?', tag_names.uniq.size)
|
||||
end
|
||||
posts.distinct
|
||||
end
|
||||
|
||||
def sync_post_tags! post, desired_tags
|
||||
@@ -251,7 +250,8 @@ class PostsController < ApplicationController
|
||||
return nil unless tag
|
||||
|
||||
if path.include?(tag_id)
|
||||
return tag.as_json(only: [:id, :name, :category, :post_count]).merge(children: [])
|
||||
return tag.as_json(only: [:id, :category, :post_count],
|
||||
methods: [:name]).merge(children: [])
|
||||
end
|
||||
|
||||
if memo.key?(tag_id)
|
||||
@@ -263,7 +263,8 @@ class PostsController < ApplicationController
|
||||
|
||||
children = child_ids.filter_map { |cid| build_node.(cid, new_path) }
|
||||
|
||||
memo[tag_id] = tag.as_json(only: [:id, :name, :category, :post_count]).merge(children:)
|
||||
memo[tag_id] = tag.as_json(only: [:id, :category, :post_count],
|
||||
methods: [:name]).merge(children:)
|
||||
end
|
||||
|
||||
root_ids.filter_map { |id| build_node.call(id, []) }
|
||||
|
||||
@@ -1,33 +1,39 @@
|
||||
class TagsController < ApplicationController
|
||||
def index
|
||||
post_id = params[:post]
|
||||
tags = if post_id.present?
|
||||
Tag.joins(:posts).where(posts: { id: post_id })
|
||||
else
|
||||
Tag.all
|
||||
end
|
||||
render json: tags
|
||||
|
||||
tags =
|
||||
if post_id.present?
|
||||
Tag.joins(:posts).where(posts: { id: post_id })
|
||||
else
|
||||
Tag.all
|
||||
end
|
||||
|
||||
render json: tags.includes(:tag_name)
|
||||
end
|
||||
|
||||
def autocomplete
|
||||
q = params[:q].to_s.strip
|
||||
return render json: [] if q.blank?
|
||||
|
||||
tags = (Tag
|
||||
.where('(category = ? AND name LIKE ?) OR name LIKE ?',
|
||||
tags = (Tag.joins(:tag_name).includes(:tag_name)
|
||||
.where('(tags.category = ? AND tag_names.name LIKE ?) OR tag_names.name LIKE ?',
|
||||
'nico', "nico:#{ q }%", "#{ q }%")
|
||||
.order('post_count DESC, name ASC')
|
||||
.order(Arel.sql('post_count DESC, tag_names.name ASC'))
|
||||
.limit(20))
|
||||
render json: tags
|
||||
end
|
||||
|
||||
def show
|
||||
tag = Tag.find(params[:id])
|
||||
tag = Tag.find_by(id: params[:id])
|
||||
render json: tag
|
||||
end
|
||||
|
||||
def show_by_name
|
||||
tag = Tag.find_by(name: params[:name])
|
||||
name = params[:name].to_s.strip
|
||||
return head :bad_request if name.blank?
|
||||
|
||||
tag = Tag.joins(:tag_name).includes(:tag_name).find_by(tag_names: { name: })
|
||||
if tag
|
||||
render json: tag
|
||||
else
|
||||
|
||||
@@ -6,15 +6,19 @@ class WikiPagesController < ApplicationController
|
||||
end
|
||||
|
||||
def show
|
||||
render_wiki_page_or_404 WikiPage.find(params[:id])
|
||||
render_wiki_page_or_404 WikiPage.includes(:tag_name).find_by(id: params[:id])
|
||||
end
|
||||
|
||||
def show_by_title
|
||||
render_wiki_page_or_404 WikiPage.find_by(title: params[:title])
|
||||
title = params[:title].to_s.strip
|
||||
page = WikiPage.joins(:tag_name)
|
||||
.includes(:tag_name)
|
||||
.find_by(tag_names: { name: title })
|
||||
render_wiki_page_or_404 page
|
||||
end
|
||||
|
||||
def exists
|
||||
if WikiPage.exists?(params[:id])
|
||||
if WikiPage.exists?(id: params[:id])
|
||||
head :no_content
|
||||
else
|
||||
head :not_found
|
||||
@@ -22,7 +26,8 @@ class WikiPagesController < ApplicationController
|
||||
end
|
||||
|
||||
def exists_by_title
|
||||
if WikiPage.exists?(title: params[:title])
|
||||
title = params[:title].to_s.strip
|
||||
if WikiPage.joins(:tag_name).exists?(tag_names: { name: title })
|
||||
head :no_content
|
||||
else
|
||||
head :not_found
|
||||
@@ -115,11 +120,11 @@ class WikiPagesController < ApplicationController
|
||||
end
|
||||
|
||||
def search
|
||||
title = params[:title]&.strip
|
||||
title = params[:title].to_s.strip
|
||||
|
||||
q = WikiPage.all
|
||||
q = WikiPage.joins(:tag_name).includes(:tag_name)
|
||||
if title.present?
|
||||
q = q.where('title LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%")
|
||||
q = q.where('tag_names.name LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%")
|
||||
end
|
||||
|
||||
render json: q.limit(20)
|
||||
|
||||
Reference in New Issue
Block a user