using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace BlueLaminate.EFCore.Migrations { /// public partial class ConsistencyPass_FloatBoundsCurrencyConditionPaintSeed : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.DropIndex( name: "ix_inventory_items_asset_id", schema: "skintracker", table: "inventory_items"); migrationBuilder.RenameColumn( name: "min_float", schema: "skintracker", table: "skin_conditions", newName: "float_min"); migrationBuilder.RenameColumn( name: "max_float", schema: "skintracker", table: "skin_conditions", newName: "float_max"); // text -> integer needs an explicit USING cast; EF's AlterColumn omits it and // Postgres won't cast automatically. Every stored seed is a stringified // integer, so the cast is total. migrationBuilder.Sql( "ALTER TABLE skintracker.skin_instances " + "ALTER COLUMN paint_seed TYPE integer USING paint_seed::integer;"); migrationBuilder.AddColumn( name: "condition_id", schema: "skintracker", table: "listings", type: "integer", nullable: true); migrationBuilder.AddColumn( name: "currency", schema: "skintracker", table: "listings", type: "text", nullable: false, defaultValue: "USD"); migrationBuilder.CreateIndex( name: "ix_trades_steam_trade_id", schema: "skintracker", table: "trades", column: "steam_trade_id", unique: true); migrationBuilder.CreateIndex( name: "ix_listings_condition_id", schema: "skintracker", table: "listings", column: "condition_id"); migrationBuilder.CreateIndex( name: "ix_inventory_items_asset_id", schema: "skintracker", table: "inventory_items", column: "asset_id", unique: true); migrationBuilder.AddForeignKey( name: "fk_listings_skin_conditions_condition_id", schema: "skintracker", table: "listings", column: "condition_id", principalSchema: "skintracker", principalTable: "skin_conditions", principalColumn: "id", onDelete: ReferentialAction.SetNull); // Now that listings carries its own condition_id and currency, the csfloat // arm of the cross-market view uses them instead of NULL / a hardcoded 'USD'. migrationBuilder.Sql(""" CREATE OR REPLACE VIEW skintracker.market_listings AS SELECT 'csfloat'::text AS marketplace, l.cs_float_listing_id AS external_id, l.skin_id AS skin_id, l.condition_id AS condition_id, l.skin_instance_id AS skin_instance_id, l.market_hash_name AS market_hash_name, l.wear_name AS wear, l.float_value AS float_value, l.paint_seed AS paint_seed, l.is_stat_trak AS is_stat_trak, l.is_souvenir AS is_souvenir, l.sticker_count AS sticker_count, l.price AS price, l.currency AS currency, l.inspect_link AS inspect_link, l.asset_id AS asset_id, l.status AS status, l.first_seen_at AS first_seen_at, l.last_seen_at AS last_seen_at, l.removed_at AS removed_at FROM skintracker.listings l UNION ALL SELECT 'csmoney'::text, c.sell_order_id::text, c.skin_id, c.condition_id, c.skin_instance_id, c.market_hash_name, CASE lower(c.quality) WHEN 'fn' THEN 'Factory New' WHEN 'mw' THEN 'Minimal Wear' WHEN 'ft' THEN 'Field-Tested' WHEN 'ww' THEN 'Well-Worn' WHEN 'bs' THEN 'Battle-Scarred' ELSE c.quality END, c.float_value, c.paint_seed, c.is_stat_trak, c.is_souvenir, c.sticker_count, c.price, c.currency, c.inspect_link, c.asset_id, c.status, c.first_seen_at, c.last_seen_at, c.removed_at FROM skintracker.cs_money_listings c UNION ALL SELECT 'skinland'::text, s.listing_id::text, s.skin_id, s.condition_id, NULL::integer, s.market_hash_name, sc.condition, s.float_value, NULL::integer, s.is_stat_trak, s.is_souvenir, s.sticker_count, s.price, s.currency, s.inspect_link, NULL::text, s.status, s.first_seen_at, s.last_seen_at, s.removed_at FROM skintracker.skin_land_listings s LEFT JOIN skintracker.skin_conditions sc ON sc.id = s.condition_id; """); } /// protected override void Down(MigrationBuilder migrationBuilder) { // Restore the view to its pre-migration form (csfloat condition_id/currency // hardcoded) FIRST, so the listings columns it now references can be dropped. migrationBuilder.Sql(""" CREATE OR REPLACE VIEW skintracker.market_listings AS SELECT 'csfloat'::text AS marketplace, l.cs_float_listing_id AS external_id, l.skin_id AS skin_id, NULL::integer AS condition_id, l.skin_instance_id AS skin_instance_id, l.market_hash_name AS market_hash_name, l.wear_name AS wear, l.float_value AS float_value, l.paint_seed AS paint_seed, l.is_stat_trak AS is_stat_trak, l.is_souvenir AS is_souvenir, l.sticker_count AS sticker_count, l.price AS price, 'USD'::text AS currency, l.inspect_link AS inspect_link, l.asset_id AS asset_id, l.status AS status, l.first_seen_at AS first_seen_at, l.last_seen_at AS last_seen_at, l.removed_at AS removed_at FROM skintracker.listings l UNION ALL SELECT 'csmoney'::text, c.sell_order_id::text, c.skin_id, c.condition_id, c.skin_instance_id, c.market_hash_name, CASE lower(c.quality) WHEN 'fn' THEN 'Factory New' WHEN 'mw' THEN 'Minimal Wear' WHEN 'ft' THEN 'Field-Tested' WHEN 'ww' THEN 'Well-Worn' WHEN 'bs' THEN 'Battle-Scarred' ELSE c.quality END, c.float_value, c.paint_seed, c.is_stat_trak, c.is_souvenir, c.sticker_count, c.price, c.currency, c.inspect_link, c.asset_id, c.status, c.first_seen_at, c.last_seen_at, c.removed_at FROM skintracker.cs_money_listings c UNION ALL SELECT 'skinland'::text, s.listing_id::text, s.skin_id, s.condition_id, NULL::integer, s.market_hash_name, sc.condition, s.float_value, NULL::integer, s.is_stat_trak, s.is_souvenir, s.sticker_count, s.price, s.currency, s.inspect_link, NULL::text, s.status, s.first_seen_at, s.last_seen_at, s.removed_at FROM skintracker.skin_land_listings s LEFT JOIN skintracker.skin_conditions sc ON sc.id = s.condition_id; """); migrationBuilder.DropForeignKey( name: "fk_listings_skin_conditions_condition_id", schema: "skintracker", table: "listings"); migrationBuilder.DropIndex( name: "ix_trades_steam_trade_id", schema: "skintracker", table: "trades"); migrationBuilder.DropIndex( name: "ix_listings_condition_id", schema: "skintracker", table: "listings"); migrationBuilder.DropIndex( name: "ix_inventory_items_asset_id", schema: "skintracker", table: "inventory_items"); migrationBuilder.DropColumn( name: "condition_id", schema: "skintracker", table: "listings"); migrationBuilder.DropColumn( name: "currency", schema: "skintracker", table: "listings"); migrationBuilder.RenameColumn( name: "float_min", schema: "skintracker", table: "skin_conditions", newName: "min_float"); migrationBuilder.RenameColumn( name: "float_max", schema: "skintracker", table: "skin_conditions", newName: "max_float"); migrationBuilder.AlterColumn( name: "paint_seed", schema: "skintracker", table: "skin_instances", type: "text", nullable: false, oldClrType: typeof(int), oldType: "integer"); migrationBuilder.CreateIndex( name: "ix_inventory_items_asset_id", schema: "skintracker", table: "inventory_items", column: "asset_id"); } } }