typecql
Version:
ORM for CQL databases.
183 lines • 8.8 kB
JavaScript
"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