mirror of
https://github.com/pupperpowell/bibdle.git
synced 2026-04-05 17:33:31 -04:00
Extracted game state management, share logic, and stats API calls into dedicated modules (game-persistence.svelte.ts, share.ts, stats-client.ts), and moved daily verse loading to client-side to fix timezone issues. Added a guesses column to daily_completions for cross-device state restoration for logged-in users, a new GET /api/stats endpoint, and a staging deploy script. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { Database } from 'bun:sqlite';
|
|
import path from 'path';
|
|
|
|
const dbUrl = process.env.DATABASE_URL;
|
|
if (!dbUrl) throw new Error('DATABASE_URL is not set');
|
|
|
|
const dbPath = dbUrl.startsWith('file:') ? dbUrl.slice(5) : dbUrl;
|
|
const db = new Database(path.resolve(dbPath));
|
|
|
|
const duplicates = db.query(`
|
|
SELECT anonymous_id, date, COUNT(*) as count
|
|
FROM daily_completions
|
|
GROUP BY anonymous_id, date
|
|
HAVING count > 1
|
|
`).all() as { anonymous_id: string; date: string; count: number }[];
|
|
|
|
if (duplicates.length === 0) {
|
|
console.log('No duplicates found.');
|
|
process.exit(0);
|
|
}
|
|
|
|
console.log(`Found ${duplicates.length} duplicate group(s):`);
|
|
|
|
const deleteStmt = db.query(`
|
|
DELETE FROM daily_completions
|
|
WHERE anonymous_id = $anonymous_id AND date = $date
|
|
AND id NOT IN (
|
|
SELECT id FROM daily_completions
|
|
WHERE anonymous_id = $anonymous_id AND date = $date
|
|
ORDER BY completed_at ASC
|
|
LIMIT 1
|
|
)
|
|
`);
|
|
|
|
for (const { anonymous_id, date, count } of duplicates) {
|
|
deleteStmt.run({ $anonymous_id: anonymous_id, $date: date });
|
|
console.log(` ${anonymous_id} / ${date}: kept earliest, deleted ${count - 1} row(s) (had ${count})`);
|
|
}
|
|
|
|
console.log('Done.');
|
|
db.close();
|