Skip to content

Instantly share code, notes, and snippets.

@shivanshtalwar0
Created January 12, 2025 15:59
Show Gist options
  • Save shivanshtalwar0/676fa30c081cf604c6336e4ab3b0af74 to your computer and use it in GitHub Desktop.
Save shivanshtalwar0/676fa30c081cf604c6336e4ab3b0af74 to your computer and use it in GitHub Desktop.
baseService.js for prisma core tsed-helper
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseService = void 0;
const lodash_1 = __importDefault(require("lodash"));
const rxjs_1 = require("rxjs");
const prismaMetaMapper_1 = require("./prismaMetaMapper");
class BaseService {
token;
injectService;
prismaService;
constructor(token, injectService, prismaService, relativePrismaFilePath) {
this.token = token;
this.injectService = injectService;
this.prismaService = prismaService;
this.prismaFilePath = relativePrismaFilePath ?? "./prisma/schema.prisma";
}
prismaFilePath;
repositoryContainer;
tablesInfo = {};
onUpdate = new rxjs_1.Subject();
onCreate = new rxjs_1.Subject();
onDelete = new rxjs_1.Subject();
get repository() {
return this.repositoryContainer;
}
get fieldNames() {
if (this.repositoryContainer?.collection) {
return Object.keys(this.repositoryContainer.collection.fields);
}
else if (this.repositoryContainer?.fields) {
return Object.keys(this.repositoryContainer.fields);
}
throw new Error('repositoryContainer has no fields, probably you passed wrong repository');
}
get currentModelName() {
if (this.repositoryContainer?.name) {
return this.repositoryContainer.name;
}
if (this.repositoryContainer?.collection?.name) {
return this.repositoryContainer.collection.name;
}
}
get currentModelInfo() {
return this.tablesInfo[this.currentModelName];
}
get currentModelFieldsMapping() {
const { fields } = this.currentModelInfo;
return lodash_1.default.transform(fields, (result, field) => {
result[field.name] = field;
}, {});
}
extend(model, computedFields) {
const data = this.prismaService.$extends({
result: {
[lodash_1.default.camelCase(model)]: computedFields
}
});
console.log(data);
this.repositoryContainer = data[lodash_1.default.camelCase(model)];
}
async $onInit() {
const prismaMapper = new prismaMetaMapper_1.PrismaMetaMapper(this.prismaFilePath);
this.repositoryContainer = this.injectService.get(this.token);
this.tablesInfo = await prismaMapper.getTablesInfo();
}
async create(data) {
const result = await this.repositoryContainer.create({ data });
this.onCreate.next({ data, result });
return result;
}
async deleteItem(id) {
const result = await this.repositoryContainer.delete({ where: { id }, select: { id: true } });
this.onDelete.next({ id, result });
return result;
}
async getOne(id) {
return (await this.repositoryContainer.findFirst({ where: { id } })) || {};
}
async update(id, data, { relationOperation, relationvalueMapper } = {}) {
const defaultRelationValueMapper = (value) => (lodash_1.default.isArray(value) ? lodash_1.default.map(value, (id) => ({ id })) : { id: value });
const dataWithRelations = lodash_1.default.pick(data, this.fieldNames);
const relationData = lodash_1.default.omit(data, this.fieldNames);
const finalData = lodash_1.default.transform(relationData, (result, value, key) => {
if (lodash_1.default.isNil(value)) {
return;
}
result[key] = { [relationOperation ?? 'set']: relationvalueMapper ? relationvalueMapper(value) : defaultRelationValueMapper(value) };
}, {
...dataWithRelations
});
const result = await this.repositoryContainer.update({ where: { id }, data: finalData });
this.onUpdate.next({ id, inputData: data, result });
return result;
}
MODES = {
EQ: 'EQ',
EX: 'EX',
LT: 'LT',
GT: 'GT',
EM: 'EM',
NEM: 'NEM',
RG: 'RG'
};
modeToTypeMappers = {
EM: ({ prismaFilters, value, fieldName, fieldInfo, nestedFieldPath, isRelation }) => {
if (fieldInfo?.type === 'Int' && !fieldInfo?.isRequired) {
lodash_1.default.set(prismaFilters, `${fieldName}`, null);
}
if (fieldInfo?.type === 'String' && !fieldInfo?.isRequired) {
lodash_1.default.set(prismaFilters, `${fieldName}`, null);
}
},
EQ: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (fieldInfo?.type === 'Int') {
lodash_1.default.set(prismaFilters, `${propertyName}.equals`, value);
}
if (fieldInfo?.type === 'DateTime') {
lodash_1.default.set(prismaFilters, `${propertyName}.equals`, value);
}
if (lodash_1.default.isArray(value)) {
if (isRelation) {
lodash_1.default.set(prismaFilters, `${propertyName}.some.id.in`, value);
}
else {
lodash_1.default.set(prismaFilters, `${propertyName}.in`, value);
}
}
if (fieldInfo?.type === 'String' || nestedFieldPath) {
lodash_1.default.set(prismaFilters, `${nestedFieldPath ? nestedFieldPath : propertyName}.contains`, value);
}
},
EX: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (lodash_1.default.isNumber(value)) {
lodash_1.default.set(prismaFilters, `${propertyName}.not.equals`, value);
}
if (fieldInfo?.type === 'DateTime') {
lodash_1.default.set(prismaFilters, `${propertyName}.not.equals`, value);
}
if (lodash_1.default.isArray(value)) {
if (isRelation) {
lodash_1.default.set(prismaFilters, `${propertyName}.none.id.in`, value);
}
else {
lodash_1.default.set(prismaFilters, `${propertyName}.not.in`, value);
}
}
if (lodash_1.default.isString(value)) {
lodash_1.default.set(prismaFilters, `${propertyName}.not.contains`, value);
}
},
LT: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (lodash_1.default.isNumber(value)) {
lodash_1.default.set(prismaFilters, `${propertyName}.lt`, value);
}
if (fieldInfo?.type === 'DateTime') {
lodash_1.default.set(prismaFilters, `${propertyName}.lt`, value);
}
},
GT: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (lodash_1.default.isNumber(value)) {
lodash_1.default.set(prismaFilters, `${propertyName}.gt`, value);
}
if (fieldInfo?.type === 'DateTime') {
lodash_1.default.set(prismaFilters, `${propertyName}.gt`, value);
}
},
NEM: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (fieldInfo?.type === 'Int' && !fieldInfo?.isRequired) {
lodash_1.default.set(prismaFilters, `${propertyName}.not`, null);
}
if (fieldInfo?.type === 'String' && !fieldInfo?.isRequired) {
lodash_1.default.set(prismaFilters, `${propertyName}.not`, null);
}
if (fieldInfo?.type === 'DateTime') {
lodash_1.default.set(prismaFilters, `${propertyName}.not`, null);
}
},
RG: ({ prismaFilters, value, propertyName, fieldInfo, nestedFieldPath, isRelation }) => {
if (lodash_1.default.isArray(value)) {
const [startValue, endValue] = value;
lodash_1.default.set(prismaFilters, `${propertyName}.lte`, endValue);
lodash_1.default.set(prismaFilters, `${propertyName}.gte`, startValue);
}
},
};
modeToFilter(filters) {
return lodash_1.default.transform(filters ?? {}, (finalFilters, filter, fieldName) => {
const { mode, value, isRelation, nestedFieldPath } = filter;
this.modeToTypeMappers[mode]({ prismaFilters: finalFilters, value, propertyName: fieldName, fieldInfo: this.currentModelFieldsMapping[fieldName], isRelation, nestedFieldPath });
}, {});
}
async getAll({ filters, offset, limit, fields, include, orderBy }) {
const properties = {
skip: offset,
take: limit,
include: include,
orderBy: orderBy,
where: this.modeToFilter(filters),
select: lodash_1.default.isNil(fields)
? null
: lodash_1.default.transform(fields, (result, field) => {
result[field] = true;
}, {})
};
const { _count: { id: total } } = await this.repositoryContainer.aggregate({
where: this.modeToFilter(filters),
_count: {
id: true,
}
});
const items = await this.repositoryContainer.findMany(properties);
return {
total,
items
};
}
}
exports.BaseService = BaseService;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment