@nestjs-mod/prisma-tools
Version:
Functions and helpers for work with prisma used in NestJS-mod modules
143 lines • 7.2 kB
JavaScript
;
var PrismaToolsService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PrismaToolsService = void 0;
const tslib_1 = require("tslib");
/* eslint-disable @typescript-eslint/no-explicit-any */
const common_1 = require("@nestjs-mod/common");
const common_2 = require("@nestjs/common");
const path_1 = require("path");
const prisma_tools_environments_1 = require("./prisma-tools.environments");
const prisma_tools_errors_1 = require("./prisma-tools.errors");
const ERROR_CODE_P2002 = 'P2002';
const ERROR_CODE_P2025 = 'P2025';
const ERROR_SUBSTRING_RECORD_NOT_FOUND = 'NotFoundError';
const ERROR_SUBSTRING_DELETE_RECORD_NOT_FOUND = 'Record to delete does not exist';
const ERROR_SUBSTRING_UPDATE_RECORD_NOT_FOUND = 'Record to update not found';
let PrismaToolsService = PrismaToolsService_1 = class PrismaToolsService {
constructor(prismaToolsStaticEnvironments) {
this.prismaToolsStaticEnvironments = prismaToolsStaticEnvironments;
this.logger = new common_2.Logger(PrismaToolsService_1.name);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
convertPrismaErrorToDbError(exception) {
try {
const stacktrace = String(exception?.stack || exception)
?.split(`${__dirname}/webpack:/${(0, path_1.basename)(__dirname)}/`)
?.join('');
const originalError = Object.assign(new Error(), { stack: stacktrace });
if (String(exception?.name).startsWith('PrismaClient') || String(exception?.code).startsWith('P')) {
if (exception?.code === 'P2002') {
return {
message: prisma_tools_errors_1.DATABASE_ERROR_ENUM_TITLES[prisma_tools_errors_1.DatabaseErrorEnum.UNIQUE_ERROR],
stacktrace,
code: prisma_tools_errors_1.DatabaseErrorEnum.UNIQUE_ERROR,
metadata: exception?.meta,
originalError,
};
}
if (exception?.code === 'P2025') {
if (exception.meta?.['cause'] === 'Record to update not found.') {
return {
message: prisma_tools_errors_1.DATABASE_ERROR_ENUM_TITLES[prisma_tools_errors_1.DatabaseErrorEnum.INVALID_IDENTIFIER],
stacktrace,
code: prisma_tools_errors_1.DatabaseErrorEnum.INVALID_IDENTIFIER,
metadata: exception?.meta,
originalError,
};
}
const relatedTable = exception.meta?.['cause']?.split(`'`)?.[1];
if (relatedTable && exception.meta?.['modelName']) {
this.logger.debug({
modelName: exception.meta?.['modelName'],
relatedTable,
});
}
return {
message: prisma_tools_errors_1.DATABASE_ERROR_ENUM_TITLES[prisma_tools_errors_1.DatabaseErrorEnum.INVALID_LINKED_TABLE_IDENTIFIER],
stacktrace,
code: prisma_tools_errors_1.DatabaseErrorEnum.INVALID_LINKED_TABLE_IDENTIFIER,
metadata: exception?.meta,
originalError,
};
}
this.logger.error(exception, exception.stack);
return {
message: prisma_tools_errors_1.DATABASE_ERROR_ENUM_TITLES[prisma_tools_errors_1.DatabaseErrorEnum.DATABASE_QUERY_ERROR],
stacktrace,
code: prisma_tools_errors_1.DatabaseErrorEnum.DATABASE_QUERY_ERROR,
metadata: exception?.meta,
originalError,
};
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}
catch (err) {
this.logger.error(err, err.stack);
return {
message: prisma_tools_errors_1.DATABASE_ERROR_ENUM_TITLES[prisma_tools_errors_1.DatabaseErrorEnum.UNHANDLED_ERROR],
code: prisma_tools_errors_1.DatabaseErrorEnum.UNHANDLED_ERROR,
metadata: exception?.meta,
};
}
return null;
}
getFirstSkipFromCurPerPage(args, defaultOptions) {
const curPage = +(args.curPage ||
defaultOptions?.defaultCurPage ||
this.prismaToolsStaticEnvironments.paginationInitialPage ||
1);
const perPage = +(args.perPage ||
defaultOptions?.defaultPerPage ||
this.prismaToolsStaticEnvironments.paginationPerPage ||
5);
const skip = +curPage === 1 ? 0 : +perPage * +curPage - +perPage;
return { take: perPage, skip, curPage, perPage };
}
isErrorOfRecordNotFound(err) {
let str;
try {
str = JSON.stringify(err);
}
catch (error) {
str = String(err);
}
return (String(str).includes(ERROR_SUBSTRING_RECORD_NOT_FOUND) ||
String(str).includes(ERROR_CODE_P2025) ||
String(str).includes(ERROR_SUBSTRING_DELETE_RECORD_NOT_FOUND) ||
String(str).includes(ERROR_SUBSTRING_UPDATE_RECORD_NOT_FOUND));
}
isErrorOfUniqueField(prismaError, field, error, defaultError = null) {
return prismaError.code === ERROR_CODE_P2002 && this.getErrorFields(prismaError).includes(field)
? error
: defaultError;
}
getErrorFields(prismaError) {
// default behavior
if ('target' in prismaError.meta) {
return prismaError.meta?.target.map((field) => field.replace(new RegExp('"', 'ig'), '')) || [];
}
// previewFeatures: ['queryCompiler', 'driverAdapters']
if ('driverAdapterError' in prismaError.meta) {
return (prismaError.meta?.driverAdapterError?.cause?.fields.map((field) => field.replace(new RegExp('"', 'ig'), '')) ||
[]);
}
return prismaError.meta?.cause?.fields.map((field) => field.replace(new RegExp('"', 'ig'), '')) || [];
}
isErrorOfUniqueFields(prismaError, fields, error, defaultError = null) {
return prismaError.code === ERROR_CODE_P2002 &&
fields.filter((field) => this.getErrorFields(prismaError).includes(field)).length === fields.length
? error
: defaultError;
}
isErrorsOfUniqueField(prismaError, errors) {
const firstError = errors.find((error) => this.isErrorOfUniqueField(prismaError, error.field, true));
return firstError ? this.isErrorOfUniqueField(prismaError, firstError.field, firstError.error) : prismaError;
}
};
exports.PrismaToolsService = PrismaToolsService;
exports.PrismaToolsService = PrismaToolsService = PrismaToolsService_1 = tslib_1.__decorate([
(0, common_1.ConfigModel)(),
tslib_1.__metadata("design:paramtypes", [prisma_tools_environments_1.PrismaToolsStaticEnvironments])
], PrismaToolsService);
//# sourceMappingURL=prisma-tools.service.js.map