#241 Co-authored-by: miteruzo <miteruzo@naver.com> Reviewed-on: https://git.miteruzo.com/miteruzo/btrc-hub/pulls/267main
| @@ -1,6 +1,4 @@ | |||
| class NicoTagsController < ApplicationController | |||
| TAG_JSON = { only: [:id, :category, :post_count], methods: [:name, :has_wiki] }.freeze | |||
| def index | |||
| limit = (params[:limit] || 20).to_i | |||
| cursor = params[:cursor].presence | |||
| @@ -19,8 +17,8 @@ class NicoTagsController < ApplicationController | |||
| end | |||
| render json: { tags: tags.map { |tag| | |||
| tag.as_json(TAG_JSON).merge(linked_tags: tag.linked_tags.map { |lt| | |||
| lt.as_json(TAG_JSON) | |||
| TagRepr.base(tag).merge(linked_tags: tag.linked_tags.map { |lt| | |||
| TagRepr.base(lt) | |||
| }) | |||
| }, next_cursor: } | |||
| end | |||
| @@ -41,6 +39,6 @@ class NicoTagsController < ApplicationController | |||
| tag.linked_tags = linked_tags | |||
| tag.save! | |||
| render json: tag.linked_tags.map { |t| t.as_json(TAG_JSON) }, status: :ok | |||
| render json: tag.linked_tags.map { |t| TagRepr.base(t) }, status: :ok | |||
| end | |||
| end | |||
| @@ -36,8 +36,7 @@ class PostsController < ApplicationController | |||
| end | |||
| render json: { posts: posts.map { |post| | |||
| post.as_json(include: { tags: { only: [:id, :category, :post_count], | |||
| methods: [:name, :has_wiki] } }).tap do |json| | |||
| PostRepr.base(post).tap do |json| | |||
| json['thumbnail'] = | |||
| if post.thumbnail.attached? | |||
| rails_storage_proxy_url(post.thumbnail, only_path: false) | |||
| @@ -60,10 +59,7 @@ class PostsController < ApplicationController | |||
| viewed = current_user&.viewed?(post) || false | |||
| render json: (post | |||
| .as_json(include: { tags: { only: [:id, :category, :post_count], | |||
| methods: [:name, :has_wiki] } }) | |||
| .merge(viewed:)) | |||
| render json: PostRepr.base(post).merge(viewed:) | |||
| end | |||
| def show | |||
| @@ -102,9 +98,7 @@ class PostsController < ApplicationController | |||
| sync_post_tags!(post, tags) | |||
| post.reload | |||
| render json: post.as_json(include: { tags: { only: [:id, :category, :post_count], | |||
| methods: [:name, :has_wiki] } }), | |||
| status: :created | |||
| render json: PostRepr.base(post), status: :created | |||
| else | |||
| render json: { errors: post.errors.full_messages }, status: :unprocessable_entity | |||
| end | |||
| @@ -170,7 +164,7 @@ class PostsController < ApplicationController | |||
| events = [] | |||
| pts.each do |pt| | |||
| tag = pt.tag.as_json(only: [:id, :category], methods: [:name, :has_wiki]) | |||
| tag = TagRepr.base(pt.tag) | |||
| post = pt.post | |||
| events << Event.new( | |||
| @@ -269,8 +263,7 @@ class PostsController < ApplicationController | |||
| return nil unless tag | |||
| if path.include?(tag_id) | |||
| return tag.as_json(only: [:id, :category, :post_count], | |||
| methods: [:name, :has_wiki]).merge(children: []) | |||
| return TagRepr.base(tag).merge(children: []) | |||
| end | |||
| if memo.key?(tag_id) | |||
| @@ -282,8 +275,7 @@ class PostsController < ApplicationController | |||
| children = child_ids.filter_map { |cid| build_node.(cid, new_path) } | |||
| memo[tag_id] = tag.as_json(only: [:id, :category, :post_count], | |||
| methods: [:name, :has_wiki]).merge(children:) | |||
| memo[tag_id] = TagRepr.base(tag).merge(children:) | |||
| end | |||
| root_ids.filter_map { |id| build_node.call(id, []) } | |||
| @@ -13,7 +13,7 @@ class TagsController < ApplicationController | |||
| tags = tags.where(posts: { id: post_id }) | |||
| end | |||
| render json: tags.as_json(only: [:id, :category, :post_count], methods: [:name, :has_wiki]) | |||
| render json: TagRepr.base(tags) | |||
| end | |||
| def autocomplete | |||
| @@ -57,8 +57,7 @@ class TagsController < ApplicationController | |||
| tags = tags.order(Arel.sql('post_count DESC, tag_names.name')).limit(20).to_a | |||
| render json: tags.map { |tag| | |||
| tag.as_json(only: [:id, :category, :post_count], methods: [:name, :has_wiki]) | |||
| .merge(matched_alias: matched_alias_by_tag_name_id[tag.tag_name_id]) | |||
| TagRepr.base(tag).merge(matched_alias: matched_alias_by_tag_name_id[tag.tag_name_id]) | |||
| } | |||
| end | |||
| @@ -67,7 +66,7 @@ class TagsController < ApplicationController | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| .find_by(id: params[:id]) | |||
| if tag | |||
| render json: tag.as_json(only: [:id, :category, :post_count], methods: [:name, :has_wiki]) | |||
| render json: TagRepr.base(tag) | |||
| else | |||
| head :not_found | |||
| end | |||
| @@ -81,7 +80,7 @@ class TagsController < ApplicationController | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| .find_by(tag_names: { name: }) | |||
| if tag | |||
| render json: tag.as_json(only: [:id, :category, :post_count], methods: [:name, :has_wiki]) | |||
| render json: TagRepr.base(tag) | |||
| else | |||
| head :not_found | |||
| end | |||
| @@ -104,6 +103,6 @@ class TagsController < ApplicationController | |||
| tag.update!(category:) | |||
| end | |||
| render json: tag.as_json(methods: [:name]) | |||
| render json: TagRepr.base(tag) | |||
| end | |||
| end | |||
| @@ -4,14 +4,12 @@ class WikiPagesController < ApplicationController | |||
| def index | |||
| title = params[:title].to_s.strip | |||
| if title.blank? | |||
| return render json: WikiPage.joins(:tag_name) | |||
| .includes(:tag_name) | |||
| .as_json(methods: [:title]) | |||
| return render json: WikiPageRepr.base(WikiPage.joins(:tag_name).includes(:tag_name)) | |||
| end | |||
| q = WikiPage.joins(:tag_name).includes(:tag_name) | |||
| .where('tag_names.name LIKE ?', "%#{ WikiPage.sanitize_sql_like(title) }%") | |||
| render json: q.limit(20).as_json(methods: [:title]) | |||
| render json: WikiPageRepr.base(q.limit(20)) | |||
| end | |||
| def show | |||
| @@ -98,7 +96,7 @@ class WikiPagesController < ApplicationController | |||
| message = params[:message].presence | |||
| Wiki::Commit.content!(page:, body:, created_user: current_user, message:) | |||
| render json: page.as_json(methods: [:title]), status: :created | |||
| render json: WikiPageRepr.base(page), status: :created | |||
| else | |||
| render json: { errors: page.errors.full_messages }, | |||
| status: :unprocessable_entity | |||
| @@ -174,8 +172,7 @@ class WikiPagesController < ApplicationController | |||
| succ = page.succ_revision_id(revision_id) | |||
| updated_at = rev.created_at | |||
| render json: page.as_json(methods: [:title]) | |||
| .merge(body:, revision_id:, pred:, succ:, updated_at:) | |||
| render json: WikiPageRepr.base(page).merge(body:, revision_id:, pred:, succ:, updated_at:) | |||
| end | |||
| def find_revision page | |||
| @@ -0,0 +1,16 @@ | |||
| # frozen_string_literal: true | |||
| module WikiPageRepr | |||
| BASE = { methods: [:title] }.freeze | |||
| module_function | |||
| def base wiki_page | |||
| wiki_page.as_json(BASE) | |||
| end | |||
| def many wiki_pages | |||
| wiki_pages.map { |p| base(p) } | |||
| end | |||
| end | |||
| @@ -0,0 +1,16 @@ | |||
| # frozen_string_literal: true | |||
| module PostRepr | |||
| BASE = { include: { tags: TagRepr::BASE } }.freeze | |||
| module_function | |||
| def base post | |||
| post.as_json(BASE) | |||
| end | |||
| def many posts | |||
| posts.map { |p| base(p) } | |||
| end | |||
| end | |||
| @@ -0,0 +1,16 @@ | |||
| # frozen_string_literal: true | |||
| module TagRepr | |||
| BASE = { only: [:id, :category, :post_count], methods: [:name, :has_wiki] }.freeze | |||
| module_function | |||
| def base tag | |||
| tag.as_json(BASE) | |||
| end | |||
| def many tags | |||
| tags.map { |t| base(t) } | |||
| end | |||
| end | |||