UNPKG

@proofkit/fmodata

Version:
186 lines (185 loc) 6.69 kB
var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); import { QueryBuilder } from "./query-builder.js"; import { getTableIdentifiers } from "../transform.js"; class DeleteBuilder { constructor(config) { __publicField(this, "tableName"); __publicField(this, "databaseName"); __publicField(this, "context"); __publicField(this, "occurrence"); __publicField(this, "databaseUseEntityIds"); this.occurrence = config.occurrence; this.tableName = config.tableName; this.databaseName = config.databaseName; this.context = config.context; this.databaseUseEntityIds = config.databaseUseEntityIds ?? false; } /** * Delete a single record by ID */ byId(id) { return new ExecutableDeleteBuilder({ occurrence: this.occurrence, tableName: this.tableName, databaseName: this.databaseName, context: this.context, mode: "byId", recordId: id, databaseUseEntityIds: this.databaseUseEntityIds }); } /** * Delete records matching a filter query * @param fn Callback that receives a QueryBuilder for building the filter */ where(fn) { const queryBuilder = new QueryBuilder({ occurrence: void 0, tableName: this.tableName, databaseName: this.databaseName, context: this.context }); const configuredBuilder = fn(queryBuilder); return new ExecutableDeleteBuilder({ occurrence: this.occurrence, tableName: this.tableName, databaseName: this.databaseName, context: this.context, mode: "byFilter", queryBuilder: configuredBuilder, databaseUseEntityIds: this.databaseUseEntityIds }); } } class ExecutableDeleteBuilder { constructor(config) { __publicField(this, "tableName"); __publicField(this, "databaseName"); __publicField(this, "context"); __publicField(this, "occurrence"); __publicField(this, "mode"); __publicField(this, "recordId"); __publicField(this, "queryBuilder"); __publicField(this, "databaseUseEntityIds"); this.occurrence = config.occurrence; this.tableName = config.tableName; this.databaseName = config.databaseName; this.context = config.context; this.mode = config.mode; this.recordId = config.recordId; this.queryBuilder = config.queryBuilder; this.databaseUseEntityIds = config.databaseUseEntityIds ?? false; } /** * Helper to merge database-level useEntityIds with per-request options */ mergeExecuteOptions(options) { return { ...options, useEntityIds: (options == null ? void 0 : options.useEntityIds) ?? this.databaseUseEntityIds }; } /** * Gets the table ID (FMTID) if using entity IDs, otherwise returns the table name * @param useEntityIds - Optional override for entity ID usage */ getTableId(useEntityIds) { var _a, _b; if (!this.occurrence) { return this.tableName; } const contextDefault = ((_b = (_a = this.context)._getUseEntityIds) == null ? void 0 : _b.call(_a)) ?? false; const shouldUseIds = useEntityIds ?? contextDefault; if (shouldUseIds) { const identifiers = getTableIdentifiers(this.occurrence); if (!identifiers.id) { throw new Error( `useEntityIds is true but TableOccurrence "${identifiers.name}" does not have an fmtId defined` ); } return identifiers.id; } return this.occurrence.getTableName(); } async execute(options) { const mergedOptions = this.mergeExecuteOptions(options); const tableId = this.getTableId(mergedOptions.useEntityIds); let url; if (this.mode === "byId") { url = `/${this.databaseName}/${tableId}('${this.recordId}')`; } else { if (!this.queryBuilder) { throw new Error("Query builder is required for filter-based delete"); } const queryString = this.queryBuilder.getQueryString(); const queryParams = queryString.startsWith(`/${tableId}`) ? queryString.slice(`/${tableId}`.length) : queryString.startsWith(`/${this.tableName}`) ? queryString.slice(`/${this.tableName}`.length) : queryString; url = `/${this.databaseName}/${tableId}${queryParams}`; } const result = await this.context._makeRequest(url, { method: "DELETE", ...mergedOptions }); if (result.error) { return { data: void 0, error: result.error }; } const response = result.data; let deletedCount = 0; if (typeof response === "number") { deletedCount = response; } else if (response && typeof response === "object") { deletedCount = response.deletedCount || 0; } return { data: { deletedCount }, error: void 0 }; } getRequestConfig() { const tableId = this.getTableId(this.databaseUseEntityIds); let url; if (this.mode === "byId") { url = `/${this.databaseName}/${tableId}('${this.recordId}')`; } else { if (!this.queryBuilder) { throw new Error("Query builder is required for filter-based delete"); } const queryString = this.queryBuilder.getQueryString(); const queryParams = queryString.startsWith(`/${tableId}`) ? queryString.slice(`/${tableId}`.length) : queryString.startsWith(`/${this.tableName}`) ? queryString.slice(`/${this.tableName}`.length) : queryString; url = `/${this.databaseName}/${tableId}${queryParams}`; } return { method: "DELETE", url }; } toRequest(baseUrl) { const config = this.getRequestConfig(); const fullUrl = `${baseUrl}${config.url}`; return new Request(fullUrl, { method: config.method, headers: { Accept: "application/json" } }); } async processResponse(response, options) { const text = await response.text(); if (!text || text.trim() === "") { const affectedRows = response.headers.get("fmodata.affected_rows"); const deletedCount2 = affectedRows ? parseInt(affectedRows, 10) : 1; return { data: { deletedCount: deletedCount2 }, error: void 0 }; } const rawResponse = JSON.parse(text); let deletedCount = 0; if (typeof rawResponse === "number") { deletedCount = rawResponse; } else if (rawResponse && typeof rawResponse === "object") { deletedCount = rawResponse.deletedCount || 0; } return { data: { deletedCount }, error: void 0 }; } } export { DeleteBuilder, ExecutableDeleteBuilder }; //# sourceMappingURL=delete-builder.js.map