108 lines
2.7 KiB
JavaScript
108 lines
2.7 KiB
JavaScript
const { Container, ContainerResponse, CosmosClient } = require("@azure/cosmos");
|
|
const { array, mixed, object, string } = require("yup");
|
|
|
|
class CosmosStore {
|
|
/**
|
|
* @constructor
|
|
* @param {string} endpoint - Azure Cosmos Endpoint
|
|
* @param {string} key - Azure Key
|
|
* @param {string} database - Cosmos Database ID
|
|
* @param {string} container - Cosmos Container ID
|
|
* @throws {Error}
|
|
*/
|
|
constructor(endpoint, key, database, container) {
|
|
if (typeof endpoint != "string") throw new Error("Invalid endpoint type");
|
|
if (typeof key != "string") throw new Error("Invalid key type");
|
|
if (typeof database != "string") throw new Error("Invalid database type");
|
|
if (typeof container != "string") throw new Error("Invalid container type");
|
|
|
|
this.$endpoint = endpoint;
|
|
this.$key = key;
|
|
this.$databaseName = database;
|
|
this.$containerName = container;
|
|
|
|
this.$containerRun = null;
|
|
this.$client = new CosmosClient({ endpoint, key });
|
|
}
|
|
|
|
/**
|
|
* Gets a container, create if not exists.
|
|
* @returns {Promise<Container>}
|
|
* @throws {Error}
|
|
*/
|
|
async resolveContainer() {
|
|
if (this.$containerRun) {
|
|
return this.$containerRun;
|
|
} else {
|
|
const { database } = await this.$client.databases.createIfNotExists({
|
|
id: this.$databaseName,
|
|
});
|
|
|
|
const { container } = await database.containers.createIfNotExists({
|
|
id: this.$containerName,
|
|
partitionKey: {
|
|
paths: ["/id"],
|
|
kind: "Hash",
|
|
version: 2,
|
|
},
|
|
});
|
|
|
|
this.$containerRun = container;
|
|
return container;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* List all data in container.
|
|
* @returns {Promise<Array<{ name: string, content: Buffer }>>}
|
|
* @throws {Error}
|
|
*/
|
|
async listData() {
|
|
const c = await this.resolveContainer();
|
|
const list = await c.items.readAll().fetchAll();
|
|
return list.resources;
|
|
}
|
|
|
|
/**
|
|
* Creates a data in container.
|
|
* @param {string} name - Name of the data
|
|
* @param {Buffer} content - Content
|
|
* @throws {Error}
|
|
*/
|
|
async createData(name, content) {
|
|
const c = await this.resolveContainer();
|
|
|
|
const item = {
|
|
id: name,
|
|
content: content,
|
|
};
|
|
|
|
await c.items.create(item);
|
|
}
|
|
|
|
/**
|
|
* Removes a data in container by name.
|
|
* @param {string} name - Name of the data to remove
|
|
* @throws {Error}
|
|
*/
|
|
async removeData(name) {
|
|
const c = await this.resolveContainer();
|
|
await c.item(name).delete();
|
|
}
|
|
|
|
/**
|
|
* Gets a data in container by name.
|
|
* @param {string} name - Name of the data to get
|
|
* @throws {Error}
|
|
*/
|
|
async getData(name) {
|
|
const c = await this.resolveContainer();
|
|
const data = await c.item(name).read();
|
|
|
|
console.log(data);
|
|
return data.content;
|
|
}
|
|
}
|
|
|
|
exports.CosmosStore = CosmosStore;
|