import { createGamePostgresConnector } from '@sammo-ts/infra'; import { projectCoreDatabaseSnapshot, type CanonicalTurnSnapshot, type TurnSnapshotSelector } from './canonical.js'; export const readCoreDatabaseSnapshot = async ( databaseUrl: string, selector: TurnSnapshotSelector ): Promise => { const connector = createGamePostgresConnector({ url: databaseUrl }); await connector.connect(); try { const db = connector.prisma; const world = await db.worldState.findFirstOrThrow({ orderBy: { id: 'asc' } }); const [generals, cities, nations, diplomacy, generalTurns, nationTurns, logs] = await Promise.all([ db.general.findMany({ where: { id: { in: selector.generalIds } }, orderBy: { id: 'asc' }, }), db.city.findMany({ where: { id: { in: selector.cityIds } }, orderBy: { id: 'asc' }, }), db.nation.findMany({ where: { id: { in: selector.nationIds } }, orderBy: { id: 'asc' }, }), db.diplomacy.findMany({ where: { srcNationId: { in: selector.nationIds }, destNationId: { in: selector.nationIds }, }, orderBy: [{ srcNationId: 'asc' }, { destNationId: 'asc' }], }), db.generalTurn.findMany({ where: { generalId: { in: selector.generalIds } }, orderBy: [{ generalId: 'asc' }, { turnIdx: 'asc' }], }), db.nationTurn.findMany({ where: { nationId: { in: selector.nationIds } }, orderBy: [{ nationId: 'asc' }, { officerLevel: 'asc' }, { turnIdx: 'asc' }], }), db.logEntry.findMany({ where: { id: { gt: selector.logAfterId ?? 0 }, OR: [ { scope: 'SYSTEM' }, { generalId: { in: selector.generalIds } }, { nationId: { in: selector.nationIds } }, ], }, orderBy: { id: 'asc' }, }), ]); return projectCoreDatabaseSnapshot({ world, generals, cities, nations, diplomacy, generalTurns, nationTurns, logs, }); } finally { await connector.disconnect(); } };