Seeding updated

This commit is contained in:
gamer147
2026-05-23 16:25:49 -04:00
parent 5f44ee0c7e
commit 56d3cf0ec8
38 changed files with 52689 additions and 62 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,489 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace SVSim.Database.Migrations
{
/// <inheritdoc />
public partial class ProdContentTables : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "CardSetIdForResourceDlView",
table: "GameConfigurations",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<long>(
name: "ChallengeTwoPickSleeveId",
table: "GameConfigurations",
type: "bigint",
nullable: false,
defaultValue: 0L);
migrationBuilder.AddColumn<bool>(
name: "ChallengeUseTwoPickPremiumCard",
table: "GameConfigurations",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsBattlePassPeriod",
table: "GameConfigurations",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsBeginnerMission",
table: "GameConfigurations",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<string>(
name: "TsRotationId",
table: "GameConfigurations",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.CreateTable(
name: "ArenaSeasons",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Mode = table.Column<int>(type: "integer", nullable: false),
Enable = table.Column<int>(type: "integer", nullable: false),
Cost = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
RupyCost = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
TicketCost = table.Column<int>(type: "integer", nullable: false),
IsJoin = table.Column<bool>(type: "boolean", nullable: false),
FormatInfo = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ArenaSeasons", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AvatarAbilities",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
LeaderSkinId = table.Column<int>(type: "integer", nullable: false),
BattleStartFirstPlayerTurnBp = table.Column<int>(type: "integer", nullable: false),
BattleStartSecondPlayerTurnBp = table.Column<int>(type: "integer", nullable: false),
BattleStartMaxLife = table.Column<int>(type: "integer", nullable: false),
AbilityCost = table.Column<string>(type: "text", nullable: false),
Ability = table.Column<string>(type: "text", nullable: false),
PassiveAbility = table.Column<string>(type: "text", nullable: false),
AbilityDesc = table.Column<string>(type: "text", nullable: false),
PassiveAbilityDesc = table.Column<string>(type: "text", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AvatarAbilities", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Banners",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
ImageName = table.Column<string>(type: "text", nullable: false),
Click = table.Column<string>(type: "text", nullable: false),
Status = table.Column<string>(type: "text", nullable: false),
ChangeTime = table.Column<int>(type: "integer", nullable: false),
RemainingTime = table.Column<int>(type: "integer", nullable: false),
ImagePaths = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Banners", x => x.Id);
});
migrationBuilder.CreateTable(
name: "BattlePassLevels",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Level = table.Column<int>(type: "integer", nullable: false),
RewardData = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_BattlePassLevels", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Colosseums",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
ColosseumId = table.Column<string>(type: "text", nullable: false),
ColosseumName = table.Column<string>(type: "text", nullable: false),
CardPoolName = table.Column<string>(type: "text", nullable: false),
DeckFormat = table.Column<string>(type: "text", nullable: false),
StartTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
EndTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
NowRound = table.Column<string>(type: "text", nullable: false),
IsDisplayTips = table.Column<string>(type: "text", nullable: false),
TipsId = table.Column<string>(type: "text", nullable: false),
IsColosseumPeriod = table.Column<bool>(type: "boolean", nullable: false),
IsRoundPeriod = table.Column<bool>(type: "boolean", nullable: false),
IsNormalTwoPick = table.Column<string>(type: "text", nullable: false),
IsSpecialMode = table.Column<string>(type: "text", nullable: false),
IsAllCardEnabled = table.Column<int>(type: "integer", nullable: false),
SalesPeriodInfo = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Colosseums", x => x.Id);
});
migrationBuilder.CreateTable(
name: "DailyLoginBonuses",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
BonusId = table.Column<int>(type: "integer", nullable: false),
BonusData = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_DailyLoginBonuses", x => x.Id);
});
migrationBuilder.CreateTable(
name: "DefaultDecks",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
DeckNo = table.Column<int>(type: "integer", nullable: false),
ClassId = table.Column<int>(type: "integer", nullable: false),
SleeveId = table.Column<long>(type: "bigint", nullable: false),
LeaderSkinId = table.Column<int>(type: "integer", nullable: false),
DeckName = table.Column<string>(type: "text", nullable: false),
CardIdArray = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_DefaultDecks", x => x.Id);
});
migrationBuilder.CreateTable(
name: "DefaultLeaderSkinSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
ClassId = table.Column<int>(type: "integer", nullable: false),
IsRandomLeaderSkin = table.Column<int>(type: "integer", nullable: false),
LeaderSkinId = table.Column<int>(type: "integer", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_DefaultLeaderSkinSettings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "FeatureMaintenances",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
FeatureKey = table.Column<string>(type: "text", nullable: false),
Data = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_FeatureMaintenances", x => x.Id);
});
migrationBuilder.CreateTable(
name: "LoadingExclusionCards",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false),
CardId = table.Column<long>(type: "bigint", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_LoadingExclusionCards", x => x.Id);
});
migrationBuilder.CreateTable(
name: "MaintenanceCards",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false),
CardId = table.Column<long>(type: "bigint", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_MaintenanceCards", x => x.Id);
});
migrationBuilder.CreateTable(
name: "MasterPointRankingPeriods",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
PeriodNum = table.Column<int>(type: "integer", nullable: false),
NecessaryScore = table.Column<long>(type: "bigint", nullable: false),
BeginTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
EndTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_MasterPointRankingPeriods", x => x.Id);
});
migrationBuilder.CreateTable(
name: "MyRotationAbilities",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
AbilityId = table.Column<int>(type: "integer", nullable: false),
Data = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_MyRotationAbilities", x => x.Id);
});
migrationBuilder.CreateTable(
name: "MyRotationSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
RotationId = table.Column<int>(type: "integer", nullable: false),
CardSetIdsCsv = table.Column<string>(type: "text", nullable: false),
AbilitiesCsv = table.Column<string>(type: "text", nullable: false),
ReprintedCardIds = table.Column<string>(type: "jsonb", nullable: false),
RestrictedCardIds = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_MyRotationSettings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "PreReleaseInfos",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
PreReleaseId = table.Column<string>(type: "text", nullable: false),
NextCardSetId = table.Column<string>(type: "text", nullable: false),
StartTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
EndTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DisplayEndTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
FreeMatchStartTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
CardMasterId = table.Column<int>(type: "integer", nullable: false),
DefaultCardMasterId = table.Column<string>(type: "text", nullable: false),
PreReleaseCardMasterId = table.Column<string>(type: "text", nullable: false),
IsPreRotationFreeMatchTerm = table.Column<bool>(type: "boolean", nullable: false),
RotationCardSetIdList = table.Column<string>(type: "jsonb", nullable: false),
ReprintedBaseCardIds = table.Column<string>(type: "jsonb", nullable: false),
LatestReprintedBaseCardIds = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_PreReleaseInfos", x => x.Id);
});
migrationBuilder.CreateTable(
name: "ReprintedCards",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false),
CardId = table.Column<long>(type: "bigint", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ReprintedCards", x => x.Id);
});
migrationBuilder.CreateTable(
name: "SealedSeasons",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Enable = table.Column<int>(type: "integer", nullable: false),
CrystalCost = table.Column<int>(type: "integer", nullable: false),
RupyCost = table.Column<int>(type: "integer", nullable: false),
TicketCost = table.Column<int>(type: "integer", nullable: false),
DeckUsingNumMin = table.Column<int>(type: "integer", nullable: false),
ScheduleId = table.Column<int>(type: "integer", nullable: false),
IsJoin = table.Column<bool>(type: "boolean", nullable: false),
IsDeckCodeMaintenance = table.Column<bool>(type: "boolean", nullable: false),
PackInfo = table.Column<string>(type: "jsonb", nullable: false),
SalesPeriodInfo = table.Column<string>(type: "jsonb", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SealedSeasons", x => x.Id);
});
migrationBuilder.CreateTable(
name: "SpotCards",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false),
CardId = table.Column<long>(type: "bigint", nullable: false),
Cost = table.Column<int>(type: "integer", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SpotCards", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UnlimitedRestrictions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false),
CardId = table.Column<long>(type: "bigint", nullable: false),
RestrictionValue = table.Column<int>(type: "integer", nullable: false),
DateCreated = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
DateUpdated = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_UnlimitedRestrictions", x => x.Id);
});
migrationBuilder.UpdateData(
table: "GameConfigurations",
keyColumn: "Id",
keyValue: "default",
columns: new[] { "CardSetIdForResourceDlView", "ChallengeTwoPickSleeveId", "ChallengeUseTwoPickPremiumCard", "IsBattlePassPeriod", "IsBeginnerMission", "TsRotationId" },
values: new object[] { 0, 0L, false, false, false, "" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ArenaSeasons");
migrationBuilder.DropTable(
name: "AvatarAbilities");
migrationBuilder.DropTable(
name: "Banners");
migrationBuilder.DropTable(
name: "BattlePassLevels");
migrationBuilder.DropTable(
name: "Colosseums");
migrationBuilder.DropTable(
name: "DailyLoginBonuses");
migrationBuilder.DropTable(
name: "DefaultDecks");
migrationBuilder.DropTable(
name: "DefaultLeaderSkinSettings");
migrationBuilder.DropTable(
name: "FeatureMaintenances");
migrationBuilder.DropTable(
name: "LoadingExclusionCards");
migrationBuilder.DropTable(
name: "MaintenanceCards");
migrationBuilder.DropTable(
name: "MasterPointRankingPeriods");
migrationBuilder.DropTable(
name: "MyRotationAbilities");
migrationBuilder.DropTable(
name: "MyRotationSettings");
migrationBuilder.DropTable(
name: "PreReleaseInfos");
migrationBuilder.DropTable(
name: "ReprintedCards");
migrationBuilder.DropTable(
name: "SealedSeasons");
migrationBuilder.DropTable(
name: "SpotCards");
migrationBuilder.DropTable(
name: "UnlimitedRestrictions");
migrationBuilder.DropColumn(
name: "CardSetIdForResourceDlView",
table: "GameConfigurations");
migrationBuilder.DropColumn(
name: "ChallengeTwoPickSleeveId",
table: "GameConfigurations");
migrationBuilder.DropColumn(
name: "ChallengeUseTwoPickPremiumCard",
table: "GameConfigurations");
migrationBuilder.DropColumn(
name: "IsBattlePassPeriod",
table: "GameConfigurations");
migrationBuilder.DropColumn(
name: "IsBeginnerMission",
table: "GameConfigurations");
migrationBuilder.DropColumn(
name: "TsRotationId",
table: "GameConfigurations");
}
}
}

View File

@@ -85,6 +85,153 @@ namespace SVSim.Database.Migrations
b.ToTable("MyPageBackgroundEntryViewer");
});
modelBuilder.Entity("SVSim.Database.Models.ArenaSeasonConfig", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<decimal>("Cost")
.HasColumnType("numeric(20,0)");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("Enable")
.HasColumnType("integer");
b.Property<string>("FormatInfo")
.IsRequired()
.HasColumnType("jsonb");
b.Property<bool>("IsJoin")
.HasColumnType("boolean");
b.Property<int>("Mode")
.HasColumnType("integer");
b.Property<decimal>("RupyCost")
.HasColumnType("numeric(20,0)");
b.Property<int>("TicketCost")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("ArenaSeasons");
});
modelBuilder.Entity("SVSim.Database.Models.AvatarAbilityEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("Ability")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AbilityCost")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AbilityDesc")
.IsRequired()
.HasColumnType("text");
b.Property<int>("BattleStartFirstPlayerTurnBp")
.HasColumnType("integer");
b.Property<int>("BattleStartMaxLife")
.HasColumnType("integer");
b.Property<int>("BattleStartSecondPlayerTurnBp")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("LeaderSkinId")
.HasColumnType("integer");
b.Property<string>("PassiveAbility")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PassiveAbilityDesc")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("AvatarAbilities");
});
modelBuilder.Entity("SVSim.Database.Models.BannerEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<int>("ChangeTime")
.HasColumnType("integer");
b.Property<string>("Click")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("ImageName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("ImagePaths")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("RemainingTime")
.HasColumnType("integer");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Banners");
});
modelBuilder.Entity("SVSim.Database.Models.BattlePassLevelEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("Level")
.HasColumnType("integer");
b.Property<string>("RewardData")
.IsRequired()
.HasColumnType("jsonb");
b.HasKey("Id");
b.ToTable("BattlePassLevels");
});
modelBuilder.Entity("SVSim.Database.Models.BattlefieldEntry", b =>
{
b.Property<int>("Id")
@@ -1213,6 +1360,161 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.ColosseumConfig", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("CardPoolName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("ColosseumId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("ColosseumName")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("DeckFormat")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("EndTime")
.HasColumnType("timestamp with time zone");
b.Property<int>("IsAllCardEnabled")
.HasColumnType("integer");
b.Property<bool>("IsColosseumPeriod")
.HasColumnType("boolean");
b.Property<string>("IsDisplayTips")
.IsRequired()
.HasColumnType("text");
b.Property<string>("IsNormalTwoPick")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsRoundPeriod")
.HasColumnType("boolean");
b.Property<string>("IsSpecialMode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("NowRound")
.IsRequired()
.HasColumnType("text");
b.Property<string>("SalesPeriodInfo")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("StartTime")
.HasColumnType("timestamp with time zone");
b.Property<string>("TipsId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Colosseums");
});
modelBuilder.Entity("SVSim.Database.Models.DailyLoginBonusEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("BonusData")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("BonusId")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("DailyLoginBonuses");
});
modelBuilder.Entity("SVSim.Database.Models.DefaultDeckEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("CardIdArray")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("ClassId")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("DeckName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("DeckNo")
.HasColumnType("integer");
b.Property<int>("LeaderSkinId")
.HasColumnType("integer");
b.Property<long>("SleeveId")
.HasColumnType("bigint");
b.HasKey("Id");
b.ToTable("DefaultDecks");
});
modelBuilder.Entity("SVSim.Database.Models.DefaultLeaderSkinSettingEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<int>("ClassId")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("IsRandomLeaderSkin")
.HasColumnType("integer");
b.Property<int>("LeaderSkinId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("DefaultLeaderSkinSettings");
});
modelBuilder.Entity("SVSim.Database.Models.DegreeEntry", b =>
{
b.Property<int>("Id")
@@ -21399,11 +21701,44 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.FeatureMaintenanceEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("Data")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("FeatureKey")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("FeatureMaintenances");
});
modelBuilder.Entity("SVSim.Database.Models.GameConfiguration", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("CardSetIdForResourceDlView")
.HasColumnType("integer");
b.Property<long>("ChallengeTwoPickSleeveId")
.HasColumnType("bigint");
b.Property<bool>("ChallengeUseTwoPickPremiumCard")
.HasColumnType("boolean");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
@@ -21431,9 +21766,19 @@ namespace SVSim.Database.Migrations
b.Property<int>("DefaultSleeveId")
.HasColumnType("integer");
b.Property<bool>("IsBattlePassPeriod")
.HasColumnType("boolean");
b.Property<bool>("IsBeginnerMission")
.HasColumnType("boolean");
b.Property<int>("MaxFriends")
.HasColumnType("integer");
b.Property<string>("TsRotationId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("DefaultDegreeId");
@@ -21450,6 +21795,9 @@ namespace SVSim.Database.Migrations
new
{
Id = "default",
CardSetIdForResourceDlView = 0,
ChallengeTwoPickSleeveId = 0L,
ChallengeUseTwoPickPremiumCard = false,
DateCreated = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
DefaultCrystals = 50000m,
DefaultDegreeId = 300003,
@@ -21458,7 +21806,10 @@ namespace SVSim.Database.Migrations
DefaultMyPageBackgroundId = 100000000,
DefaultRupees = 50000m,
DefaultSleeveId = 3000011,
MaxFriends = 20
IsBattlePassPeriod = false,
IsBeginnerMission = false,
MaxFriends = 20,
TsRotationId = ""
});
});
@@ -24844,6 +25195,72 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.LoadingExclusionCardEntry", b =>
{
b.Property<long>("Id")
.HasColumnType("bigint");
b.Property<long>("CardId")
.HasColumnType("bigint");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("LoadingExclusionCards");
});
modelBuilder.Entity("SVSim.Database.Models.MaintenanceCardEntry", b =>
{
b.Property<long>("Id")
.HasColumnType("bigint");
b.Property<long>("CardId")
.HasColumnType("bigint");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("MaintenanceCards");
});
modelBuilder.Entity("SVSim.Database.Models.MasterPointRankingPeriodEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<DateTime>("BeginTime")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EndTime")
.HasColumnType("timestamp with time zone");
b.Property<long>("NecessaryScore")
.HasColumnType("bigint");
b.Property<int>("PeriodNum")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("MasterPointRankingPeriods");
});
modelBuilder.Entity("SVSim.Database.Models.MyPageBackgroundEntry", b =>
{
b.Property<int>("Id")
@@ -24947,6 +25364,126 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.MyRotationAbilityEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<int>("AbilityId")
.HasColumnType("integer");
b.Property<string>("Data")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("MyRotationAbilities");
});
modelBuilder.Entity("SVSim.Database.Models.MyRotationSettingEntry", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("AbilitiesCsv")
.IsRequired()
.HasColumnType("text");
b.Property<string>("CardSetIdsCsv")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("ReprintedCardIds")
.IsRequired()
.HasColumnType("jsonb");
b.Property<string>("RestrictedCardIds")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("RotationId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("MyRotationSettings");
});
modelBuilder.Entity("SVSim.Database.Models.PreReleaseInfo", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<int>("CardMasterId")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<string>("DefaultCardMasterId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("DisplayEndTime")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EndTime")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("FreeMatchStartTime")
.HasColumnType("timestamp with time zone");
b.Property<bool>("IsPreRotationFreeMatchTerm")
.HasColumnType("boolean");
b.Property<string>("LatestReprintedBaseCardIds")
.IsRequired()
.HasColumnType("jsonb");
b.Property<string>("NextCardSetId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PreReleaseCardMasterId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PreReleaseId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("ReprintedBaseCardIds")
.IsRequired()
.HasColumnType("jsonb");
b.Property<string>("RotationCardSetIdList")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("StartTime")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("PreReleaseInfos");
});
modelBuilder.Entity("SVSim.Database.Models.RankInfoEntry", b =>
{
b.Property<int>("Id")
@@ -25623,6 +26160,73 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.ReprintedCardEntry", b =>
{
b.Property<long>("Id")
.HasColumnType("bigint");
b.Property<long>("CardId")
.HasColumnType("bigint");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("ReprintedCards");
});
modelBuilder.Entity("SVSim.Database.Models.SealedConfig", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<int>("CrystalCost")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("DeckUsingNumMin")
.HasColumnType("integer");
b.Property<int>("Enable")
.HasColumnType("integer");
b.Property<bool>("IsDeckCodeMaintenance")
.HasColumnType("boolean");
b.Property<bool>("IsJoin")
.HasColumnType("boolean");
b.Property<string>("PackInfo")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("RupyCost")
.HasColumnType("integer");
b.Property<string>("SalesPeriodInfo")
.IsRequired()
.HasColumnType("jsonb");
b.Property<int>("ScheduleId")
.HasColumnType("integer");
b.Property<int>("TicketCost")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("SealedSeasons");
});
modelBuilder.Entity("SVSim.Database.Models.ShadowverseCardEntry", b =>
{
b.Property<long>("Id")
@@ -25694,6 +26298,7 @@ namespace SVSim.Database.Migrations
modelBuilder.Entity("SVSim.Database.Models.ShadowverseDeckEntry", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<int>("ClassId")
@@ -33268,6 +33873,50 @@ namespace SVSim.Database.Migrations
});
});
modelBuilder.Entity("SVSim.Database.Models.SpotCardEntry", b =>
{
b.Property<long>("Id")
.HasColumnType("bigint");
b.Property<long>("CardId")
.HasColumnType("bigint");
b.Property<int>("Cost")
.HasColumnType("integer");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.ToTable("SpotCards");
});
modelBuilder.Entity("SVSim.Database.Models.UnlimitedRestrictionEntry", b =>
{
b.Property<long>("Id")
.HasColumnType("bigint");
b.Property<long>("CardId")
.HasColumnType("bigint");
b.Property<DateTime>("DateCreated")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateUpdated")
.HasColumnType("timestamp with time zone");
b.Property<int>("RestrictionValue")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("UnlimitedRestrictions");
});
modelBuilder.Entity("SVSim.Database.Models.Viewer", b =>
{
b.Property<long>("Id")

View File

@@ -0,0 +1,27 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Singleton row (Id=1) capturing the current Take Two arena season config from
/// /load/index data.arena_info[0]. FormatInfo jsonb holds the nested
/// {two_pick_type, card_pool_name, announce_id, last_card_pack_set_id, start_time, end_time}.
/// </summary>
public class ArenaSeasonConfig : BaseEntity<int>
{
public int Mode { get; set; }
public int Enable { get; set; }
public ulong Cost { get; set; }
public ulong RupyCost { get; set; }
public int TicketCost { get; set; }
public bool IsJoin { get; set; }
[Column(TypeName = "jsonb")]
public string FormatInfo { get; set; } = "{}";
}

View File

@@ -0,0 +1,30 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// One Avatar (Hero) mode definition. Keyed by leader_skin_id. The Ability/PassiveAbility strings
/// are the dense "(skill:...)(timing:...)" effect DSL that cannot be reconstructed from card master —
/// preserve verbatim from /load/index data.avatar_info.abilities[leaderSkinId].
/// </summary>
public class AvatarAbilityEntry : BaseEntity<int>
{
public int LeaderSkinId { get => Id; set => Id = value; }
public int BattleStartFirstPlayerTurnBp { get; set; }
public int BattleStartSecondPlayerTurnBp { get; set; }
public int BattleStartMaxLife { get; set; }
public string AbilityCost { get; set; } = string.Empty;
public string Ability { get; set; } = string.Empty;
public string PassiveAbility { get; set; } = string.Empty;
public string AbilityDesc { get; set; } = string.Empty;
public string PassiveAbilityDesc { get; set; } = string.Empty;
}

View File

@@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// One mypage banner from /mypage/index data.banner. Id is synthetic ordinal (1-N) since the wire
/// has no explicit ID. Highly time-varying content — recapture aggressively before EOS.
/// </summary>
public class BannerEntry : BaseEntity<int>
{
public string ImageName { get; set; } = string.Empty;
public string Click { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public int ChangeTime { get; set; }
public int RemainingTime { get; set; }
[Column(TypeName = "jsonb")]
public string ImagePaths { get; set; } = "[]";
}

View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// One battle pass level (1-100). RewardData jsonb holds the per-level reward blob from
/// /load/index data.battle_pass_level_info[level]. Shape varies per level so we preserve verbatim.
/// </summary>
public class BattlePassLevelEntry : BaseEntity<int>
{
public int Level { get => Id; set => Id = value; }
[Column(TypeName = "jsonb")]
public string RewardData { get; set; } = "{}";
}

View File

@@ -0,0 +1,42 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Singleton row (Id=1) for the current Colosseum event from /mypage/index data.colosseum_info.
/// Time-bound — recapture per Colosseum cycle (every few weeks).
/// </summary>
public class ColosseumConfig : BaseEntity<int>
{
public string ColosseumId { get; set; } = string.Empty;
public string ColosseumName { get; set; } = string.Empty;
public string CardPoolName { get; set; } = string.Empty;
public string DeckFormat { get; set; } = string.Empty;
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string NowRound { get; set; } = string.Empty;
public string IsDisplayTips { get; set; } = string.Empty;
public string TipsId { get; set; } = string.Empty;
public bool IsColosseumPeriod { get; set; }
public bool IsRoundPeriod { get; set; }
public string IsNormalTwoPick { get; set; } = string.Empty;
public string IsSpecialMode { get; set; } = string.Empty;
public int IsAllCardEnabled { get; set; }
[Column(TypeName = "jsonb")]
public string SalesPeriodInfo { get; set; } = "{}";
}

View File

@@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Daily login bonus campaign from /load/index data.daily_login_bonus (dict keyed by bonus_id,
/// values are arrays of bonus days). Prod observed keys {1, 3, 4} with empty arrays — recapture
/// target during active login bonus events.
/// </summary>
public class DailyLoginBonusEntry : BaseEntity<int>
{
public int BonusId { get => Id; set => Id = value; }
[Column(TypeName = "jsonb")]
public string BonusData { get; set; } = "[]";
}

View File

@@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Starter / "use default" deck definition from /deck/info data.default_deck_list.
/// CardIdArray is the wire's int[] of 40 card_id values; stored as jsonb to keep it array-shaped.
/// </summary>
public class DefaultDeckEntry : BaseEntity<int>
{
public int DeckNo { get => Id; set => Id = value; }
public int ClassId { get; set; }
public long SleeveId { get; set; }
public int LeaderSkinId { get; set; }
public string DeckName { get; set; } = string.Empty;
[Column(TypeName = "jsonb")]
public string CardIdArray { get; set; } = "[]";
}

View File

@@ -0,0 +1,13 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>One row per class: which leader skin is default and whether random rotation is on.</summary>
public class DefaultLeaderSkinSettingEntry : BaseEntity<int>
{
public int ClassId { get => Id; set => Id = value; }
public int IsRandomLeaderSkin { get; set; }
public int LeaderSkinId { get; set; }
}

View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Per-feature maintenance toggle from /load/index data.feature_maintenance_list. Empty in current
/// prod capture; recapture target if a feature ever gets disabled before EOS.
/// </summary>
public class FeatureMaintenanceEntry : BaseEntity<int>
{
public string FeatureKey { get; set; } = string.Empty;
[Column(TypeName = "jsonb")]
public string Data { get; set; } = "{}";
}

View File

@@ -9,9 +9,30 @@ public class GameConfiguration : BaseEntity<string>
public ulong DefaultRupees { get; set; }
public ulong DefaultEther { get; set; }
public int MaxFriends { get; set; }
#region Time-varying globals populated by SVSim.Bootstrap.GlobalsImporter
/// <summary>Current "Take Two Special" rotation ID, e.g. "10015". Points into MyRotationSettingEntry.</summary>
public string TsRotationId { get; set; } = string.Empty;
public bool ChallengeUseTwoPickPremiumCard { get; set; }
public long ChallengeTwoPickSleeveId { get; set; }
/// <summary>
/// Bool on the wire (prod sends true/false); local previously sent int. Fixes the
/// type-mismatch noted in seed-data-strategy-2026-05-23.md crash audit.
/// </summary>
public bool IsBattlePassPeriod { get; set; }
public bool IsBeginnerMission { get; set; }
public int CardSetIdForResourceDlView { get; set; }
#endregion
#region Foreign Keys
public int DefaultDegreeId { get; set; }

View File

@@ -0,0 +1,12 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Cards excluded from loading-screen art rotation, from /load/index data.loading_exclusion_card_list.
/// References ShadowverseCardEntry.Id but no FK.
/// </summary>
public class LoadingExclusionCardEntry : BaseEntity<long>
{
public long CardId { get => Id; set => Id = value; }
}

View File

@@ -0,0 +1,12 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Cards disabled mid-season for emergency balance, from /load/index data.maintenance_card_list.
/// Empty in current prod capture; recapture target if a card ever gets emergency-disabled before EOS.
/// </summary>
public class MaintenanceCardEntry : BaseEntity<long>
{
public long CardId { get => Id; set => Id = value; }
}

View File

@@ -0,0 +1,18 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Monthly Master Point ranking window from /mypage/index data.master_point_ranking_period.
/// One row per period; the "current" period is fetched by EndTime > now ordering.
/// </summary>
public class MasterPointRankingPeriodEntry : BaseEntity<int>
{
public int PeriodNum { get; set; }
public long NecessaryScore { get; set; }
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
}

View File

@@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
public class MyRotationAbilityEntry : BaseEntity<int>
{
public int AbilityId { get => Id; set => Id = value; }
/// <summary>Raw ability blob from /load/index data.my_rotation_info.abilities[abilityId].</summary>
[Column(TypeName = "jsonb")]
public string Data { get; set; } = "{}";
}

View File

@@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Joins /load/index data.my_rotation_info.{setting, reprinted_base_card_ids, restricted_base_card_id_list}
/// on rotation_id. CardSetIdsCsv and AbilitiesCsv mirror the wire's pipe-delimited string format
/// (e.g. "10000|10001|10002"); the importer keeps them verbatim.
/// </summary>
public class MyRotationSettingEntry : BaseEntity<int>
{
public int RotationId { get => Id; set => Id = value; }
public string CardSetIdsCsv { get; set; } = string.Empty;
public string AbilitiesCsv { get; set; } = string.Empty;
[Column(TypeName = "jsonb")]
public string ReprintedCardIds { get; set; } = "[]";
[Column(TypeName = "jsonb")]
public string RestrictedCardIds { get; set; } = "[]";
}

View File

@@ -0,0 +1,41 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Singleton row (Id=1) for upcoming card-set pre-release window from /load/index data.pre_release_info.
/// Current capture has stale 1900/2019/2020 dates — likely "no active pre-release" sentinel.
/// Recapture target during an active pre-release window (typically a week before each new expansion).
/// </summary>
public class PreReleaseInfo : BaseEntity<int>
{
public string PreReleaseId { get; set; } = string.Empty;
public string NextCardSetId { get; set; } = string.Empty;
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public DateTime DisplayEndTime { get; set; }
public DateTime FreeMatchStartTime { get; set; }
public int CardMasterId { get; set; }
public string DefaultCardMasterId { get; set; } = string.Empty;
public string PreReleaseCardMasterId { get; set; } = string.Empty;
public bool IsPreRotationFreeMatchTerm { get; set; }
[Column(TypeName = "jsonb")]
public string RotationCardSetIdList { get; set; } = "[]";
[Column(TypeName = "jsonb")]
public string ReprintedBaseCardIds { get; set; } = "{}";
[Column(TypeName = "jsonb")]
public string LatestReprintedBaseCardIds { get; set; } = "{}";
}

View File

@@ -0,0 +1,12 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Cards currently in the reprinted list from /load/index data.reprinted_base_card_ids.
/// References ShadowverseCardEntry.Id but no FK.
/// </summary>
public class ReprintedCardEntry : BaseEntity<long>
{
public long CardId { get => Id; set => Id = value; }
}

View File

@@ -0,0 +1,33 @@
using System.ComponentModel.DataAnnotations.Schema;
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Singleton row (Id=1) for the current Sealed Arena season from /mypage/index data.sealed_info.
/// PackInfo jsonb is the int[] of pack set IDs used in the pool.
/// </summary>
public class SealedConfig : BaseEntity<int>
{
public int Enable { get; set; }
public int CrystalCost { get; set; }
public int RupyCost { get; set; }
public int TicketCost { get; set; }
public int DeckUsingNumMin { get; set; }
public int ScheduleId { get; set; }
public bool IsJoin { get; set; }
public bool IsDeckCodeMaintenance { get; set; }
[Column(TypeName = "jsonb")]
public string PackInfo { get; set; } = "[]";
[Column(TypeName = "jsonb")]
public string SalesPeriodInfo { get; set; } = "{}";
}

View File

@@ -0,0 +1,14 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// One row per rentable "spot card" from /load/index data.spot_cards (dict {card_id: cost}).
/// References ShadowverseCardEntry.Id but no FK — bootstrap warns on orphans.
/// </summary>
public class SpotCardEntry : BaseEntity<long>
{
public long CardId { get => Id; set => Id = value; }
public int Cost { get; set; }
}

View File

@@ -0,0 +1,15 @@
using SVSim.Database.Common;
namespace SVSim.Database.Models;
/// <summary>
/// Per-card unlimited-format ban/limit value from /load/index data.unlimited_restricted_base_card_id_list
/// (dict {card_id: restriction_value}). RestrictionValue semantics TBD — prod observed {0, 1}; the audit
/// flags this as "0 = limit-1? 1 = hard-ban?" pending a client read.
/// </summary>
public class UnlimitedRestrictionEntry : BaseEntity<long>
{
public long CardId { get => Id; set => Id = value; }
public int RestrictionValue { get; set; }
}

View File

@@ -28,9 +28,81 @@ public class GlobalsRepository : IGlobalsRepository
.Include(gc => gc.DefaultEmblem).Include(gc => gc.DefaultDegree).Include(gc => gc.DefaultSleeve).FirstOrDefaultAsync(gc => gc.Id == key) ??
new GameConfiguration();
}
public async Task<List<RankInfoEntry>> GetRankInfo()
{
return await _dbContext.Set<RankInfoEntry>().ToListAsync();
}
}
// ---------- Prod-captured globals ----------
public Task<List<MyRotationSettingEntry>> GetMyRotationSettings() =>
_dbContext.MyRotationSettings.AsNoTracking().ToListAsync();
public Task<List<MyRotationAbilityEntry>> GetMyRotationAbilities() =>
_dbContext.MyRotationAbilities.AsNoTracking().ToListAsync();
public Task<List<AvatarAbilityEntry>> GetAvatarAbilities() =>
_dbContext.AvatarAbilities.AsNoTracking().ToListAsync();
public Task<List<DefaultDeckEntry>> GetDefaultDecks() =>
_dbContext.DefaultDecks.AsNoTracking().ToListAsync();
public Task<List<DefaultLeaderSkinSettingEntry>> GetDefaultLeaderSkinSettings() =>
_dbContext.DefaultLeaderSkinSettings.AsNoTracking().ToListAsync();
public Task<ArenaSeasonConfig?> GetCurrentArenaSeason() =>
_dbContext.ArenaSeasons.AsNoTracking().FirstOrDefaultAsync(e => e.Id == 1);
public Task<List<SpotCardEntry>> GetSpotCards() =>
_dbContext.SpotCards.AsNoTracking().ToListAsync();
public Task<List<ReprintedCardEntry>> GetReprintedCards() =>
_dbContext.ReprintedCards.AsNoTracking().ToListAsync();
public Task<List<UnlimitedRestrictionEntry>> GetUnlimitedRestrictions() =>
_dbContext.UnlimitedRestrictions.AsNoTracking().ToListAsync();
public Task<List<LoadingExclusionCardEntry>> GetLoadingExclusionCards() =>
_dbContext.LoadingExclusionCards.AsNoTracking().ToListAsync();
public Task<List<BattlePassLevelEntry>> GetBattlePassLevels() =>
_dbContext.BattlePassLevels.AsNoTracking().ToListAsync();
public Task<List<DailyLoginBonusEntry>> GetDailyLoginBonus() =>
_dbContext.DailyLoginBonuses.AsNoTracking().ToListAsync();
public Task<List<BannerEntry>> GetBanners() =>
_dbContext.Banners.AsNoTracking().OrderBy(b => b.Id).ToListAsync();
public Task<ColosseumConfig?> GetCurrentColosseum() =>
_dbContext.Colosseums.AsNoTracking().FirstOrDefaultAsync(e => e.Id == 1);
public Task<SealedConfig?> GetCurrentSealedSeason() =>
_dbContext.SealedSeasons.AsNoTracking().FirstOrDefaultAsync(e => e.Id == 1);
/// <summary>Returns the master-point ranking period whose EndTime is in the future, or the latest by EndTime as fallback.</summary>
public async Task<MasterPointRankingPeriodEntry?> GetCurrentMasterPointPeriod()
{
var now = DateTime.UtcNow;
return await _dbContext.MasterPointRankingPeriods.AsNoTracking()
.Where(p => p.EndTime >= now)
.OrderBy(p => p.EndTime)
.FirstOrDefaultAsync()
?? await _dbContext.MasterPointRankingPeriods.AsNoTracking()
.OrderByDescending(p => p.EndTime)
.FirstOrDefaultAsync();
}
public Task<List<MaintenanceCardEntry>> GetMaintenanceCards() =>
_dbContext.MaintenanceCards.AsNoTracking().ToListAsync();
public Task<List<FeatureMaintenanceEntry>> GetFeatureMaintenances() =>
_dbContext.FeatureMaintenances.AsNoTracking().ToListAsync();
public Task<PreReleaseInfo?> GetPreReleaseInfo() =>
_dbContext.PreReleaseInfos.AsNoTracking().FirstOrDefaultAsync(e => e.Id == 1);
public Task<List<ShadowverseCardSetEntry>> GetRotationCardSets() =>
_dbContext.CardSets.AsNoTracking().Where(s => s.IsInRotation).ToListAsync();
}

View File

@@ -8,4 +8,26 @@ public interface IGlobalsRepository
Task<List<BattlefieldEntry>> GetBattlefields(bool onlyOpen);
Task<GameConfiguration> GetGameConfiguration(string key);
Task<List<RankInfoEntry>> GetRankInfo();
}
// Prod-captured globals — populated by SVSim.Bootstrap.GlobalsImporter.
Task<List<MyRotationSettingEntry>> GetMyRotationSettings();
Task<List<MyRotationAbilityEntry>> GetMyRotationAbilities();
Task<List<AvatarAbilityEntry>> GetAvatarAbilities();
Task<List<DefaultDeckEntry>> GetDefaultDecks();
Task<List<DefaultLeaderSkinSettingEntry>> GetDefaultLeaderSkinSettings();
Task<ArenaSeasonConfig?> GetCurrentArenaSeason();
Task<List<SpotCardEntry>> GetSpotCards();
Task<List<ReprintedCardEntry>> GetReprintedCards();
Task<List<UnlimitedRestrictionEntry>> GetUnlimitedRestrictions();
Task<List<LoadingExclusionCardEntry>> GetLoadingExclusionCards();
Task<List<BattlePassLevelEntry>> GetBattlePassLevels();
Task<List<DailyLoginBonusEntry>> GetDailyLoginBonus();
Task<List<BannerEntry>> GetBanners();
Task<ColosseumConfig?> GetCurrentColosseum();
Task<SealedConfig?> GetCurrentSealedSeason();
Task<MasterPointRankingPeriodEntry?> GetCurrentMasterPointPeriod();
Task<List<MaintenanceCardEntry>> GetMaintenanceCards();
Task<List<FeatureMaintenanceEntry>> GetFeatureMaintenances();
Task<PreReleaseInfo?> GetPreReleaseInfo();
Task<List<ShadowverseCardSetEntry>> GetRotationCardSets();
}

View File

@@ -36,6 +36,28 @@ public class SVSimDbContext : DbContext
public DbSet<GameConfiguration> GameConfigurations => Set<GameConfiguration>();
// Prod-captured globals — populated by SVSim.Bootstrap, not HasData. See
// docs/audits/prod-data-capture-strategy-2026-05-23.md.
public DbSet<MyRotationSettingEntry> MyRotationSettings => Set<MyRotationSettingEntry>();
public DbSet<MyRotationAbilityEntry> MyRotationAbilities => Set<MyRotationAbilityEntry>();
public DbSet<AvatarAbilityEntry> AvatarAbilities => Set<AvatarAbilityEntry>();
public DbSet<DefaultDeckEntry> DefaultDecks => Set<DefaultDeckEntry>();
public DbSet<DefaultLeaderSkinSettingEntry> DefaultLeaderSkinSettings => Set<DefaultLeaderSkinSettingEntry>();
public DbSet<ArenaSeasonConfig> ArenaSeasons => Set<ArenaSeasonConfig>();
public DbSet<SpotCardEntry> SpotCards => Set<SpotCardEntry>();
public DbSet<ReprintedCardEntry> ReprintedCards => Set<ReprintedCardEntry>();
public DbSet<UnlimitedRestrictionEntry> UnlimitedRestrictions => Set<UnlimitedRestrictionEntry>();
public DbSet<LoadingExclusionCardEntry> LoadingExclusionCards => Set<LoadingExclusionCardEntry>();
public DbSet<BattlePassLevelEntry> BattlePassLevels => Set<BattlePassLevelEntry>();
public DbSet<DailyLoginBonusEntry> DailyLoginBonuses => Set<DailyLoginBonusEntry>();
public DbSet<BannerEntry> Banners => Set<BannerEntry>();
public DbSet<ColosseumConfig> Colosseums => Set<ColosseumConfig>();
public DbSet<SealedConfig> SealedSeasons => Set<SealedConfig>();
public DbSet<MasterPointRankingPeriodEntry> MasterPointRankingPeriods => Set<MasterPointRankingPeriodEntry>();
public DbSet<MaintenanceCardEntry> MaintenanceCards => Set<MaintenanceCardEntry>();
public DbSet<FeatureMaintenanceEntry> FeatureMaintenances => Set<FeatureMaintenanceEntry>();
public DbSet<PreReleaseInfo> PreReleaseInfos => Set<PreReleaseInfo>();
#endregion
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)