このコミットが含まれているのは:
@@ -0,0 +1,19 @@
|
||||
class CreateEvents < ActiveRecord::Migration[8.0]
|
||||
def change
|
||||
create_table :events do |t|
|
||||
t.string :event_type, null: false, index: true
|
||||
t.text :reason
|
||||
t.references :reverted_from_event, foreign_key: { to_table: :events }
|
||||
t.json :metadata
|
||||
t.binary :ip_address, limit: 16, index: true
|
||||
t.references :created_by_user, index: true, foreign_key: false
|
||||
t.datetime :created_at, null: false, index: true
|
||||
end
|
||||
|
||||
add_reference :post_versions, :event, foreign_key: true, after: :original_created_before
|
||||
add_reference :tag_versions, :event, foreign_key: true, after: :deprecated_at
|
||||
add_reference :material_versions, :event, foreign_key: true
|
||||
add_reference :tag_description_versions, :event, foreign_key: true, after: :source_version_no
|
||||
add_reference :tag_group_versions, :event, foreign_key: true, after: :placements
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,207 @@
|
||||
class BackfillEventsFromExistingVersions < ActiveRecord::Migration[8.0]
|
||||
class MigrationEvent < ActiveRecord::Base
|
||||
self.table_name = 'events'
|
||||
end
|
||||
|
||||
class MigrationPostVersion < ActiveRecord::Base
|
||||
self.table_name = 'post_versions'
|
||||
end
|
||||
|
||||
class MigrationTagVersion < ActiveRecord::Base
|
||||
self.table_name = 'tag_versions'
|
||||
end
|
||||
|
||||
class MigrationMaterialVersion < ActiveRecord::Base
|
||||
self.table_name = 'material_versions'
|
||||
end
|
||||
|
||||
class MigrationTagDescriptionVersion < ActiveRecord::Base
|
||||
self.table_name = 'tag_description_versions'
|
||||
end
|
||||
|
||||
class MigrationTagGroupVersion < ActiveRecord::Base
|
||||
self.table_name = 'tag_group_versions'
|
||||
end
|
||||
|
||||
class MigrationLocale < ActiveRecord::Base
|
||||
self.table_name = 'locales'
|
||||
end
|
||||
|
||||
def up
|
||||
# create → posts.create
|
||||
# update → posts.update
|
||||
raise if MigrationPostVersion.where.not(event_type: ['create', 'update']).exists?
|
||||
|
||||
# create → materials.create
|
||||
# update → materials.update
|
||||
if MigrationMaterialVersion.where.not(event_type: ['create', 'update']).exists?
|
||||
raise
|
||||
end
|
||||
|
||||
# create → posts.create / posts.update / materials.create / materials.update / unknown
|
||||
# update → tags.update / locales.create
|
||||
# discard → unknown
|
||||
if MigrationTagVersion.where.not(event_type: ['create', 'update', 'discard']).exists?
|
||||
raise
|
||||
end
|
||||
|
||||
# create → tag_descriptions.create
|
||||
# update → tag_descriptions.update
|
||||
if MigrationTagDescriptionVersion.where.not(event_type: ['create', 'update']).exists?
|
||||
raise
|
||||
end
|
||||
|
||||
# create → tag_groups.create
|
||||
# update → tag_groups.update
|
||||
if MigrationTagGroupVersion.where.not(event_type: ['create', 'update']).exists?
|
||||
raise
|
||||
end
|
||||
|
||||
# post_versions の Backfill
|
||||
MigrationPostVersion.find_each do |pv|
|
||||
ev = MigrationEvent.create!(event_type: "posts.#{ pv.event_type }",
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: pv.created_by_user_id,
|
||||
created_at: pv.created_at)
|
||||
pv.update_columns(event_id: ev.id)
|
||||
end
|
||||
|
||||
# material_versions の Backfill
|
||||
MigrationMaterialVersion.find_each do |m|
|
||||
ev = MigrationEvent.create!(event_type: "materials.#{ m.event_type }",
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: m.created_by_user_id,
|
||||
created_at: m.created_at)
|
||||
m.update_columns(event_id: ev.id)
|
||||
end
|
||||
|
||||
# ロカール追加に伴ふ該当語言のタグ名称追加異動のみ分離
|
||||
ids_cause_of_locale_creation = []
|
||||
MigrationLocale.where('created_at > ?', MigrationLocale.minimum(:created_at)).find_each do |l|
|
||||
ev = MigrationEvent.create!(event_type: 'locales.create',
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: nil,
|
||||
created_at: l.created_at)
|
||||
|
||||
MigrationTagVersion
|
||||
.where('created_at > ?', l.created_at)
|
||||
.where(event_type: 'update', event_id: nil)
|
||||
.find_each do |t|
|
||||
next unless t.names.key?(l.language_code)
|
||||
|
||||
prev = MigrationTagVersion.find_by(tag_id: t.tag_id, version_no: t.version_no - 1)
|
||||
next if prev.nil? || prev.names.key?(l.language_code)
|
||||
|
||||
t.update_columns(event_id: ev.id)
|
||||
|
||||
ids_cause_of_locale_creation << t.id
|
||||
end
|
||||
|
||||
ev.destroy! unless MigrationTagVersion.where(event_id: ev.id).exists?
|
||||
end
|
||||
|
||||
# tag_versions の Backfill
|
||||
MigrationTagVersion.where.not(id: ids_cause_of_locale_creation).find_each do |t|
|
||||
ev =
|
||||
case t.event_type
|
||||
when 'create'
|
||||
post =
|
||||
MigrationPostVersion
|
||||
.where('JSON_CONTAINS(tags_json, ?) <> 0', { tag_id: t.tag_id }.to_json)
|
||||
.find_by(created_at: MigrationPostVersion
|
||||
.where('JSON_CONTAINS(tags_json, ?) <> 0',
|
||||
{ tag_id: t.tag_id }.to_json)
|
||||
.minimum(:created_at))
|
||||
material =
|
||||
MigrationMaterialVersion
|
||||
.where(tag_id: t.tag_id)
|
||||
.find_by(created_at: MigrationMaterialVersion
|
||||
.where(tag_id: t.tag_id)
|
||||
.minimum(:created_at))
|
||||
if post
|
||||
if material
|
||||
if post.created_at < material.created_at
|
||||
MigrationEvent.find(post.event_id)
|
||||
else
|
||||
MigrationEvent.find(material.event_id)
|
||||
end
|
||||
else
|
||||
MigrationEvent.find(post.event_id)
|
||||
end
|
||||
else
|
||||
if material
|
||||
MigrationEvent.find(material.event_id)
|
||||
else
|
||||
MigrationEvent.create!(event_type: 'unknown',
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: t.created_by_user_id,
|
||||
created_at: t.created_at)
|
||||
end
|
||||
end
|
||||
when 'update'
|
||||
MigrationEvent.create!(event_type: 'tags.update',
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: t.created_by_user_id,
|
||||
created_at: t.created_at)
|
||||
when 'discard'
|
||||
MigrationEvent.create!(event_type: 'unknown',
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: t.created_by_user_id,
|
||||
created_at: t.created_at)
|
||||
end
|
||||
t.update_columns(event_id: ev.id)
|
||||
end
|
||||
|
||||
# tag_description_versions の Backfill
|
||||
MigrationTagDescriptionVersion.find_each do |td|
|
||||
ev = MigrationEvent.create!(event_type: "tag_descriptions.#{ td.event_type }",
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: td.created_by_user_id,
|
||||
created_at: td.created_at)
|
||||
td.update_columns(event_id: ev.id)
|
||||
end
|
||||
|
||||
# tag_group_versions の Backfill
|
||||
MigrationTagGroupVersion.find_each do |tg|
|
||||
ev = MigrationEvent.create!(event_type: "tag_groups.#{ tg.event_type }",
|
||||
reason: nil,
|
||||
reverted_from_event_id: nil,
|
||||
metadata: nil,
|
||||
ip_address: nil,
|
||||
created_by_user_id: tg.created_by_user_id,
|
||||
created_at: tg.created_at)
|
||||
tg.update_columns(event_id: ev.id)
|
||||
end
|
||||
|
||||
change_column_null :post_versions, :event_id, false
|
||||
change_column_null :tag_versions, :event_id, false
|
||||
change_column_null :material_versions, :event_id, false
|
||||
change_column_null :tag_description_versions, :event_id, false
|
||||
change_column_null :tag_group_versions, :event_id, false
|
||||
end
|
||||
|
||||
def down
|
||||
raise ActiveRecord::IrreversibleMigration, '戻せません.'
|
||||
end
|
||||
end
|
||||
新しいイシューから参照
ユーザーをブロックする