diff --git a/backend/app/controllers/nico_tags_controller.rb b/backend/app/controllers/nico_tags_controller.rb index 973d70f..f0e33a4 100644 --- a/backend/app/controllers/nico_tags_controller.rb +++ b/backend/app/controllers/nico_tags_controller.rb @@ -38,7 +38,7 @@ class NicoTagsController < ApplicationController return head :bad_request if linked_tags.any? { |t| t.nico? } ApplicationRecord.transaction do - record_tag_snapshots!(linked_tags, created_by_user: current_user) + TagVersioning.record_tag_snapshots!(linked_tags, created_by_user: current_user) tag.linked_tags = linked_tags tag.save! @@ -48,13 +48,4 @@ class NicoTagsController < ApplicationController render json: tag.linked_tags.map { |t| TagRepr.base(t) }, status: :ok end - - private - - def record_tag_snapshots! tags, created_by_user: - tags.each do |tag| - event_type = tag.tag_versions.exists? ? :update : :create - TagVersionRecorder.record!(tag:, event_type:, created_by_user:) - end - end end diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index 03e2d8a..300392a 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -131,7 +131,7 @@ class PostsController < ApplicationController ApplicationRecord.transaction do post.save! tags = Tag.normalise_tags(tag_names) - record_tag_snapshots!(tags, created_by_user: current_user) + TagVersioning.record_tag_snapshots!(tags, created_by_user: current_user) tags = Tag.expand_parent_tags(tags) sync_post_tags!(post, tags) @@ -175,10 +175,10 @@ class PostsController < ApplicationController ApplicationRecord.transaction do post.update!(title:, original_created_from:, original_created_before:) - normalised_tag = Tag.normalise_tags(tag_names, with_tagme: false) - record_tag_snapshots(normalised_tags, create_by_user: current_user) + normalised_tags = Tag.normalise_tags(tag_names, with_tagme: false) + TagVersioning.record_tag_snapshots!(normalised_tags, created_by_user: current_user) - tags = post.tags.where(category: 'nico').to_a + normalised_tags + tags = post.tags.nico.to_a + normalised_tags tags = Tag.expand_parent_tags(tags) sync_post_tags!(post, tags) PostVersionRecorder.record!(post:, event_type: :update, created_by_user: current_user) diff --git a/backend/app/controllers/tags_controller.rb b/backend/app/controllers/tags_controller.rb index 71b7309..9b23fd1 100644 --- a/backend/app/controllers/tags_controller.rb +++ b/backend/app/controllers/tags_controller.rb @@ -218,21 +218,14 @@ class TagsController < ApplicationController tag = Tag.find(params[:id]) - ApplicationRecord.transaction do - old_nico = tag.nico? - - if category.present? - new_nico = category == 'nico' - - if old_nico != new_nico - return render json: { error: 'ニコタグのカテゴリ変更はできません.' }, - status: :unprocessable_entity - end - end + if category.present? && tag.nico? != (category == 'nico') + return render json: { error: 'ニコタグのカテゴリ変更はできません.' }, + status: :unprocessable_entity + end + ApplicationRecord.transaction do tag.tag_name.update!(name:) if name.present? tag.update!(category:) if category.present? - record_tag_version!(tag, event_type: :update, created_by_user: current_user) end diff --git a/backend/app/models/nico_tag_version.rb b/backend/app/models/nico_tag_version.rb new file mode 100644 index 0000000..b57252a --- /dev/null +++ b/backend/app/models/nico_tag_version.rb @@ -0,0 +1,7 @@ +class NicoTagVersion < ApplicationRecord + include VersionRecord + + belongs_to :tag + + validates :name, presence: true +end diff --git a/backend/app/models/tag.rb b/backend/app/models/tag.rb index 8ac0f33..3730b1e 100644 --- a/backend/app/models/tag.rb +++ b/backend/app/models/tag.rb @@ -157,7 +157,6 @@ class Tag < ApplicationRecord target_tag => Tag affected_post_ids = Set.new - affected_tag_ids = Set.new Tag.transaction do Array(source_tags).compact.uniq.each do |source_tag| @@ -181,7 +180,7 @@ class Tag < ApplicationRecord end source_tag.discard! - record_tag_discard!(source_tag, current_by_user: nil) + TagVersioning.record!(source_tag, event_type: :discard, created_by_user:) if source_tag.nico? source_tag_name.discard! @@ -190,7 +189,7 @@ class Tag < ApplicationRecord updated_at: Time.current) end - record_tag_version!(target_tag, event_type: :update, created_by_user: nil) + TagVersioning.record!(target_tag, event_type: :update, created_by_user:) end Post.where(id: affected_post_ids.to_a).find_each do |post| diff --git a/backend/app/models/tag_name.rb b/backend/app/models/tag_name.rb index b118300..de79d10 100644 --- a/backend/app/models/tag_name.rb +++ b/backend/app/models/tag_name.rb @@ -1,8 +1,6 @@ class TagName < ApplicationRecord include MyDiscard - default_scope -> { kept } - has_one :tag has_one :wiki_page diff --git a/backend/app/models/tag_version.rb b/backend/app/models/tag_version.rb index c15933e..6ca5d0a 100644 --- a/backend/app/models/tag_version.rb +++ b/backend/app/models/tag_version.rb @@ -8,8 +8,7 @@ class TagVersion < ApplicationRecord character: 'character', general: 'general', material: 'material', - meta: 'meta', - nico: 'nico' }, validate: true + meta: 'meta' }, validate: true validates :name, presence: true validates :category, presence: true diff --git a/backend/app/services/nico_tag_version_recorder.rb b/backend/app/services/nico_tag_version_recorder.rb index 07a5c63..09f953e 100644 --- a/backend/app/services/nico_tag_version_recorder.rb +++ b/backend/app/services/nico_tag_version_recorder.rb @@ -12,5 +12,8 @@ class NicoTagVersionRecorder < VersionRecorder def version_class = NicoTagVersion def version_association = :nico_tag_versions def record_key = :tag - def snapshot_attributes = { name: @tag.name, linked_tags: @tag.snapshot_linked_tags.join(' ') } + + def snapshot_attributes + { name: @record.name, linked_tags: @record.snapshot_linked_tags.join(' ') } + end end diff --git a/backend/app/services/post_version_recorder.rb b/backend/app/services/post_version_recorder.rb index 87e267e..589e6d8 100644 --- a/backend/app/services/post_version_recorder.rb +++ b/backend/app/services/post_version_recorder.rb @@ -1,4 +1,4 @@ -class PostVersionRecorder +class PostVersionRecorder < VersionRecorder def self.record! post:, event_type:, created_by_user: new(post:, event_type:, created_by_user:).record! end @@ -14,12 +14,12 @@ class PostVersionRecorder def record_key = :post def snapshot_attributes - { title: @post.title, - url: @post.url, - thumbnail_base: @post.thumbnail_base, - tags: @post.snapshot_tag_names.join(' '), - parent: @post.parent, - original_created_from: @post.original_created_from, - original_created_before: @post.original_created_before } + { title: @record.title, + url: @record.url, + thumbnail_base: @record.thumbnail_base, + tags: @record.snapshot_tag_names.join(' '), + parent: @record.parent, + original_created_from: @record.original_created_from, + original_created_before: @record.original_created_before } end end diff --git a/backend/app/services/tag_version_recorder.rb b/backend/app/services/tag_version_recorder.rb index b979462..fe2b0c1 100644 --- a/backend/app/services/tag_version_recorder.rb +++ b/backend/app/services/tag_version_recorder.rb @@ -14,9 +14,9 @@ class TagVersionRecorder < VersionRecorder def record_key = :tag def snapshot_attributes - { name: @tag.name, - category: @tag.category, - aliases: @tag.snapshot_aliases.join(' '), - parent_tag_ids: @tag.snapshot_parent_tag_ids.join(' ') } + { name: @record.name, + category: @record.category, + aliases: @record.snapshot_aliases.join(' '), + parent_tag_ids: @record.snapshot_parent_tag_ids.join(' ') } end end diff --git a/backend/app/services/tag_versioning.rb b/backend/app/services/tag_versioning.rb new file mode 100644 index 0000000..713cfeb --- /dev/null +++ b/backend/app/services/tag_versioning.rb @@ -0,0 +1,26 @@ +class TagVersioning + def self.record! tag, event_type:, created_by_user: + if tag.nico? + NicoTagVersionRecorder.record!(tag:, event_type:, created_by_user:) + else + TagVersionRecorder.record!(tag:, event_type:, created_by_user:) + end + end + + def self.record_tag_snapshot! tag, created_by_user: + event_type = + if tag.nico? + tag.nico_tag_versions.exists? ? :update : :create + else + tag.tag_versions.exists? ? :update : :create + end + + record!(tag, event_type:, created_by_user:) + end + + def self.record_tag_snapshots! tags, created_by_user: + tags.each do |tag| + record_tag_snapshot!(tag, created_by_user:) + end + end +end diff --git a/backend/app/services/version_recorder.rb b/backend/app/services/version_recorder.rb index 5368313..3e1dc5c 100644 --- a/backend/app/services/version_recorder.rb +++ b/backend/app/services/version_recorder.rb @@ -9,7 +9,7 @@ class VersionRecorder validate_event_type! end - def record! record, event_type:, created_by_user: + def record! @record.with_lock do latest = latest_version