UNPKG

typecql

Version:

ORM for CQL databases.

221 lines 11.4 kB
"use strict"; 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