burdy
Version:
Open Source Headless Platform
138 lines (137 loc) • 6.04 kB
JavaScript
;
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;