309 lines
12 KiB
C#
309 lines
12 KiB
C#
using Microsoft.EntityFrameworkCore.Migrations;
|
|
|
|
#nullable disable
|
|
|
|
namespace BlueLaminate.EFCore.Migrations
|
|
{
|
|
/// <inheritdoc />
|
|
public partial class ConsistencyPass_FloatBoundsCurrencyConditionPaintSeed : Migration
|
|
{
|
|
/// <inheritdoc />
|
|
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<int>(
|
|
name: "condition_id",
|
|
schema: "skintracker",
|
|
table: "listings",
|
|
type: "integer",
|
|
nullable: true);
|
|
|
|
migrationBuilder.AddColumn<string>(
|
|
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;
|
|
""");
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
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<string>(
|
|
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");
|
|
}
|
|
}
|
|
}
|