longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
30 lines • 1.54 kB
JavaScript
;
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