UNPKG

cosmosdb-adapter

Version:

A Node.js adapter for Cosmos DB with functions commonly (re)implemented in Azure projects.

147 lines (135 loc) 4.41 kB
const { CosmosClient, ItemResponse, FeedResponse, PermissionMode } = require('@azure/cosmos'); class CosmosDbAdapter { /** * @param {string} endpoint * @param {string} key * @param {{ enableEndpointDiscovery: Boolean }} options */ constructor(endpoint, key, options = { enableEndpointDiscorery: true }) { this.client = new CosmosClient({ endpoint, key, connectionPolicy: { enableEndpointDiscovery: options.enableEndpointDiscovery } }); } /** * @param {string} databaseId * @param {string} containerId * @param {string} id * @param {string} partitionValue * @param {object} document * @returns {Promise<ItemResponse<object>>} */ async read(databaseId, containerId, id, partitionValue) { return await this.client .database(databaseId) .container(containerId) .item(id, partitionValue) .read(); } /** * @param {string} databaseId * @param {string} containerId * @param {object} document * @returns {Promise<ItemResponse<object>>} */ async write(databaseId, containerId, document) { return await this.client .database(databaseId) .container(containerId) .items.create(document); } /** * @param {string} databaseId * @param {string} containerId * @param {string} id * @param {string} partitionValue * @param {object} document * @returns {Promise<ItemResponse<object>>} */ async replace(databaseId, containerId, id, partitionValue, document) { return await this.client .database(databaseId) .container(containerId) .item(id, partitionValue) .replace(document); } /** * @param {string} databaseId * @param {string} containerId * @param {string} id * @param {string} partitionValue * @param {object} document * @returns {Promise<ItemResponse<object>>} */ async delete(databaseId, containerId, id, partitionValue) { return await this.client .database(databaseId) .container(containerId) .item(id, partitionValue) .delete(); } /** * @param {string} databaseId * @param {string} containerId * @param {string} idProperty * @param {string} idValue * @param {string} partitionProperty * @param {string} partitionValue * @returns {Promise<FeedResponse<any>>} */ async get(databaseId, containerId, idProperty, idValue, partitionProperty, partitionValue) { let query = `SELECT * FROM ${containerId} as c WHERE c.${idProperty} = '${idValue}' and c.${partitionProperty} = '${partitionValue}'`; return await this.execute(databaseId, containerId, query); } /** * @param {string} databaseId * @param {string} containerId * @param {string} query * @returns {Promise<FeedResponse<any>>} */ async execute(databaseId, containerId, query) { const querySpec = { query: query, parameters: [] }; return await this.client .database(databaseId) .container(containerId) .items.query(querySpec) .fetchAll(); } /** * @param {string} databaseId * @param {string} containerId * @param {string} itemId * @param {string} partitionKey * @param {string} userId * @returns {Promise<object>} */ async getItemReadToken(databaseId, containerId, itemId, partitionKey, userId) { const database = await this.client.database(databaseId); const container = await database.container(containerId); const item = await container.item(itemId, partitionKey); let user; try { const userResponse = await database.users.create({ id: userId }); user = userResponse.user; } catch(err) { user = await database.user(userId); } const permissionDef = { id: `${databaseId}.${containerId}.${partitionKey}.${itemId}.read`, permissionMode: PermissionMode.Read, resource: item.url }; let permission; try { const permissionResponse = await user.permissions.create(permissionDef, { resourceTokenExpirySeconds: 3600 }); permission = permissionResponse.permission; } catch(err) { permission = await user.permission(permissionDef.id); } const { resource: permDef } = await permission.read(); return { [item.url]: permDef._token }; } } module.exports.CosmosDbAdapter = CosmosDbAdapter;