@proofkit/fmodata
Version:
FileMaker OData API client
186 lines (185 loc) • 6.69 kB
JavaScript
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