@storybooker/azure
Version:
StoryBooker Adapter for interacting with Azure services.
101 lines (100 loc) • 4.06 kB
JavaScript
//#region src/data-tables.ts
var AzureDataTablesDatabaseService = class {
#serviceClient;
#tableClientGenerator;
constructor(serviceClient, tableClientGenerator) {
this.listCollections = async (options) => {
const collections = [];
for await (const table of this.#serviceClient.listTables({ abortSignal: options.abortSignal })) if (table.name) collections.push(table.name);
return collections;
};
this.createCollection = async (collectionId, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
await this.#serviceClient.createTable(tableName, { abortSignal: options.abortSignal });
};
this.hasCollection = async (collectionId, options) => {
try {
const tableName = genTableNameFromCollectionId(collectionId);
const iterator = this.#serviceClient.listTables({
abortSignal: options.abortSignal,
queryOptions: { filter: `TableName eq '${tableName}'` }
});
for await (const table of iterator) if (table.name === collectionId) return true;
return false;
} catch {
return false;
}
};
this.deleteCollection = async (collectionId, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
await this.#serviceClient.deleteTable(tableName, { abortSignal: options.abortSignal });
};
this.listDocuments = async (collectionId, listOptions, options) => {
const { filter, limit, select, sort } = listOptions || {};
const tableName = genTableNameFromCollectionId(collectionId);
const pageIterator = this.#tableClientGenerator(tableName).listEntities({
abortSignal: options.abortSignal,
queryOptions: {
filter: typeof filter === "string" ? filter : void 0,
select
}
}).byPage({ maxPageSize: limit });
const items = [];
for await (const page of pageIterator) for (const entity of page) {
const item = entityToItem(entity);
if (filter && typeof filter === "function") if (filter(item)) items.push(item);
else continue;
else items.push(item);
}
if (sort && typeof sort === "function") items.sort(sort);
return items;
};
this.getDocument = async (collectionId, documentId, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
const entity = await this.#tableClientGenerator(tableName).getEntity(collectionId, documentId, { abortSignal: options.abortSignal });
return entityToItem(entity);
};
this.hasDocument = async (collectionId, documentId, options) => {
try {
return Boolean(await this.getDocument(collectionId, documentId, options));
} catch {
return false;
}
};
this.createDocument = async (collectionId, documentData, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
await this.#tableClientGenerator(tableName).createEntity({
...documentData,
partitionKey: collectionId,
rowKey: documentData.id
}, { abortSignal: options.abortSignal });
};
this.deleteDocument = async (collectionId, documentId, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
await this.#tableClientGenerator(tableName).deleteEntity(collectionId, documentId, { abortSignal: options.abortSignal });
};
this.updateDocument = async (collectionId, documentId, documentData, options) => {
const tableName = genTableNameFromCollectionId(collectionId);
await this.#tableClientGenerator(tableName).updateEntity({
...documentData,
partitionKey: collectionId,
rowKey: documentId
}, "Merge", { abortSignal: options.abortSignal });
};
this.#serviceClient = serviceClient;
this.#tableClientGenerator = tableClientGenerator;
}
};
function genTableNameFromCollectionId(collectionId) {
if (/^[A-Za-z][A-Za-z0-9]{2,62}$/.test(collectionId)) return collectionId;
return collectionId.replaceAll(/\W/g, "").slice(0, 63).padEnd(3, "X");
}
function entityToItem(entity) {
return {
...entity,
id: entity.rowKey || entity.partitionKey || entity.etag
};
}
//#endregion
export { AzureDataTablesDatabaseService };
//# sourceMappingURL=data-tables.js.map