import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { validateMariaDbBrowserConnection } from '../../../../../job-tracker-ui/scripts/mariadb-browser-connection.mjs'; const execute = promisify(execFile); export async function sql(query) { const port = process.env.JOBTRACKER_MARIADB_BROWSER_PORT; const database = validateMariaDbBrowserConnection(process.env.JOBTRACKER_MARIADB_BROWSER_CONNECTION || '', port || ''); if (port !== '33308' || !process.env.JOBTRACKER_MARIADB_CLIENT) throw new Error('Pinned MariaDB port and native client are required.'); const { stdout } = await execute(process.env.JOBTRACKER_MARIADB_CLIENT, ['--host=127.0.0.1', `--port=${port}`, '--user=root', `--database=${database}`, '--batch', '--raw', '--skip-column-names', `--execute=SET TRANSACTION READ ONLY; START TRANSACTION; ${query}; COMMIT;`], { encoding: 'utf8', timeout: 15000, maxBuffer: 4 * 1024 * 1024, env: { ...process.env, MYSQL_PWD: 'jt-integration-only' } }); return stdout.trim(); } export async function snapshot(owner) { if (!/^[a-zA-Z0-9-]{1,64}$/.test(owner)) throw new Error('Invalid synthetic owner ID.'); return JSON.parse(await sql(`SELECT JSON_OBJECT( 'ids',(SELECT JSON_ARRAYAGG(Id ORDER BY Id) FROM JobApplications WHERE OwnerUserId='${owner}'), 'ownerCount',(SELECT COUNT(*) FROM JobApplications WHERE OwnerUserId='${owner}'), 'deletedCount',(SELECT COUNT(*) FROM JobApplications WHERE OwnerUserId='${owner}' AND IsDeleted=1), 'tenantCounts',(SELECT JSON_ARRAYAGG(JSON_OBJECT('owner',OwnerUserId,'count',n) ORDER BY OwnerUserId) FROM (SELECT OwnerUserId,COUNT(*) n FROM JobApplications GROUP BY OwnerUserId) counts), 'profile',(SELECT ProfileJson FROM CareerProfiles WHERE OwnerUserId='${owner}'), 'revision',(SELECT Version FROM CareerProfiles WHERE OwnerUserId='${owner}'), 'projection',(SELECT ProfileCvStructureJson FROM AspNetUsers WHERE Id='${owner}'), 'historyCount',(SELECT COUNT(*) FROM CareerProfileVersions WHERE OwnerUserId='${owner}'))`)); }