UNPKG

@storybooker/azure

Version:

StoryBooker Adapter for interacting with Azure services.

101 lines (100 loc) 4.06 kB
//#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