UNPKG

burdy

Version:

Open Source Headless Platform

138 lines (137 loc) 6.04 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateMeta = exports.getReplaceChildrenQuery = exports.queryRelationsArray = exports.createRelationsArray = exports.getEnhancedRepository = exports.paginate = void 0; const typeorm_1 = require("typeorm"); const deepmerge_1 = __importDefault(require("deepmerge")); const lodash_1 = __importDefault(require("lodash")); const bad_request_error_1 = __importDefault(require("../errors/bad-request-error")); const paginate = (repository, { perPage = 10, page = 1, query = {} }) => __awaiter(void 0, void 0, void 0, function* () { const [results, count] = yield repository.findAndCount(Object.assign({ skip: perPage * (page - 1), take: perPage }, query)); return { results, paginate: { pageSize: perPage, current: page, total: count, }, }; }); exports.paginate = paginate; const createRelationsArray = (relations) => { if (typeof relations !== 'string') { return []; } return relations.split(','); }; exports.createRelationsArray = createRelationsArray; const queryRelationsArray = (query, relations) => { createRelationsArray(relations).forEach((expand) => { query.leftJoinAndSelect(`user.${expand}`, expand); }); }; exports.queryRelationsArray = queryRelationsArray; // eslint-disable-next-line max-len const getEnhancedRepository = (entityClass, entityManager, connectionName) => { const repository = entityManager ? entityManager.getRepository(entityClass) : (0, typeorm_1.getRepository)(entityClass, connectionName); repository.findOneOrCreate = (options, create = {}) => __awaiter(void 0, void 0, void 0, function* () { let model = yield repository.findOne(options); if (!model) { if (typeof options.where === 'object') { create = (0, deepmerge_1.default)(options.where, create); } model = yield repository.create(create); } return model; }); repository.detach = (id, relation, entityIds) => __awaiter(void 0, void 0, void 0, function* () { yield repository .createQueryBuilder() .relation(relation) .of(id) .remove(entityIds); }); repository.attach = (id, relation, entityIds) => __awaiter(void 0, void 0, void 0, function* () { yield repository .createQueryBuilder() .relation(relation) .of(id) .add(entityIds); }); repository.sync = (id, relation, entityIds) => __awaiter(void 0, void 0, void 0, function* () { const existingRelations = yield repository .createQueryBuilder() .select('id') .relation(relation) .of(id) .loadMany(); const existingIds = existingRelations.map((r) => r.id); const toRemove = lodash_1.default.difference(existingIds, entityIds); const toAdd = lodash_1.default.difference(entityIds, existingIds); yield repository .createQueryBuilder() .relation(relation) .of(id) .addAndRemove(toAdd, toRemove); }); repository.existsGuard = (where) => __awaiter(void 0, void 0, void 0, function* () { const count = yield repository.count({ where }); const validationResult = Array.isArray(where) ? count === where.length : count === 1; if (!validationResult) { throw new bad_request_error_1.default('not_found'); } }); return repository; }; exports.getEnhancedRepository = getEnhancedRepository; const getReplaceChildrenQuery = (table, column, oldVal, newVal) => { const databaseType = (0, typeorm_1.getConnection)().options.type; if (databaseType === 'postgres') { return (`UPDATE "${table}" SET "${column}" = REPLACE("${column}", '${oldVal}', '${newVal}'), ` + `"updatedAt" = CURRENT_TIMESTAMP ` + `WHERE ("${column}" LIKE '${oldVal}' OR "${column}" LIKE '${oldVal}/%')`); } return (`UPDATE ${table} SET ${column} = REPLACE(${column}, '${oldVal}', '${newVal}'), ` + `updatedAt = CURRENT_TIMESTAMP ` + `WHERE (${column} LIKE '${oldVal}' OR ${column} LIKE '${oldVal}/%')`); }; exports.getReplaceChildrenQuery = getReplaceChildrenQuery; const updateMeta = (entityManager, model, object, meta = [], pattern) => __awaiter(void 0, void 0, void 0, function* () { const newMetaObj = {}; meta.forEach((m) => { newMetaObj[m.key] = m; }); object.meta = object.meta.filter((m) => { var _a; return newMetaObj[m.key] || (pattern ? !((_a = m === null || m === void 0 ? void 0 : m.key) === null || _a === void 0 ? void 0 : _a.match(pattern)) : false); }); meta.forEach((m) => { const entityMeta = object.meta.find((n) => n.key === m.key); if (entityMeta) { entityMeta.value = m.value; } else { object.meta.push({ key: m.key, value: m.value, }); } }); yield entityManager.save(model, object); }); exports.updateMeta = updateMeta;