typecql
Version:
ORM for CQL databases.
221 lines • 11.4 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var TypeCQLModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TypeCQLModule = void 0;
const common_1 = require("@nestjs/common");
const cassandra_driver_1 = require("cassandra-driver");
const base_repository_1 = require("./repositories/base-repository");
const GlobalClient_1 = require("./misc/utils/GlobalClient");
const typecql_core_module_1 = require("./typecql.core.module");
const typecql_decorator_functions_1 = require("./meta/typecql.decorator.functions");
const RegisteredEntities_1 = require("./misc/utils/RegisteredEntities");
const settings_1 = require("./misc/utils/settings");
const GlobalFactories_1 = require("./factory/global/GlobalFactories");
let TypeCQLModule = TypeCQLModule_1 = class TypeCQLModule {
/**
* @description (NestJS) Creates new connection client and registers it to NestJS Dependency Injection.
* @param options Object with settings.
* @link https://typecql.com#Installation%20(NestJS)
* @link https://typecql.com#Installation%20(NestJS)%20with%20multiple%20clients
*/
static async forRoot(options) {
const newClient = await this.newClient(options);
const connSettings = new settings_1.Settings();
if (options.camelCaseEnabled) {
connSettings.camelCaseEnabled = true;
}
if (options.autoCreateColumns) {
connSettings.autoCreateColumns = true;
}
if (options.autoCreateTables) {
connSettings.autoCreateTables = true;
}
if (options.logging) {
connSettings.logging = options.logging;
}
GlobalClient_1.GlobalClients.clientsByName.set(options?.connectionName ?? 'default', newClient);
GlobalClient_1.GlobalClients.namesFromClient.set(newClient, options?.connectionName ?? 'default');
if (!RegisteredEntities_1.RegisteredEntities.connections.has(options?.connectionName ?? 'default')) {
RegisteredEntities_1.RegisteredEntities.connections.set(options?.connectionName ?? 'default', new Map());
}
settings_1.GlobalSettings.set(newClient, connSettings);
GlobalFactories_1.GlobalFactories.factories.set(newClient, new Map());
return {
module: typecql_core_module_1.TypecqlCoreModule,
providers: [
{
provide: `TYPECQL_CLIENT_${options?.connectionName ?? 'default'}`,
useValue: newClient,
},
],
exports: [`TYPECQL_CLIENT_${options?.connectionName ?? 'default'}`],
};
}
/**
* @description (NestJS) (Async) Creates new connection client and registers it to NestJS Dependency Injection.
* @param options.useFactory Object with settings.
* @param options.connectionName Connection name. (ONLY FOR MULTIPLE CONNECTIONS CASE)
* @param options.inject NestJS injections array.
* @link https://typecql.com#Installation%20(NestJS)
* @link https://typecql.com#Installation%20(NestJS)%20with%20multiple%20clients
*/
static async forRootAsync(options) {
return {
module: typecql_core_module_1.TypecqlCoreModule,
providers: [
{
provide: `TYPECQL_CLIENT_${options?.connectionName ?? 'default'}`,
useFactory: async (...args) => {
const clientOptions = await options.useFactory(...args);
const newClient = await this.newClient(clientOptions);
const connSettings = new settings_1.Settings();
if (clientOptions.camelCaseEnabled) {
connSettings.camelCaseEnabled = true;
}
if (clientOptions.autoCreateColumns) {
connSettings.autoCreateColumns = true;
}
if (clientOptions.autoCreateTables) {
connSettings.autoCreateTables = true;
}
if (clientOptions.logging) {
connSettings.logging = clientOptions.logging;
}
GlobalClient_1.GlobalClients.clientsByName.set(options?.connectionName ?? 'default', newClient);
GlobalClient_1.GlobalClients.namesFromClient.set(newClient, options?.connectionName ?? 'default');
if (!RegisteredEntities_1.RegisteredEntities.connections.has(options?.connectionName ?? 'default')) {
RegisteredEntities_1.RegisteredEntities.connections.set(options?.connectionName ?? 'default', new Map());
}
settings_1.GlobalSettings.set(newClient, connSettings);
GlobalFactories_1.GlobalFactories.factories.set(newClient, new Map());
return newClient;
},
inject: options.inject || [],
},
],
exports: [`TYPECQL_CLIENT_${options?.connectionName ?? 'default'}`],
};
}
/**
* @description (General) Creates new connection client and registers it to inner store.
* @param options Object with settings.
* @return Promise<Client> - Client object.
* @link https://typecql.com#Installation%20(TypeScript)
* @link https://typecql.com#Installation%20(TypeScript)%20with%20multiple%20clients
*/
static async createClient(options) {
const client = await this.newClient(options);
const connSettings = new settings_1.Settings();
if (options.camelCaseEnabled) {
connSettings.camelCaseEnabled = true;
}
if (options.autoCreateColumns) {
connSettings.autoCreateColumns = true;
}
if (options.autoCreateTables) {
connSettings.autoCreateTables = true;
}
if (options.logging) {
connSettings.logging = options.logging;
}
GlobalClient_1.GlobalClients.clientsByName.set(options?.connectionName ?? 'default', client);
GlobalClient_1.GlobalClients.namesFromClient.set(client, options?.connectionName ?? 'default');
if (!RegisteredEntities_1.RegisteredEntities.connections.has(options?.connectionName ?? 'default')) {
RegisteredEntities_1.RegisteredEntities.connections.set(options?.connectionName ?? 'default', new Map());
}
settings_1.GlobalSettings.set(client, connSettings);
GlobalFactories_1.GlobalFactories.factories.set(client, new Map());
return client;
}
/**
* @description (General) Creates new repository from Class with metadata or returns existing.
* @param entity Class with prepared metadata.
* @param connectionName Connection name (ONLY FOR MULTIPLE CONNECTIONS CASE)
* @link https://typecql.com/#Installation%20(TypeScript)
* @link https://typecql.com/#Installation%20(TypeScript)%20with%20multiple%20clients
* @return
*/
static async getRepository(entity, connectionName) {
const client = GlobalClient_1.GlobalClients.clientsByName.get(connectionName ?? 'default');
if (!client) {
throw new Error('[TYPECQL] - [ERROR]: No client provided!');
}
if (RegisteredEntities_1.RegisteredEntities.getRepository(entity, connectionName)) {
return RegisteredEntities_1.RegisteredEntities.getRepository(entity, connectionName);
}
const repository = await base_repository_1.BaseRepository.create(client, entity);
RegisteredEntities_1.RegisteredEntities.addRepository(entity, repository, connectionName);
return repository;
}
/**
* @description (NestJS) Creates new repositories from Classes with metadata.
* @param entities Classes array with prepared metadata.
* @param connectionName Name of connection (ONLY FOR MULTIPLE CONNECTIONS CASE)
* @link https://typecql.com#Installation%20(NestJS)
* @link https://typecql.com#Installation%20(NestJS)%20with%20multiple%20clients
*/
static forFeature(entities, connectionName) {
const providers = entities.map((entity) => {
return {
provide: `${(0, typecql_decorator_functions_1.getTableName)(entity)}_ENTITY_${connectionName ?? 'default'}`,
useFactory: async (client) => {
const repository = await base_repository_1.BaseRepository.create(client, entity);
RegisteredEntities_1.RegisteredEntities.addRepository(entity, repository, connectionName);
return repository;
},
inject: [`TYPECQL_CLIENT_${connectionName ?? 'default'}`],
};
});
return {
module: TypeCQLModule_1,
providers: [...providers],
exports: [...providers],
};
}
static async newClient(options) {
const client = new cassandra_driver_1.Client(options);
const connSettings = new settings_1.Settings();
if (options.camelCaseEnabled) {
connSettings.camelCaseEnabled = true;
}
if (options.autoCreateColumns) {
connSettings.autoCreateColumns = true;
}
if (options.autoCreateTables) {
connSettings.autoCreateTables = true;
}
if (options.logging) {
connSettings.logging = options.logging;
}
GlobalClient_1.GlobalClients.clientsByName.set(options?.connectionName ?? 'default', client);
GlobalClient_1.GlobalClients.namesFromClient.set(client, options?.connectionName ?? 'default');
if (!RegisteredEntities_1.RegisteredEntities.connections.has(options?.connectionName ?? 'default')) {
RegisteredEntities_1.RegisteredEntities.connections.set(options?.connectionName ?? 'default', new Map());
}
settings_1.GlobalSettings.set(client, connSettings);
GlobalFactories_1.GlobalFactories.factories.set(client, new Map());
connection_cycle: for (let retries = 1; retries <= 3; retries++) {
try {
await client.connect();
break connection_cycle;
}
catch (e) {
common_1.Logger.error(`[TYPECQL] - Can\`t connect to a database. Try number ${retries}`);
common_1.Logger.error(e);
}
await new Promise((resolve) => setTimeout(() => resolve(''), 5000));
}
return client;
}
};
exports.TypeCQLModule = TypeCQLModule;
exports.TypeCQLModule = TypeCQLModule = TypeCQLModule_1 = __decorate([
(0, common_1.Module)({ imports: [typecql_core_module_1.TypecqlCoreModule] })
], TypeCQLModule);
//# sourceMappingURL=typecql.module.js.map