@hiki9/rich-domain
Version:
Rich Domain is a library that provides a set of tools to help you build complex business logic in NodeJS using Domain Driven Design principles.
124 lines • 4.17 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseQueryWithDots = exports.PrismaRepository = void 0;
const repository_1 = require("../core/application/repository");
const pagination_1 = require("../core/common/pagination");
class PrismaRepository extends repository_1.RepositoryImplementation {
constructor(prisma, adapterToDomain, adapterToPersistence, unitOfWorkService) {
super();
this.prisma = prisma;
this.adapterToDomain = adapterToDomain;
this.adapterToPersistence = adapterToPersistence;
this.unitOfWorkService = unitOfWorkService;
}
getContext(options) {
const unitOfWorkContext = this.unitOfWorkService.getContext();
return unitOfWorkContext || options?.context || this.prisma;
}
generateFindQuery(criteria) {
const query = {};
query.skip = criteria.offset;
query.take = criteria.limit;
const filter = { AND: [] };
if (criteria.businessFilter) {
filter.AND.push(criteria.businessFilter);
}
if (criteria.search) {
query.skip = 0;
filter.AND.push(this.generateSearchQuery(criteria.search));
}
if (criteria.filter) {
filter.AND.push(criteria.filter);
}
if (filter.AND.length > 0)
query.where = filter;
if (criteria.orderBy) {
query.orderBy = criteria.orderBy;
}
return query;
}
async find(criteria) {
const tableName = this.model;
const context = this.getContext();
const query = this.generateFindQuery(criteria);
const [models, total] = await Promise.all([
context[tableName].findMany({
...query,
include: this.findIncludes,
}),
context[tableName].count({ where: query.where }),
]);
const result = models.map((value) => this.adapterToDomain.build(value));
const pagination = new pagination_1.Pagination(criteria, {
result,
total,
});
return pagination;
}
async findById(id) {
const tableName = this.model;
const context = this.getContext();
const query = {};
query.where = { id };
const model = await context[tableName].findUnique({
...query,
include: this.uniqueIncludes,
});
if (!model) {
return null;
}
const domain = this.adapterToDomain.build(model);
return domain;
}
async create(entity, options) {
const tableName = this.model;
const context = this.getContext(options);
const model = this.adapterToPersistence.build(entity);
const query = await context[tableName].create({ data: model });
if (!query) {
throw query;
}
}
async update(entity, options) {
const tableName = this.model;
const context = this.getContext(options);
const model = this.adapterToPersistence.build(entity);
const query = await context[tableName].update({
where: { id: entity.id.value },
data: model,
});
if (!query) {
throw query;
}
}
async delete(entity, options) {
const tableName = this.model;
const context = this.getContext(options);
const query = await context[tableName].delete({
where: { id: entity.id.value },
});
if (!query) {
throw query;
}
}
async forceCloseConnection() {
await this.prisma.$disconnect();
}
}
exports.PrismaRepository = PrismaRepository;
function parseQueryWithDots(field, verb, value) {
const fieldMap = field.split('.');
const m = {};
fieldMap.reduce((acc, curr, index) => {
if (index === fieldMap.length - 1) {
acc[curr] = { [verb]: value };
}
else {
acc[curr] = {};
}
return acc[curr];
}, m);
return m;
}
exports.parseQueryWithDots = parseQueryWithDots;
//# sourceMappingURL=prisma.repository.js.map