UNPKG

typecql

Version:

ORM for CQL databases.

183 lines 8.8 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 __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var BaseRepository_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseRepository = void 0; const common_1 = require("@nestjs/common"); const cassandra_driver_1 = require("cassandra-driver"); const create_repository_1 = require("./crud/create-repository"); const find_repository_1 = require("./crud/find-repository"); const delete_repository_1 = require("./crud/delete-repository"); const settings_1 = require("../misc/utils/settings"); const formatKeysWithSettings_1 = require("../misc/functions/formating/formatKeysWithSettings"); const EntitiesData_1 = require("../misc/utils/EntitiesData"); const update_repository_1 = require("./crud/update-repository"); const typecql_decorator_functions_1 = require("../meta/typecql.decorator.functions"); const createTableBuilder_1 = require("../entities/functions/createTableBuilder"); const ReverseFields_1 = require("../misc/utils/ReverseFields"); const replaceUpperWithUnderscore_1 = require("../misc/functions/formating/replaceUpperWithUnderscore"); const addColumn_1 = require("../entities/functions/addColumn"); const base_transaction_1 = require("../transactions/base-transaction"); var Mapper = cassandra_driver_1.mapping.Mapper; let BaseRepository = BaseRepository_1 = class BaseRepository { /** * Delete is an async method that takes where, if and fields parameters and executes delete query. * @param parameters parameters to delete query. * @link https://typecql.com/#Delete%20-%20delete */ async delete(parameters) { return this.deleteRepository.delete(parameters); } /** * Insert is an async method that takes options object and data parameter as object or array of objects with entity type. * @param data object or array of objects to be inserted in database. * @param options additional options. * @link https://typecql.com/#Insert%20-%20insert */ async insert(data, options = { returning: false, replace: true, batch: false, ttl: undefined, timestamp: undefined, returnRaw: false, consistency: undefined, }) { return this.createRepository.insert(data, options); } /** * Update is an async method that takes where, if and fields parameters and partial object to update and executes update query. * @param parameters parameters to update query. * @param partialObject object with fields as update values. * @link https://typecql.com/#Update%20-%20update */ async update(parameters, partialObject) { return this.updateRepository.update(parameters, partialObject); } /** * FindMany is an async method that takes where, and select with other options parameters and executes select query. * @param parameters parameters to update query. * @link https://typecql.com/#Select%20-%20findMany */ async findMany(parameters) { return this.findRepository.findMany(parameters); } /** * FindAndCount is an async method that takes where, and select with other options parameters and executes select query. * @param parameters parameters to update query. * @link https://typecql.com/#Select%20-%20findAndCount */ async findAndCount(parameters) { return this.findRepository.findAndCount(parameters); } /** * FindOne is an async method that takes where, and select with other options parameters and executes select query. * @param parameters params to select query. * @link https://typecql.com/#Select%20-%20findOne */ async findOne(parameters) { return this.findRepository.findOne(parameters); } async initialize() { const settings = settings_1.GlobalSettings.get(this.client); this.globalSettings = settings; const tableName = (0, typecql_decorator_functions_1.getTableName)(this.entity); const primaryKeys = (0, typecql_decorator_functions_1.getPrimaryKeyFields)(this.entity).map((item) => (0, formatKeysWithSettings_1.formatKeysWithSettings)({ key: item, forQuery: false, tableName, connSettings: settings, })); if (!tableName) throw new Error('[TYPECQL] - No entity name provided!'); const newMapper = new Mapper(this.client, { models: { [tableName + 'Model']: { tables: [tableName] } }, }); this.primaryKeys = primaryKeys; this.tableName = tableName; this.mapper = newMapper.forModel(tableName); let schema = await this.client .execute(` SELECT column_name, type, kind FROM system_schema.columns WHERE table_name = '${this.tableName}' AND keyspace_name = '${this.client.keyspace}}';`) .then((result) => result.rows); // If schema not exists = no table if (!schema?.length && settings.autoCreateTables) { const query = await (0, createTableBuilder_1.createTableBuilder)(tableName, settings); await this.client.execute(query); schema = await this.client .execute(` SELECT column_name, type, kind FROM system_schema.columns WHERE table_name = '${this.tableName}' AND keyspace_name = '${this.client.keyspace}}';`) .then((result) => result.rows); } else if (settings.autoCreateColumns) { await (0, addColumn_1.addColumns)(tableName, schema, this.client); } for (const [key, columnsKey] of Object.entries((0, typecql_decorator_functions_1.getColumns)(tableName))) { if (key.startsWith('incode')) { continue; } if (!ReverseFields_1.ReverseFields.nameObject?.[tableName]) { ReverseFields_1.ReverseFields.nameObject[tableName] = {}; } let reversedKey = ''; if (columnsKey['hasCustomName']) { reversedKey = columnsKey['field']; } else if (settings.camelCaseEnabled) { reversedKey = (0, replaceUpperWithUnderscore_1.replaceUpperCaseWithUnderscore)(key); } ReverseFields_1.ReverseFields.nameObject[tableName][reversedKey] = key; } this.schemaEntity = schema.reduce((result, row) => { result[row.column_name] = row.type; return result; }, {}); EntitiesData_1.default.entitiesShemes = { ...EntitiesData_1.default.entitiesShemes, [this.tableName]: this.schemaEntity, }; EntitiesData_1.default.primaryKeys = { ...EntitiesData_1.default.primaryKeys, [this.tableName]: this.primaryKeys, }; this.createRepository = new create_repository_1.CreateRepository(this.schemaEntity, this.primaryKeys, this.tableName, this.client); this.findRepository = new find_repository_1.FindRepository(this.tableName, this.client); this.deleteRepository = new delete_repository_1.DeleteRepository(this.tableName, this.client); this.updateRepository = new update_repository_1.UpdateRepository(this.tableName, this.client); } /** * Method, that creates new transaction manager instance * @link https://typecql.com/#Transactions */ createTransaction() { return new base_transaction_1.Transaction(this.client); } constructor(client, entity) { this.client = client; this.entity = entity; } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types static async create(client, entity) { const instance = new BaseRepository_1(client, entity); await instance.initialize(); return instance; } }; exports.BaseRepository = BaseRepository; exports.BaseRepository = BaseRepository = BaseRepository_1 = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [cassandra_driver_1.Client, Function]) ], BaseRepository); //# sourceMappingURL=base-repository.js.map