Created
January 12, 2025 15:59
-
-
Save shivanshtalwar0/676fa30c081cf604c6336e4ab3b0af74 to your computer and use it in GitHub Desktop.
baseService.js for prisma core tsed-helper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"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