UNPKG

longcelot-sheet-db

Version:

Google Sheets-backed staging database adapter for Node.js with schema-first design

30 lines 1.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createSQLFKResolver = createSQLFKResolver; const SchemaError_1 = require("../../errors/SchemaError"); const accessControl_1 = require("../accessControl"); const queryBuilder_1 = require("./queryBuilder"); /** * Tenant-scoped equivalent of SheetAdapter.createFKResolver(). That resolver checks the * referenced row within the *current context's* spreadsheet, so a same-actor FK stays inside * one tenant's sheet rather than checking globally — this must do the identical thing via * resolveNonAdminTenantKey(), or FK checks silently become cross-tenant existence leaks * (see FAQ.md #13). */ function createSQLFKResolver(connection, dialect, schemas, tenantColumn, context) { return async (tableName, columnName, value) => { const refSchema = schemas.get(tableName); if (!refSchema) { throw new SchemaError_1.SchemaError(`Referenced table '${tableName}' is not registered`, tableName); } const tenant = refSchema.actor === 'admin' ? undefined : { column: tenantColumn, value: (0, accessControl_1.resolveNonAdminTenantKey)(refSchema, context) }; const { text, params } = (0, queryBuilder_1.buildCount)(dialect, refSchema.name, { where: { [columnName]: value }, tenant, }); const result = await connection.query(text, params); const count = Number(result.rows[0]?.count ?? 0); return count > 0; }; } //# sourceMappingURL=fkResolver.js.map