This commit is contained in:
2026-04-26 20:53:20 +09:00
parent 5f0c1953ce
commit d2eb69d3b0
6 changed files with 147 additions and 193 deletions
+25 -9
View File
@@ -249,7 +249,10 @@ class TagsController < ApplicationController
update_parent_tags!(tag, parent_names)
tag.reload
record_tag_version!(tag, event_type: :update, created_by_user: current_user)
record_tag_version!(tag,
event_type: :update,
created_by_user: current_user,
name_changed: name.present? && name != old_name)
end
render json: TagRepr.base(tag.reload)
@@ -272,10 +275,19 @@ class TagsController < ApplicationController
ApplicationRecord.transaction do
TagVersioning.ensure_snapshot!(tag, created_by_user: current_user)
old_name = tag.name
name_changed = name.present? && name != old_name
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)
tag.reload
record_tag_version!(
tag,
event_type: :update,
created_by_user: current_user,
name_changed:)
end
render json: TagRepr.base(tag.reload)
@@ -297,16 +309,20 @@ class TagsController < ApplicationController
material: material.as_json&.merge(file:, content_type:))
end
def record_tag_version! tag, event_type:, created_by_user:
def record_tag_version! tag, event_type:, created_by_user:, name_changed: false
if tag.nico?
NicoTagVersionRecorder.record!(tag:, event_type:, created_by_user:)
else
TagVersionRecorder.record!(tag:, event_type:, created_by_user:)
wiki_page = tag.tag_name.wiki_page
if wiki_page&.wiki_versions&.exists?
WikiVersionRecorder.record!(page: wiki_page, event_type: :update, created_by_user:)
end
return
end
TagVersionRecorder.record!(tag:, event_type:, created_by_user:)
return unless name_changed
wiki_page = tag.tag_name.wiki_page
return unless wiki_page&.wiki_versions&.exists?
WikiVersionRecorder.record!(page: wiki_page, event_type: :update, created_by_user:)
end
def update_aliases! tag, alias_names
@@ -85,22 +85,24 @@ class WikiPagesController < ApplicationController
return head :unauthorized unless current_user
return head :forbidden unless current_user.gte_member?
name = params[:title]&.strip
title = params[:title].to_s.strip
body = params[:body].to_s
message = params[:message].presence
return head :unprocessable_entity if name.blank? || body.blank?
return head :unprocessable_entity if title.blank? || body.blank?
tag_name = TagName.find_undiscard_or_create_by!(name:)
page = WikiPage.new(tag_name:, body:, created_user: current_user, updated_user: current_user)
if page.save
message = params[:message].presence
Wiki::Commit.content!(page:, body:, created_user: current_user, message:)
tag_name = TagName.find_undiscard_or_create_by!(name: title)
render json: WikiPageRepr.base(page), status: :created
else
render json: { errors: page.errors.full_messages },
status: :unprocessable_entity
end
page =
Wiki::Commit.create_content!(
tag_name:,
body:,
created_by_user: current_user,
message:)
render json: WikiPageRepr.base(page), status: :created
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
head :unprocessable_entity
end
def update
@@ -113,28 +115,32 @@ class WikiPagesController < ApplicationController
return head :unprocessable_entity if title.blank? || body.blank?
page = WikiPage.find(params[:id])
base_revision_id = page.current_revision.id
base_revision_id = params[:base_revision_id].presence
old_title = page.title
ApplicationRecord.transaction do
page.lock!
tag = Tag.find_by(tag_name_id: page.tag_name_id)
old_title = page.title
if tag && title != old_title
TagVersioning.ensure_snapshot!(tag, created_by_user: current_user)
end
tag = Tag.find_by(tag_name_id: page.tag_name_id)
page.tag_name.update!(name: title) if title != old_title
if tag && title != old_title
TagVersioning.ensure_snapshot!(tag, created_by_user: current_user)
end
message = params[:message].presence
Wiki::Commit.content!(page:,
body:,
created_user: current_user,
message:,
base_revision_id:)
page.tag_name.update!(name: title) if title != old_title
if tag && title != old_title
tag.reload
TagVersionRecorder.record!(tag:, event_type: :update, created_by_user: current_user)
message = params[:message].presence
Wiki::Commit.content!(page:,
body:,
created_user: current_user,
message:,
base_revision_id:)
if tag && title != old_title
tag.reload
TagVersionRecorder.record!(tag:, event_type: :update, created_by_user: current_user)
end
end
head :ok
+10 -7
View File
@@ -117,18 +117,21 @@ module Wiki
id_by_sha = WikiLine.where(sha256: line_shas).pluck(:sha256, :id).to_h
missing_rows = []
missing_by_sha = { }
line_shas.each_with_index do |sha, i|
next if id_by_sha.key?(sha)
next if missing_by_sha.key?(sha)
missing_rows << { sha256: sha,
body: lines[i],
created_at: now,
updated_at: now }
missing_by_sha[sha] = {
sha256: sha,
body: lines[i],
created_at: now,
updated_at: now }
end
if missing_rows.any?
WikiLine.upsert_all(missing_rows)
if missing_by_sha.any?
WikiLine.upsert_all(missing_by_sha.values)
id_by_sha = WikiLine.where(sha256: line_shas).pluck(:sha256, :id).to_h
end
@@ -1,6 +1,6 @@
class WikiVersionRecorder < VersionRecorder
def self.record! page:, event_type:, reason: nil, created_by_user:
new(page:, event_type:, created_by_user:).record!
new(page:, event_type:, reason:, created_by_user:).record!
end
def initialize page:, event_type:, reason: nil, created_by_user: