import process from "node:process"; import { createInterface } from "node:readline"; import pg from "pg"; import { buildApp } from "../dist/src/app.js"; import { PostgresCondoRepository } from "../dist/src/postgres-repository.js"; const { Pool } = pg; async function readStandardInput() { const lines = createInterface({ input: process.stdin, terminal: false }); for await (const line of lines) { lines.close(); return line.trim(); } throw Object.assign(new Error("Missing connection input"), { code: "MISSING_CONNECTION_INPUT" }); } function safeError(error) { return { ok: false, errorCode: typeof error?.code === "string" ? error.code : "API_SMOKE_FAILED" }; } let app; try { const input = JSON.parse(await readStandardInput()); const pool = new Pool({ host: input.host, port: input.port, user: input.user, password: input.password, database: input.database, ssl: input.ssl ? { rejectUnauthorized: false } : undefined, max: 2, application_name: "condon_api_readonly_smoke", connectionTimeoutMillis: 10_000, options: "-c default_transaction_read_only=on -c statement_timeout=15000 -c lock_timeout=2000" }); const repository = new PostgresCondoRepository(pool); app = await buildApp({ repository, logger: false }); const requests = await Promise.all([ app.inject({ method: "GET", url: "/health" }), app.inject({ method: "GET", url: "/room-types" }), app.inject({ method: "GET", url: "/owner-accounts?year=2026" }), app.inject({ method: "GET", url: "/usage-records" }), app.inject({ method: "GET", url: "/dashboard?year=2026" }) ]); const [health, roomTypes, owners, usage, dashboard] = requests; const checks = { health: health.statusCode === 200 && health.json().database === "booking_test" && health.json().schema === "condon", roomTypes: roomTypes.statusCode === 200 && roomTypes.json().length === 11, ownersImported: owners.statusCode === 200 && owners.json().total === 388 && owners.json().items.length > 0, usageImported: usage.statusCode === 200 && usage.json().total === 157 && usage.json().items.length > 0, dashboardImported: dashboard.statusCode === 200 && dashboard.json().ownerRooms === 388 && dashboard.json().remainingPrivileges === 5394 && dashboard.json().used === 438, openApiPaths: Object.keys(app.swagger().paths ?? {}).length === 6 }; process.stdout.write(`${JSON.stringify({ ok: Object.values(checks).every(Boolean), checks }, null, 2)}\n`); if (Object.values(checks).some(result => !result)) process.exitCode = 1; } catch (error) { process.stdout.write(`${JSON.stringify(safeError(error), null, 2)}\n`); process.exitCode = 1; } finally { if (app) { await app.close().catch(() => { process.exitCode = 1; }); } }