diff --git a/backend/app/controllers/nico_tags_controller.rb b/backend/app/controllers/nico_tags_controller.rb index ca9a5b1..c897fe0 100644 --- a/backend/app/controllers/nico_tags_controller.rb +++ b/backend/app/controllers/nico_tags_controller.rb @@ -24,7 +24,12 @@ class NicoTagsController < ApplicationController ExternalTag .joins("LEFT JOIN (#{ post_tag_max_sql }) post_tag_max " \ 'ON post_tag_max.external_tag_id = external_tags.id') - q = q.where('external_tags.name LIKE ?', "%#{ name }%") if name + if name + q = q.where(('external_tags.name LIKE ? ' + + "OR CONCAT(external_tags.platform, ':', external_tags.name) LIKE ?"), + "%#{ name }%", "%#{ name }") + end + if linked_tag linked_tag_ids = Tag @@ -108,7 +113,10 @@ class NicoTagsController < ApplicationController updated_at: tag.created_at, deprecated_at: nil, aliases: [], - parents: [] } + parents: [], + has_wiki: false, + material_id: nil, + has_deerjikists: false } end def render_nico_tag_form_record_invalid record diff --git a/backend/app/controllers/post_versions_controller.rb b/backend/app/controllers/post_versions_controller.rb index 5d8d657..811227b 100644 --- a/backend/app/controllers/post_versions_controller.rb +++ b/backend/app/controllers/post_versions_controller.rb @@ -2,6 +2,9 @@ class PostVersionsController < ApplicationController def index post_id = params[:post].presence tag_id = params[:tag].presence&.to_i + external_tag_id = params[:external_tag].presence&.to_i + return head :bad_request if tag_id && external_tag_id + page = (params[:page].presence || 1).to_i limit = (params[:limit].presence || 20).to_i @@ -26,7 +29,12 @@ class PostVersionsController < ApplicationController 'prev.original_created_from AS prev_original_created_from', 'prev.original_created_before AS prev_original_created_before') q = q.where('post_versions.post_id = ?', post_id) if post_id - if tag_id + if external_tag_id || (tag_id && !(Tag.exists?(id: tag_id))) + q = q.where('JSON_CONTAINS(post_versions.tags_json,' + + "JSON_OBJECT('external_tag_id', #{ external_tag_id })) " + + 'OR JSON_CONTAINS(prev.tags_json,' + + "JSON_OBJECT('external_tag_id', #{ external_tag_id }))") + elsif tag_id q = q.where("JSON_CONTAINS(post_versions.tags_json, JSON_OBJECT('tag_id', #{ tag_id })) " + "OR JSON_CONTAINS(prev.tags_json, JSON_OBJECT('tag_id', #{ tag_id }))") end diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index daa68b2..e2e109d 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -505,7 +505,10 @@ class PostsController < ApplicationController memo[tag_id] = TagRepr.inline(tag).merge(children:, sections:) end - root_ids.filter_map { |id| build_node.call(id, []) } + internal_tags = root_ids.filter_map { |id| build_node.call(id, []) } + external_tags = + post.external_tags.map { ExternalTagRepr.inline(_1).merge(children: [], sections: []) } + internal_tags + external_tags end def sibling_posts_by_parent parent_post_ids diff --git a/backend/app/representations/external_tag_repr.rb b/backend/app/representations/external_tag_repr.rb new file mode 100644 index 0000000..d7e94f8 --- /dev/null +++ b/backend/app/representations/external_tag_repr.rb @@ -0,0 +1,20 @@ +module ExternalTagRepr + module_function + + def base tag + { 'id' => tag.id, + 'name' => "#{ tag.platform }:#{ tag.name }", + 'category' => 'nico', + 'post_count' => tag.post_count, + 'created_at' => tag.created_at, + 'updated_at' => tag.created_at, + 'deprecated_at' => nil, + 'aliases' => [], + 'parents' => [], + 'has_wiki' => false, + 'material_id' => nil, + 'has_deerjikists' => false } + end + + def inline(tag) = base(tag) +end diff --git a/backend/app/representations/post_repr.rb b/backend/app/representations/post_repr.rb index 79a1b1d..01206e4 100644 --- a/backend/app/representations/post_repr.rb +++ b/backend/app/representations/post_repr.rb @@ -87,15 +87,24 @@ module PostRepr end def tag_json post - post + internal_tags = + post .post_tags .reject { _1.tag.deprecated? } .sort_by { _1.tag.name } - .map do |post_tag| - TagRepr.inline(post_tag.tag).merge( - 'children' => [], - 'sections' => post_tag.sections.as_json(only: [:begin_ms, :end_ms])) - end + .map { |post_tag| + TagRepr.inline(post_tag.tag).merge( + 'children' => [], + 'sections' => post_tag.sections.as_json(only: [:begin_ms, :end_ms])) + } + + external_tags = + post + .external_tags + .sort_by { _1.name } + .map { ExternalTagRepr.base(_1).merge('children' => [], 'sections' => []) } + + internal_tags + external_tags end def thumbnail_url post, host: nil