chroma / clients /js /src /AdminClient.ts
badalsahani's picture
feat: chroma initial deploy
287a0bc
import { Configuration, ApiApi as DefaultApi } from "./generated";
import { handleSuccess, handleError, validateTenantDatabase } from "./utils";
import { ConfigOptions } from './types';
import {
AuthOptions,
ClientAuthProtocolAdapter,
IsomorphicFetchClientAuthProtocolAdapter
} from "./auth";
const DEFAULT_TENANT = "default_tenant"
const DEFAULT_DATABASE = "default_database"
// interface for tenant
interface Tenant {
name: string,
}
// interface for tenant
interface Database {
name: string,
}
export class AdminClient {
/**
* @ignore
*/
private api: DefaultApi & ConfigOptions;
private apiAdapter: ClientAuthProtocolAdapter<any>|undefined;
public tenant: string = DEFAULT_TENANT;
public database: string = DEFAULT_DATABASE;
/**
* Creates a new AdminClient instance.
* @param {Object} params - The parameters for creating a new client
* @param {string} [params.path] - The base path for the Chroma API.
* @returns {AdminClient} A new AdminClient instance.
*
* @example
* ```typescript
* const client = new AdminClient({
* path: "http://localhost:8000"
* });
* ```
*/
constructor({
path,
fetchOptions,
auth,
tenant = DEFAULT_TENANT,
database = DEFAULT_DATABASE
}: {
path?: string,
fetchOptions?: RequestInit,
auth?: AuthOptions,
tenant?: string,
database?: string,
} = {}) {
if (path === undefined) path = "http://localhost:8000";
this.tenant = tenant;
this.database = database;
const apiConfig: Configuration = new Configuration({
basePath: path,
});
if (auth !== undefined) {
this.apiAdapter = new IsomorphicFetchClientAuthProtocolAdapter(new DefaultApi(apiConfig), auth);
this.api = this.apiAdapter.getApi();
} else {
this.api = new DefaultApi(apiConfig);
}
this.api.options = fetchOptions ?? {};
}
/**
* Sets the tenant and database for the client.
*
* @param {Object} params - The parameters for setting tenant and database.
* @param {string} params.tenant - The name of the tenant.
* @param {string} params.database - The name of the database.
*
* @returns {Promise<void>} A promise that returns nothing
* @throws {Error} Any issues
*
* @example
* ```typescript
* await adminClient.setTenant({
* tenant: "my_tenant",
* database: "my_database",
* });
* ```
*/
public async setTenant({
tenant = DEFAULT_TENANT,
database = DEFAULT_DATABASE
}: {
tenant: string,
database?: string,
}): Promise<void> {
await validateTenantDatabase(this, tenant, database);
this.tenant = tenant;
this.database = database;
}
/**
* Sets the database for the client.
*
* @param {Object} params - The parameters for setting the database.
* @param {string} params.database - The name of the database.
*
* @returns {Promise<void>} A promise that returns nothing
* @throws {Error} Any issues
*
* @example
* ```typescript
* await adminClient.setDatabase({
* database: "my_database",
* });
* ```
*/
public async setDatabase({
database = DEFAULT_DATABASE
}: {
database?: string,
}): Promise<void> {
await validateTenantDatabase(this, this.tenant, database);
this.database = database;
}
/**
* Creates a new tenant with the specified properties.
*
* @param {Object} params - The parameters for creating a new tenant.
* @param {string} params.name - The name of the tenant.
*
* @returns {Promise<Tenant>} A promise that resolves to the created tenant.
* @throws {Error} If there is an issue creating the tenant.
*
* @example
* ```typescript
* await adminClient.createTenant({
* name: "my_tenant",
* });
* ```
*/
public async createTenant({
name,
}: {
name: string,
}): Promise<Tenant> {
const newTenant = await this.api
.createTenant({name}, this.api.options)
.then(handleSuccess)
.catch(handleError);
// newTenant is null if successful
if (newTenant && newTenant.error) {
throw new Error(newTenant.error);
}
return {name: name} as Tenant
}
/**
* Gets a tenant with the specified properties.
*
* @param {Object} params - The parameters for getting a tenant.
* @param {string} params.name - The name of the tenant.
*
* @returns {Promise<Tenant>} A promise that resolves to the tenant.
* @throws {Error} If there is an issue getting the tenant.
*
* @example
* ```typescript
* await adminClient.getTenant({
* name: "my_tenant",
* });
* ```
*/
public async getTenant({
name,
}: {
name: string,
}): Promise<Tenant> {
const getTenant = await this.api
.getTenant(name, this.api.options)
.then(handleSuccess)
.catch(handleError);
if (getTenant.error) {
throw new Error(getTenant.error);
}
return {name: getTenant.name} as Tenant
}
/**
* Creates a new database with the specified properties.
*
* @param {Object} params - The parameters for creating a new database.
* @param {string} params.name - The name of the database.
* @param {string} params.tenantName - The name of the tenant.
*
* @returns {Promise<Database>} A promise that resolves to the created database.
* @throws {Error} If there is an issue creating the database.
*
* @example
* ```typescript
* await adminClient.createDatabase({
* name: "my_database",
* tenantName: "my_tenant",
* });
* ```
*/
public async createDatabase({
name,
tenantName
}: {
name: string,
tenantName: string,
}): Promise<Database> {
const newDatabase = await this.api
.createDatabase(tenantName, {name}, this.api.options)
.then(handleSuccess)
.catch(handleError);
// newDatabase is null if successful
if (newDatabase && newDatabase.error) {
throw new Error(newDatabase.error);
}
return {name: name} as Database
}
/**
* Gets a database with the specified properties.
*
* @param {Object} params - The parameters for getting a database.
* @param {string} params.name - The name of the database.
* @param {string} params.tenantName - The name of the tenant.
*
* @returns {Promise<Database>} A promise that resolves to the database.
* @throws {Error} If there is an issue getting the database.
*
* @example
* ```typescript
* await adminClient.getDatabase({
* name: "my_database",
* tenantName: "my_tenant",
* });
* ```
*/
public async getDatabase({
name,
tenantName
}: {
name: string,
tenantName: string,
}): Promise<Database> {
const getDatabase = await this.api
.getDatabase(name, tenantName, this.api.options)
.then(handleSuccess)
.catch(handleError);
if (getDatabase.error) {
throw new Error(getDatabase.error);
}
return {name: getDatabase.name} as Database
}
}