Add migrations

This adds migrations and data migrations for the awakening update.

* A new `Awakenings` table now exists that stores all possible awakenings, with a column for object type.
* GridCharacter and GridWeapon now have `awakening_id` and `awakening_level` fields. Their `awakening` and `awakening_type` fields were removed.
* Weapons have a mapping table, `WeaponAwakenings`, as not all weapons can be awakened.
* Data migrations are included to migrate existing user data. They should be run automatically when the migration is run with `rails db:migrate:with_data`
This commit is contained in:
Justin Edmund 2023-06-18 22:58:03 -07:00
parent 7f11be9d3c
commit 91d4f170da
17 changed files with 165 additions and 47 deletions

View file

@ -0,0 +1,16 @@
# frozen_string_literal: true
module Api
module V1
class AwakeningBlueprint < ApiBlueprint
field :name do |w|
{
en: w.name_en,
ja: w.name_jp
}
end
fields :slug, :object_type, :order
end
end
end

View file

@ -1,20 +0,0 @@
# frozen_string_literal: true
class MigrateAxTypeToAx < ActiveRecord::Migration[6.1]
def up
Weapon.all.each do |weapon|
if weapon.ax_type > 0
weapon.ax = true
elsif weapon.ax_type == 0
weapon.ax = false
weapon.ax_type = nil
end
weapon.save
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View file

@ -1,21 +0,0 @@
# frozen_string_literal: true
class SetFlbToFalseOnSummons < ActiveRecord::Migration[6.1]
def up
Summon.all.each do |summon|
if summon.flb.nil?
summon.flb = false
summon.save
end
if summon.ulb.nil?
summon.ulb = false
summon.save
end
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View file

@ -0,0 +1,28 @@
# frozen_string_literal: true
class MigrateAwakeningTypeToNewAwakeningType < ActiveRecord::Migration[7.0]
def up
GridWeapon.all.each do |weapon|
if weapon.awakening_type&.positive? && weapon.awakening_type <= 3
slug = if weapon.awakening_type == 1
'weapon-atk'
elsif weapon.awakening_type == 2
'weapon-def'
elsif weapon.awakening_type == 3
'weapon-special'
end
ap "#{weapon.weapon.name_en}: #{slug}"
new_awakening = Awakening.find_by(slug: slug)
weapon.awakening_id = new_awakening.id
ap weapon.awakening_id
weapon.save!
end
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View file

@ -0,0 +1,30 @@
# frozen_string_literal: true
class MigrateCharacterAwakeningTypeToNewAwakeningType < ActiveRecord::Migration[7.0]
def up
GridCharacter.all.each do |character|
slug = if character.awakening['type'] == 0
'character-balanced'
elsif character.awakening['type'] == 1
'character-atk'
elsif character.awakening['type'] == 2
'character-def'
elsif character.awakening['type'] == 3
'character-multi'
else
'character-balanced'
end
new_awakening = Awakening.find_by(slug: slug)
character.awakening_id = new_awakening.id
character.awakening_level = character.awakening['level']
character.save!(validate: false)
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View file

@ -1 +1 @@
DataMigrate::Data.define(version: 20230102235227) DataMigrate::Data.define(version: 20230619043726)

View file

@ -0,0 +1,10 @@
class AddAwakeningsTable < ActiveRecord::Migration[7.0]
def change
create_table :awakenings, id: :uuid, default: -> { "gen_random_uuid()" } do |t|
t.string :name_en, null: false
t.string :name_jp, null: false
t.string :slug, null: false
t.string :type, null: false
end
end
end

View file

@ -0,0 +1,8 @@
class CreateWeaponAwakeningsTable < ActiveRecord::Migration[7.0]
def change
create_table :weapon_awakenings, id: :uuid, default: -> { "gen_random_uuid()" } do |t|
t.references :weapon, null: false, foreign_key: true, type: :uuid
t.references :awakening, null: false, foreign_key: true, type: :uuid
end
end
end

View file

@ -0,0 +1,5 @@
class AddMaxAwakeningLevelToWeapons < ActiveRecord::Migration[7.0]
def change
add_column :weapons, :max_awakening_level, :integer
end
end

View file

@ -0,0 +1,5 @@
class AddOrderToAwakenings < ActiveRecord::Migration[7.0]
def change
add_column :awakenings, :order, :integer, null: false, default: 0
end
end

View file

@ -0,0 +1,5 @@
class RenameTypeToObjectTypeInAwakenings < ActiveRecord::Migration[7.0]
def change
rename_column :awakenings, :type, :object_type
end
end

View file

@ -0,0 +1,6 @@
class RemoveAwakeningFromWeapon < ActiveRecord::Migration[7.0]
def change
remove_column :weapons, :awakening, :boolean
remove_column :weapons, :awakening_types, :integer, array: true
end
end

View file

@ -0,0 +1,6 @@
class AddNewAwakeningTypeToGridWeapons < ActiveRecord::Migration[7.0]
def change
# Add a reference on grid_weapons to the awakenings table, which has a uuid id
add_reference :grid_weapons, :awakening, type: :uuid, foreign_key: { to_table: :awakenings }
end
end

View file

@ -0,0 +1,5 @@
class RemoveAwakeningTypeFromGridWeapon < ActiveRecord::Migration[7.0]
def change
remove_column :grid_weapons, :awakening_type, :integer
end
end

View file

@ -0,0 +1,6 @@
class AddNewAwakeningIdToGridCharacters < ActiveRecord::Migration[7.0]
def change
add_reference :grid_characters, :awakening, type: :uuid, foreign_key: { to_table: :awakenings }
add_column :grid_characters, :awakening_level, :integer, default: 1
end
end

View file

@ -0,0 +1,5 @@
class RemoveAwakeningFromGridCharacters < ActiveRecord::Migration[7.0]
def change
remove_column :grid_characters, :awakening, :jsonb
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do ActiveRecord::Schema[7.0].define(version: 2023_06_19_045651) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "btree_gin" enable_extension "btree_gin"
enable_extension "pg_trgm" enable_extension "pg_trgm"
@ -22,6 +22,14 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.string "version" t.string "version"
end end
create_table "awakenings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "name_en", null: false
t.string "name_jp", null: false
t.string "slug", null: false
t.string "object_type", null: false
t.integer "order", default: 0, null: false
end
create_table "character_charge_attacks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| create_table "character_charge_attacks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.uuid "character_id" t.uuid "character_id"
t.string "name_en", null: false t.string "name_en", null: false
@ -98,6 +106,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.index ["name_en"], name: "index_characters_on_name_en", opclass: :gin_trgm_ops, using: :gin t.index ["name_en"], name: "index_characters_on_name_en", opclass: :gin_trgm_ops, using: :gin
end end
create_table "data_migrations", primary_key: "version", id: :string, force: :cascade do |t|
end
create_table "effects", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| create_table "effects", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "name_en", null: false t.string "name_en", null: false
t.string "name_jp", null: false t.string "name_jp", null: false
@ -161,11 +172,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.jsonb "ring3", default: {"modifier"=>nil, "strength"=>nil}, null: false t.jsonb "ring3", default: {"modifier"=>nil, "strength"=>nil}, null: false
t.jsonb "ring4", default: {"modifier"=>nil, "strength"=>nil}, null: false t.jsonb "ring4", default: {"modifier"=>nil, "strength"=>nil}, null: false
t.jsonb "earring", default: {"modifier"=>nil, "strength"=>nil}, null: false t.jsonb "earring", default: {"modifier"=>nil, "strength"=>nil}, null: false
t.jsonb "awakening", default: {"type"=>1, "level"=>1}, null: false
t.boolean "skill0_enabled", default: true, null: false t.boolean "skill0_enabled", default: true, null: false
t.boolean "skill1_enabled", default: true, null: false t.boolean "skill1_enabled", default: true, null: false
t.boolean "skill2_enabled", default: true, null: false t.boolean "skill2_enabled", default: true, null: false
t.boolean "skill3_enabled", default: true, null: false t.boolean "skill3_enabled", default: true, null: false
t.uuid "awakening_id"
t.integer "awakening_level", default: 1
t.index ["awakening_id"], name: "index_grid_characters_on_awakening_id"
t.index ["character_id"], name: "index_grid_characters_on_character_id" t.index ["character_id"], name: "index_grid_characters_on_character_id"
t.index ["party_id"], name: "index_grid_characters_on_party_id" t.index ["party_id"], name: "index_grid_characters_on_party_id"
end end
@ -201,8 +214,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.integer "ax_modifier2" t.integer "ax_modifier2"
t.float "ax_strength2" t.float "ax_strength2"
t.integer "element" t.integer "element"
t.integer "awakening_type"
t.integer "awakening_level", default: 1, null: false t.integer "awakening_level", default: 1, null: false
t.uuid "awakening_id"
t.index ["awakening_id"], name: "index_grid_weapons_on_awakening_id"
t.index ["party_id"], name: "index_grid_weapons_on_party_id" t.index ["party_id"], name: "index_grid_weapons_on_party_id"
t.index ["weapon_id"], name: "index_grid_weapons_on_weapon_id" t.index ["weapon_id"], name: "index_grid_weapons_on_weapon_id"
t.index ["weapon_key1_id"], name: "index_grid_weapons_on_weapon_key1_id" t.index ["weapon_key1_id"], name: "index_grid_weapons_on_weapon_key1_id"
@ -424,6 +438,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.string "theme", default: "system", null: false t.string "theme", default: "system", null: false
end end
create_table "weapon_awakenings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.uuid "weapon_id", null: false
t.uuid "awakening_id", null: false
t.index ["awakening_id"], name: "index_weapon_awakenings_on_awakening_id"
t.index ["weapon_id"], name: "index_weapon_awakenings_on_weapon_id"
end
create_table "weapon_keys", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| create_table "weapon_keys", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "name_en" t.string "name_en"
t.string "name_jp" t.string "name_jp"
@ -457,23 +478,24 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
t.integer "max_atk_ulb" t.integer "max_atk_ulb"
t.boolean "extra", default: false, null: false t.boolean "extra", default: false, null: false
t.integer "ax_type" t.integer "ax_type"
t.boolean "awakening", default: true, null: false
t.boolean "limit", default: false, null: false t.boolean "limit", default: false, null: false
t.boolean "ax", default: false, null: false t.boolean "ax", default: false, null: false
t.integer "awakening_types", default: [], array: true
t.string "nicknames_en", default: [], null: false, array: true t.string "nicknames_en", default: [], null: false, array: true
t.string "nicknames_jp", default: [], null: false, array: true t.string "nicknames_jp", default: [], null: false, array: true
t.uuid "recruits_id" t.uuid "recruits_id"
t.integer "max_awakening_level"
t.index ["name_en"], name: "index_weapons_on_name_en", opclass: :gin_trgm_ops, using: :gin t.index ["name_en"], name: "index_weapons_on_name_en", opclass: :gin_trgm_ops, using: :gin
t.index ["recruits_id"], name: "index_weapons_on_recruits_id" t.index ["recruits_id"], name: "index_weapons_on_recruits_id"
end end
add_foreign_key "favorites", "parties" add_foreign_key "favorites", "parties"
add_foreign_key "favorites", "users" add_foreign_key "favorites", "users"
add_foreign_key "grid_characters", "awakenings"
add_foreign_key "grid_characters", "characters" add_foreign_key "grid_characters", "characters"
add_foreign_key "grid_characters", "parties" add_foreign_key "grid_characters", "parties"
add_foreign_key "grid_summons", "parties" add_foreign_key "grid_summons", "parties"
add_foreign_key "grid_summons", "summons" add_foreign_key "grid_summons", "summons"
add_foreign_key "grid_weapons", "awakenings"
add_foreign_key "grid_weapons", "parties" add_foreign_key "grid_weapons", "parties"
add_foreign_key "grid_weapons", "weapon_keys", column: "weapon_key3_id" add_foreign_key "grid_weapons", "weapon_keys", column: "weapon_key3_id"
add_foreign_key "grid_weapons", "weapons" add_foreign_key "grid_weapons", "weapons"
@ -493,4 +515,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_19_000621) do
add_foreign_key "parties", "raids" add_foreign_key "parties", "raids"
add_foreign_key "parties", "users" add_foreign_key "parties", "users"
add_foreign_key "raids", "raid_groups", column: "group_id" add_foreign_key "raids", "raid_groups", column: "group_id"
add_foreign_key "weapon_awakenings", "awakenings"
add_foreign_key "weapon_awakenings", "weapons"
end end