feat: refactor character history schema and related logic for improved date handling and data integrity

This commit is contained in:
2026-03-02 12:19:56 +01:00
parent b5d53d69c1
commit a339498879
6 changed files with 1126 additions and 12 deletions

View File

@@ -0,0 +1,16 @@
PRAGMA foreign_keys=OFF;--> statement-breakpoint
CREATE TABLE `__new_characterHistory` (
`id` text PRIMARY KEY NOT NULL,
`characterId` text,
`date` integer NOT NULL,
`won` integer DEFAULT 0 NOT NULL,
`createdAt` integer NOT NULL,
`updatedAt` integer NOT NULL,
FOREIGN KEY (`characterId`) REFERENCES `character`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
INSERT INTO `__new_characterHistory`("id", "characterId", "date", "won", "createdAt", "updatedAt") SELECT "id", "characterId", "date", "won", "createdAt", "updatedAt" FROM `characterHistory`;--> statement-breakpoint
DROP TABLE `characterHistory`;--> statement-breakpoint
ALTER TABLE `__new_characterHistory` RENAME TO `characterHistory`;--> statement-breakpoint
PRAGMA foreign_keys=ON;--> statement-breakpoint
CREATE UNIQUE INDEX `characterHistory_date_unique` ON `characterHistory` (`date`);

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,13 @@
"when": 1772390182445, "when": 1772390182445,
"tag": "0002_large_gwen_stacy", "tag": "0002_large_gwen_stacy",
"breakpoints": true "breakpoints": true
},
{
"idx": 3,
"version": "6",
"when": 1772449624450,
"tag": "0003_wise_blonde_phantom",
"breakpoints": true
} }
] ]
} }

View File

@@ -139,19 +139,19 @@ async function applyCharacterOverrides(
); );
} }
function getDateKey(date: Date): string { export function getDateKey(date: Date): number {
return date.toISOString().split('T')[0]; return normalizeDay(date).getTime();
} }
function normalizeDay(date: Date = new Date()): Date { export function normalizeDay(date: Date = new Date()): Date {
const normalized = new Date(date); const normalized = new Date(date);
normalized.setHours(1, 0, 0, 0); normalized.setHours(1, 0, 0, 0);
return normalized; return normalized;
} }
function pickDailyCharacter(characters: CharacterWithRelations[], date: Date): CharacterWithRelations { function pickDailyCharacter(characters: CharacterWithRelations[], date: Date): CharacterWithRelations {
const dateStr = getDateKey(date); const timestamp = getDateKey(date);
const seed = dateStr.split('-').reduce((acc, value) => acc + parseInt(value), 0); const seed = Math.floor(timestamp / 1000 / 60 / 60 / 24);
const index = seed % characters.length; const index = seed % characters.length;
return characters[index]; return characters[index];
} }
@@ -254,9 +254,9 @@ export async function getYesterdayCharacter(
date: Date = new Date(), date: Date = new Date(),
characters?: CharacterWithRelations[] characters?: CharacterWithRelations[]
): Promise<CharacterWithRelations | null> { ): Promise<CharacterWithRelations | null> {
const baseDate = normalizeDay(date); const yesterday = new Date(date);
baseDate.setDate(baseDate.getDate() - 1); yesterday.setDate(yesterday.getDate() - 1);
const yesterdayDate = getDateKey(baseDate); const yesterdayDate = getDateKey(yesterday);
const [yesterdayEntry] = await db const [yesterdayEntry] = await db
.select() .select()

View File

@@ -100,7 +100,7 @@ export const characterHistory = sqliteTable('characterHistory', {
.primaryKey() .primaryKey()
.$defaultFn(() => crypto.randomUUID()), .$defaultFn(() => crypto.randomUUID()),
characterId: text('characterId').references(() => character.id), characterId: text('characterId').references(() => character.id),
date: text('date'), date: integer('date').notNull().unique(),
won: integer('won').notNull().default(0), won: integer('won').notNull().default(0),
createdAt: integer('createdAt').notNull().$default(() => Date.now()), createdAt: integer('createdAt').notNull().$default(() => Date.now()),
updatedAt: integer('updatedAt').notNull().$default(() => Date.now()), updatedAt: integer('updatedAt').notNull().$default(() => Date.now()),

View File

@@ -3,6 +3,7 @@ import { db } from '$lib/server/db';
import { characterHistory } from '$lib/server/db/schema'; import { characterHistory } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm'; import { eq } from 'drizzle-orm';
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { getDateKey } from '$lib/server/daily-character';
export async function POST({ request }) { export async function POST({ request }) {
try { try {
@@ -12,9 +13,7 @@ export async function POST({ request }) {
return json({ error: 'Missing characterId' }, { status: 400 }); return json({ error: 'Missing characterId' }, { status: 400 });
} }
const today = new Date(); const todayDate = getDateKey(new Date());
today.setHours(0, 0, 0, 0);
const todayDate = today.toISOString().split('T')[0];
// Increment the won counter for today's entry // Increment the won counter for today's entry
await db await db