@proofkit/fmodata
Version:
FileMaker OData API client
133 lines (132 loc) • 3.88 kB
JavaScript
class SchemaManager {
constructor(databaseName, context) {
this.databaseName = databaseName;
this.context = context;
}
async createTable(tableName, fields, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Tables`,
{
method: "POST",
body: JSON.stringify({
tableName,
fields: fields.map(SchemaManager.compileFieldDefinition)
}),
...options
}
);
if (result.error) {
throw result.error;
}
return result.data;
}
async addFields(tableName, fields, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Tables/${tableName}`,
{
method: "PATCH",
body: JSON.stringify({
fields: fields.map(SchemaManager.compileFieldDefinition)
}),
...options
}
);
if (result.error) {
throw result.error;
}
return result.data;
}
async deleteTable(tableName, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Tables/${tableName}`,
{ method: "DELETE", ...options }
);
if (result.error) {
throw result.error;
}
}
async deleteField(tableName, fieldName, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Tables/${tableName}/${fieldName}`,
{
method: "DELETE",
...options
}
);
if (result.error) {
throw result.error;
}
}
async createIndex(tableName, fieldName, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Indexes/${tableName}`,
{
method: "POST",
body: JSON.stringify({ indexName: fieldName }),
...options
}
);
if (result.error) {
throw result.error;
}
return result.data;
}
async deleteIndex(tableName, fieldName, options) {
const result = await this.context._makeRequest(
`/${this.databaseName}/FileMaker_Indexes/${tableName}/${fieldName}`,
{
method: "DELETE",
...options
}
);
if (result.error) {
throw result.error;
}
}
static compileFieldDefinition(field) {
let type = field.type;
const repetitions = field.repetitions;
if (field.type === "string") {
type = "varchar";
const stringField = field;
if (stringField.maxLength !== void 0) {
type += `(${stringField.maxLength})`;
}
}
if (repetitions !== void 0) {
type += `[${repetitions}]`;
}
const result = {
name: field.name,
type
};
if (field.nullable !== void 0) result.nullable = field.nullable;
if (field.primary !== void 0) result.primary = field.primary;
if (field.unique !== void 0) result.unique = field.unique;
if (field.global !== void 0) result.global = field.global;
if (field.type === "string") {
const stringField = field;
if (stringField.default !== void 0)
result.default = stringField.default;
} else if (field.type === "date") {
const dateField = field;
if (dateField.default !== void 0) result.default = dateField.default;
} else if (field.type === "time") {
const timeField = field;
if (timeField.default !== void 0) result.default = timeField.default;
} else if (field.type === "timestamp") {
const timestampField = field;
if (timestampField.default !== void 0)
result.default = timestampField.default;
} else if (field.type === "container") {
const containerField = field;
if (containerField.externalSecurePath !== void 0)
result.externalSecurePath = containerField.externalSecurePath;
}
return result;
}
}
export {
SchemaManager
};
//# sourceMappingURL=schema-manager.js.map