arkos 1.3.0-canary.8 → 1.3.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/exports/services/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +1 -1
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +1 -1
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/types/base.service.types.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/cjs/types/arkos-config.js.map +1 -1
- package/dist/cjs/types/auth.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js +142 -96
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +4 -9
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/exports/services/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +1 -1
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +1 -1
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/esm/types/arkos-config.js.map +1 -1
- package/dist/esm/types/auth.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js +142 -96
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-hooks-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +4 -9
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/types/exports/services/index.d.ts +2 -2
- package/dist/types/modules/base/types/base.service.types.d.ts +35 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uFAGuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uFAGuD;AAsF9C,sGAxFP,2CAAqB,OAwFO;AAAE,kGAvF9B,uCAAiB,OAuF8B;AApFjD,gFAA2E;AAsClE,sBAtCF,sBAAW,CAsCE;AAAE,4FAtCA,0BAAW,OAsCA;AArCjC,mFAA+E;AA8EtE,uBA9EF,uBAAY,CA8EE;AAAE,6FA9EA,4BAAY,OA8EA;AA7EnC,kEAA8D;AA0C5D,4FA1CO,0BAAW,OA0CP","sourcesContent":["import {\n getFileUploadServices,\n FileUploadService,\n} from \"../../modules/file-upload/file-upload.service\";\nimport { EmailOptions } from \"../../modules/email/email.service\";\nimport authService, { AuthService } from \"../../modules/auth/auth.service\";\nimport emailService, { EmailService } from \"../../modules/email/email.service\";\nimport { BaseService } from \"../../modules/base/base.service\";\nimport {\n ServiceBaseContext,\n BeforeCreateOneHookArgs,\n AfterCreateOneHookArgs,\n BeforeCreateManyHookArgs,\n AfterCreateManyHookArgs,\n BeforeCountHookArgs,\n AfterCountHookArgs,\n BeforeFindManyHookArgs,\n AfterFindManyHookArgs,\n BeforeFindOneHookArgs,\n AfterFindOneHookArgs,\n BeforeUpdateOneHookArgs,\n AfterUpdateOneHookArgs,\n BeforeUpdateManyHookArgs,\n AfterUpdateManyHookArgs,\n BeforeDeleteOneHookArgs,\n AfterDeleteOneHookArgs,\n BeforeDeleteManyHookArgs,\n AfterDeleteManyHookArgs,\n OnCreateOneErrorHookArgs,\n OnCreateManyErrorHookArgs,\n OnCountErrorHookArgs,\n OnFindManyErrorHookArgs,\n OnFindByIdErrorHookArgs,\n OnFindOneErrorHookArgs,\n OnUpdateOneErrorHookArgs,\n OnUpdateManyErrorHookArgs,\n OnDeleteOneErrorHookArgs,\n OnDeleteManyErrorHookArgs,\n} from \"../../modules/base/types/base.service.types\";\n\n/**\n * Authentication service.\n */\nexport { authService, AuthService };\n\n/**\n * Base service.\n */\nexport {\n BaseService,\n ServiceBaseContext,\n BeforeCreateOneHookArgs,\n AfterCreateOneHookArgs,\n BeforeCreateManyHookArgs,\n AfterCreateManyHookArgs,\n BeforeCountHookArgs,\n AfterCountHookArgs,\n BeforeFindManyHookArgs,\n AfterFindManyHookArgs,\n BeforeFindOneHookArgs,\n AfterFindOneHookArgs,\n BeforeUpdateOneHookArgs,\n AfterUpdateOneHookArgs,\n BeforeUpdateManyHookArgs,\n AfterUpdateManyHookArgs,\n BeforeDeleteOneHookArgs,\n AfterDeleteOneHookArgs,\n BeforeDeleteManyHookArgs,\n AfterDeleteManyHookArgs,\n OnCreateOneErrorHookArgs,\n OnCreateManyErrorHookArgs,\n OnCountErrorHookArgs,\n OnFindManyErrorHookArgs,\n OnFindByIdErrorHookArgs,\n OnFindOneErrorHookArgs,\n OnUpdateOneErrorHookArgs,\n OnUpdateManyErrorHookArgs,\n OnDeleteOneErrorHookArgs,\n OnDeleteManyErrorHookArgs,\n};\n\n/**\n * Email service.\n */\nexport { emailService, EmailService, EmailOptions };\n\n/**\n * File upload services.\n */\nexport { getFileUploadServices, FileUploadService };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getAuthRouter=getAuthRouter;const express_1=require("express"),auth_controller_1=require("./auth.controller"),auth_service_1=__importDefault(require("./auth.service")),express_rate_limit_1=__importDefault(require("express-rate-limit")),dynamic_loader_1=require("../../utils/dynamic-loader"),base_middlewares_1=require("../base/base.middlewares"),deepmerge_helper_1=__importDefault(require("../../utils/helpers/deepmerge.helper")),routers_helpers_1=require("../../utils/helpers/routers.helpers"),base_router_helpers_1=require("../base/utils/helpers/base.router.helpers"),router=(0,express_1.Router)();async function getAuthRouter(s){const{interceptors:e,dtos:n,schemas:u,prismaQueryOptions:o,router:l}=(0,dynamic_loader_1.getModuleComponents)("auth"),r=l?.config||{},t=await(0,auth_controller_1.authControllerFactory)(e);if(r?.disable===!0)return router;const a=d=>{const i=s?.validation;if(i?.resolver==="class-validator")return n?.[d];if(i?.resolver==="zod")return u?.[d]};return(0,base_router_helpers_1.isEndpointDisabled)(r,"getMe")||router.get("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"getMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeGetMe),t.getMe,...(0,routers_helpers_1.processMiddleware)(e?.afterGetMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onGetMeError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"updateMe")||router.patch("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("updateMe")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"updateMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeUpdateMe),t.updateMe,...(0,routers_helpers_1.processMiddleware)(e?.afterUpdateMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onUpdateMeError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"deleteMe")||router.delete("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"deleteMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeDeleteMe),t.deleteMe,...(0,routers_helpers_1.processMiddleware)(e?.afterDeleteMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onDeleteMeError,{type:"error"})),(!(0,base_router_helpers_1.isEndpointDisabled)(r,"login")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"logout")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"signup")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"updatePassword"))&&router.use("/auth",(0,express_rate_limit_1.default)((0,deepmerge_helper_1.default)({windowMs:5e3,limit:10,standardHeaders:"draft-7",legacyHeaders:!1,handler:(d,i)=>{i.status(429).json({message:"Too many requests, please try again later"})}},s?.authentication?.requestRateLimitOptions||{}))),(0,base_router_helpers_1.isEndpointDisabled)(r,"login")||router.post("/auth/login",(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("login")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"login"),...(0,routers_helpers_1.processMiddleware)(e?.beforeLogin),t.login,...(0,routers_helpers_1.processMiddleware)(e?.afterLogin),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onLoginError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"logout")||router.delete("/auth/logout",auth_service_1.default.authenticate,...(0,routers_helpers_1.processMiddleware)(e?.beforeLogout),t.logout,...(0,routers_helpers_1.processMiddleware)(e?.afterLogout),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onLogoutError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"signup")||router.post("/auth/signup",(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("signup")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"signup"),...(0,routers_helpers_1.processMiddleware)(e?.beforeSignup),t.signup,...(0,routers_helpers_1.processMiddleware)(e?.afterSignup),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onSignupError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"updatePassword")||router.post("/auth/update-password",auth_service_1.default.authenticate,(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("updatePassword")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"updatePassword"),...(0,routers_helpers_1.processMiddleware)(e?.beforeUpdatePassword),t.updatePassword,...(0,routers_helpers_1.processMiddleware)(e?.afterUpdatePassword),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onUpdatePasswordError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"findManyAuthAction")||router.get("/auth-actions",auth_service_1.default.authenticate,auth_service_1.default.handleAccessControl("View","auth-action"),...(0,routers_helpers_1.processMiddleware)(e?.beforeFindManyAuthAction),t.findManyAuthAction,...(0,routers_helpers_1.processMiddleware)(e?.afterFindManyAuthAction),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onFindManyAuthActionError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"findOneAuthAction")||router.get("/auth-actions",auth_service_1.default.authenticate,auth_service_1.default.handleAccessControl("View","auth-action"),...(0,routers_helpers_1.processMiddleware)(e?.beforeFindOneAuthAction),t.findManyAuthAction,...(0,routers_helpers_1.processMiddleware)(e?.afterFindOneAuthAction),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onFindOneAuthActionError,{type:"error"})),router}
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getAuthRouter=getAuthRouter;const express_1=require("express"),auth_controller_1=require("./auth.controller"),auth_service_1=__importDefault(require("./auth.service")),express_rate_limit_1=__importDefault(require("express-rate-limit")),dynamic_loader_1=require("../../utils/dynamic-loader"),base_middlewares_1=require("../base/base.middlewares"),deepmerge_helper_1=__importDefault(require("../../utils/helpers/deepmerge.helper")),routers_helpers_1=require("../../utils/helpers/routers.helpers"),base_router_helpers_1=require("../base/utils/helpers/base.router.helpers"),router=(0,express_1.Router)();async function getAuthRouter(s){const{interceptors:e,dtos:n,schemas:u,prismaQueryOptions:o,router:l}=(0,dynamic_loader_1.getModuleComponents)("auth")||{},r=l?.config||{},t=await(0,auth_controller_1.authControllerFactory)(e);if(r?.disable===!0)return router;const a=d=>{const i=s?.validation;if(i?.resolver==="class-validator")return n?.[d];if(i?.resolver==="zod")return u?.[d]};return(0,base_router_helpers_1.isEndpointDisabled)(r,"getMe")||router.get("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"getMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeGetMe),t.getMe,...(0,routers_helpers_1.processMiddleware)(e?.afterGetMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onGetMeError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"updateMe")||router.patch("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("updateMe")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"updateMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeUpdateMe),t.updateMe,...(0,routers_helpers_1.processMiddleware)(e?.afterUpdateMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onUpdateMeError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"deleteMe")||router.delete("/users/me",auth_service_1.default.authenticate,(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"deleteMe"),...(0,routers_helpers_1.processMiddleware)(e?.beforeDeleteMe),t.deleteMe,...(0,routers_helpers_1.processMiddleware)(e?.afterDeleteMe),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onDeleteMeError,{type:"error"})),(!(0,base_router_helpers_1.isEndpointDisabled)(r,"login")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"logout")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"signup")||!(0,base_router_helpers_1.isEndpointDisabled)(r,"updatePassword"))&&router.use("/auth",(0,express_rate_limit_1.default)((0,deepmerge_helper_1.default)({windowMs:5e3,limit:10,standardHeaders:"draft-7",legacyHeaders:!1,handler:(d,i)=>{i.status(429).json({message:"Too many requests, please try again later"})}},s?.authentication?.requestRateLimitOptions||{}))),(0,base_router_helpers_1.isEndpointDisabled)(r,"login")||router.post("/auth/login",(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("login")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"login"),...(0,routers_helpers_1.processMiddleware)(e?.beforeLogin),t.login,...(0,routers_helpers_1.processMiddleware)(e?.afterLogin),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onLoginError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"logout")||router.delete("/auth/logout",auth_service_1.default.authenticate,...(0,routers_helpers_1.processMiddleware)(e?.beforeLogout),t.logout,...(0,routers_helpers_1.processMiddleware)(e?.afterLogout),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onLogoutError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"signup")||router.post("/auth/signup",(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("signup")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"signup"),...(0,routers_helpers_1.processMiddleware)(e?.beforeSignup),t.signup,...(0,routers_helpers_1.processMiddleware)(e?.afterSignup),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onSignupError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"updatePassword")||router.post("/auth/update-password",auth_service_1.default.authenticate,(0,base_middlewares_1.handleRequestBodyValidationAndTransformation)(a("updatePassword")),(0,base_middlewares_1.addPrismaQueryOptionsToRequest)(o,"updatePassword"),...(0,routers_helpers_1.processMiddleware)(e?.beforeUpdatePassword),t.updatePassword,...(0,routers_helpers_1.processMiddleware)(e?.afterUpdatePassword),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onUpdatePasswordError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"findManyAuthAction")||router.get("/auth-actions",auth_service_1.default.authenticate,auth_service_1.default.handleAccessControl("View","auth-action"),...(0,routers_helpers_1.processMiddleware)(e?.beforeFindManyAuthAction),t.findManyAuthAction,...(0,routers_helpers_1.processMiddleware)(e?.afterFindManyAuthAction),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onFindManyAuthActionError,{type:"error"})),(0,base_router_helpers_1.isEndpointDisabled)(r,"findOneAuthAction")||router.get("/auth-actions",auth_service_1.default.authenticate,auth_service_1.default.handleAccessControl("View","auth-action"),...(0,routers_helpers_1.processMiddleware)(e?.beforeFindOneAuthAction),t.findManyAuthAction,...(0,routers_helpers_1.processMiddleware)(e?.afterFindOneAuthAction),base_middlewares_1.sendResponse,...(0,routers_helpers_1.processMiddleware)(e?.onFindOneAuthActionError,{type:"error"})),router}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { isEndpointDisabled } from \"../base/utils/helpers/base.router.helpers\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const {\n interceptors,\n dtos,\n schemas,\n prismaQueryOptions,\n router: customRouterModule,\n } = getModuleComponents(\"auth\");\n\n const routerConfig = customRouterModule?.config || {};\n const authController = await authControllerFactory(interceptors);\n\n if (routerConfig?.disable === true) return router;\n\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"getMe\")) {\n router.get(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(interceptors?.beforeGetMe),\n authController.getMe,\n ...processMiddleware(interceptors?.afterGetMe),\n sendResponse,\n ...processMiddleware(interceptors?.onGetMeError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"updateMe\")) {\n router.patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(interceptors?.beforeUpdateMe),\n authController.updateMe,\n ...processMiddleware(interceptors?.afterUpdateMe),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateMeError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"deleteMe\")) {\n router.delete(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(interceptors?.beforeDeleteMe),\n authController.deleteMe,\n ...processMiddleware(interceptors?.afterDeleteMe),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteMeError, { type: \"error\" })\n );\n }\n\n if (\n !isEndpointDisabled<\"auth\">(routerConfig, \"login\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"logout\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"signup\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"updatePassword\")\n ) {\n router.use(\n \"/auth\",\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"login\")) {\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(interceptors?.beforeLogin),\n authController.login,\n ...processMiddleware(interceptors?.afterLogin),\n sendResponse,\n ...processMiddleware(interceptors?.onLoginError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"logout\")) {\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n ...processMiddleware(interceptors?.beforeLogout),\n authController.logout,\n ...processMiddleware(interceptors?.afterLogout),\n sendResponse,\n ...processMiddleware(interceptors?.onLogoutError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"signup\")) {\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(interceptors?.beforeSignup),\n authController.signup,\n ...processMiddleware(interceptors?.afterSignup),\n sendResponse,\n ...processMiddleware(interceptors?.onSignupError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"updatePassword\")) {\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(interceptors?.beforeUpdatePassword),\n authController.updatePassword,\n ...processMiddleware(interceptors?.afterUpdatePassword),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdatePasswordError, {\n type: \"error\",\n })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"findManyAuthAction\"))\n router.get(\n \"/auth-actions\",\n authService.authenticate,\n authService.handleAccessControl(\"View\", \"auth-action\"),\n ...processMiddleware(interceptors?.beforeFindManyAuthAction),\n authController.findManyAuthAction,\n ...processMiddleware(interceptors?.afterFindManyAuthAction),\n sendResponse,\n ...processMiddleware(interceptors?.onFindManyAuthActionError, {\n type: \"error\",\n })\n );\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"findOneAuthAction\"))\n router.get(\n \"/auth-actions\",\n authService.authenticate,\n authService.handleAccessControl(\"View\", \"auth-action\"),\n ...processMiddleware(interceptors?.beforeFindOneAuthAction),\n authController.findManyAuthAction,\n ...processMiddleware(interceptors?.afterFindOneAuthAction),\n sendResponse,\n ...processMiddleware(interceptors?.onFindOneAuthActionError, {\n type: \"error\",\n })\n );\n\n return router;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { isEndpointDisabled } from \"../base/utils/helpers/base.router.helpers\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const {\n interceptors,\n dtos,\n schemas,\n prismaQueryOptions,\n router: customRouterModule,\n } = getModuleComponents(\"auth\") || {};\n\n const routerConfig = customRouterModule?.config || {};\n const authController = await authControllerFactory(interceptors);\n\n if (routerConfig?.disable === true) return router;\n\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"getMe\")) {\n router.get(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(interceptors?.beforeGetMe),\n authController.getMe,\n ...processMiddleware(interceptors?.afterGetMe),\n sendResponse,\n ...processMiddleware(interceptors?.onGetMeError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"updateMe\")) {\n router.patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(interceptors?.beforeUpdateMe),\n authController.updateMe,\n ...processMiddleware(interceptors?.afterUpdateMe),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateMeError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"deleteMe\")) {\n router.delete(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(interceptors?.beforeDeleteMe),\n authController.deleteMe,\n ...processMiddleware(interceptors?.afterDeleteMe),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteMeError, { type: \"error\" })\n );\n }\n\n if (\n !isEndpointDisabled<\"auth\">(routerConfig, \"login\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"logout\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"signup\") ||\n !isEndpointDisabled<\"auth\">(routerConfig, \"updatePassword\")\n ) {\n router.use(\n \"/auth\",\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"login\")) {\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(interceptors?.beforeLogin),\n authController.login,\n ...processMiddleware(interceptors?.afterLogin),\n sendResponse,\n ...processMiddleware(interceptors?.onLoginError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"logout\")) {\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n ...processMiddleware(interceptors?.beforeLogout),\n authController.logout,\n ...processMiddleware(interceptors?.afterLogout),\n sendResponse,\n ...processMiddleware(interceptors?.onLogoutError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"signup\")) {\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(interceptors?.beforeSignup),\n authController.signup,\n ...processMiddleware(interceptors?.afterSignup),\n sendResponse,\n ...processMiddleware(interceptors?.onSignupError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"updatePassword\")) {\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(interceptors?.beforeUpdatePassword),\n authController.updatePassword,\n ...processMiddleware(interceptors?.afterUpdatePassword),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdatePasswordError, {\n type: \"error\",\n })\n );\n }\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"findManyAuthAction\"))\n router.get(\n \"/auth-actions\",\n authService.authenticate,\n authService.handleAccessControl(\"View\", \"auth-action\"),\n ...processMiddleware(interceptors?.beforeFindManyAuthAction),\n authController.findManyAuthAction,\n ...processMiddleware(interceptors?.afterFindManyAuthAction),\n sendResponse,\n ...processMiddleware(interceptors?.onFindManyAuthActionError, {\n type: \"error\",\n })\n );\n\n if (!isEndpointDisabled<\"auth\">(routerConfig, \"findOneAuthAction\"))\n router.get(\n \"/auth-actions\",\n authService.authenticate,\n authService.handleAccessControl(\"View\", \"auth-action\"),\n ...processMiddleware(interceptors?.beforeFindOneAuthAction),\n authController.findManyAuthAction,\n ...processMiddleware(interceptors?.afterFindOneAuthAction),\n sendResponse,\n ...processMiddleware(interceptors?.onFindOneAuthActionError, {\n type: \"error\",\n })\n );\n\n return router;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\nimport { appModules, getModuleComponents } from \"../../utils/dynamic-loader\";\nimport { kebabCase } from \"../../exports/utils\";\nimport {\n invaliAuthTokenError,\n loginRequiredError,\n} from \"./utils/auth-error-objects\";\nimport authActionService from \"./utils/services/auth-action.service\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Object containing a combination of actions per resource, tracked by each set of calls of `authService.handleAccessControl`, this can be accessed through the `authService` object or through the endpoint\n */\n actionsPerResource: Record<string, Set<string>> = {};\n\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\n \"Missing JWT secret on production!\",\n 500,\n {},\n \"MissingJWTOnProduction\"\n );\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Is used by default internally by Arkos under `BaseService` class to check if the password is already hashed.\n *\n * This was just added to prevent unwanted errors when someone just forgets that the `BaseService` class will automatically hash the password field using `authService.hashPassword` by default.\n *\n * So now before `BaseService` hashes it will test it.\n *\n *\n * @param password The password to be tested if is hashed\n * @returns\n */\n isPasswordHashed(password: string) {\n return !Number.isNaN(bcrypt.getRounds(password) * 1);\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Checks if a user has permission for a specific action using static access control rules.\n * Validates user roles against predefined access control configuration.\n *\n * @param user - The user object containing role or roles field\n * @param action - The action being performed\n * @param accessControl - Access control configuration (array of roles or object with action-role mappings)\n * @returns True if user has permission, false otherwise\n * @throws Error if user doesn't have role/roles field\n */\n protected checkStaticAccessControl(\n user: User,\n action: string,\n accessControl: AccessControlConfig\n ) {\n if (!user?.role && !user.roles)\n throw Error(\n \"Validation Error: In order to use static authentication user needs at least role field or roles for multiple roles.\"\n );\n\n let authorizedRoles: string[] = [];\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = Array.isArray(accessControl[action])\n ? accessControl[action]\n : accessControl[action].roles;\n\n const userRoles = Array.isArray(user?.roles) ? user.roles : [user.role];\n\n return !!userRoles.some((role: string) => authorizedRoles.includes(role));\n }\n\n /**\n * Checks if a user has permission for a specific action and resource using dynamic access control.\n * Queries the database to verify user's role permissions.\n *\n * @param userId - The unique identifier of the user\n * @param action - The action being performed\n * @param resource - The resource being accessed\n * @returns Promise resolving to true if user has permission, false otherwise\n */\n protected async checkDynamicAccessControl(\n userId: string,\n action: string,\n resource: string\n ) {\n const prisma = getPrismaInstance();\n return !!(await prisma.userRole.findFirst({\n where: {\n userId,\n role: {\n permissions: {\n some: {\n resource,\n action,\n },\n },\n },\n },\n select: { id: true },\n }));\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resource - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resource: string,\n accessControl?: AccessControlConfig\n ): ArkosRequestHandler {\n authActionService.add(action, resource, accessControl);\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n if (req.user) {\n const user = req.user as User;\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n const notEnoughPermissionsError = new AppError(\n \"You do not have permission to perfom this action\",\n 403,\n {},\n \"NotEnoughPermissions\"\n );\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const hasPermission = await this.checkDynamicAccessControl(\n user.id,\n action,\n resource\n );\n\n if (!hasPermission) return next(notEnoughPermissionsError);\n } else if (configs?.authentication?.mode === \"static\") {\n if (!accessControl) return next(notEnoughPermissionsError);\n\n const hasPermission = this.checkStaticAccessControl(\n user,\n action,\n accessControl\n );\n\n if (!hasPermission) return next(notEnoughPermissionsError);\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token) throw loginRequiredError;\n\n let decoded: AuthJwtPayload | undefined;\n\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw invaliAuthTokenError;\n }\n\n if (!decoded?.id) throw invaliAuthTokenError;\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401,\n {},\n \"UserNoLongerExists\"\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401,\n {},\n \"PasswordChanged\"\n );\n\n req.accessToken = token;\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl?: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n\n /**\n * Creates a permission checker function for a specific action and resource.\n *\n * PS: This method should be called during application initialization to build permission validators.\n *\n *\n * @param action - The action to check permission for (e.g., 'View', 'Create', 'Delete')\n * @param resource - The resource being accessed, must be in kebabCase (e.g., 'user', 'cart-item', 'order')\n * @param accessControl - Access control rules (required for static authentication mode), and it is automatically loaded for known modules such as all prisma models, auth and file-upload.\n * @returns A function that takes a user object and returns a boolean indicating permission status\n *\n * @example\n * ```typescript\n * const hasViewProductPermission = await authService.permission('View', 'product');\n *\n * // Later in handler:\n * const canAccess = await hasViewProductPermission(user);\n * if (canAccess) {\n * // User has permission\n * }\n * ```\n */\n permission(\n action: string,\n resource: string,\n accessControl?: AccessControlConfig\n ) {\n // Check if called during request handling (deep call stack indicates handler execution)\n const stack = new Error().stack;\n\n if (stack?.includes(\"node_modules/express/lib/router/index.js\"))\n throw new Error(\n \"authService.permission() should be called during application initialization level.\"\n );\n\n authActionService.add(action, resource, accessControl);\n\n return async (user: Record<string, any>): Promise<boolean> => {\n // getArkosConfig must not be called the same time as arkos.init()\n const configs = getArkosConfig();\n if (!configs?.authentication)\n throw Error(\n \"Validation Error: Trying to use authService.permission without setting up authentication.\"\n );\n\n if (!user) throw loginRequiredError;\n if (user.isSuperUser) return true;\n\n if (configs?.authentication?.mode === \"dynamic\") {\n return await this.checkDynamicAccessControl(user?.id, action, resource);\n } else if (configs?.authentication?.mode === \"static\") {\n if (!accessControl && appModules.includes(kebabCase(resource)))\n accessControl = getModuleComponents(kebabCase(resource))?.authConfigs\n ?.accessControl;\n\n return (\n !!accessControl &&\n this.checkStaticAccessControl(user as any, action, accessControl)\n );\n }\n return false;\n };\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\nimport { appModules, getModuleComponents } from \"../../utils/dynamic-loader\";\nimport { kebabCase } from \"../../exports/utils\";\nimport {\n invaliAuthTokenError,\n loginRequiredError,\n} from \"./utils/auth-error-objects\";\nimport authActionService from \"./utils/services/auth-action.service\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Object containing a combination of actions per resource, tracked by each set of calls of `authService.handleAccessControl`, this can be accessed through the `authService` object or through the endpoint\n */\n actionsPerResource: Record<string, Set<string>> = {};\n\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\n \"Missing JWT secret on production!\",\n 500,\n {},\n \"MissingJWTOnProduction\"\n );\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Is used by default internally by Arkos under `BaseService` class to check if the password is already hashed.\n *\n * This was just added to prevent unwanted errors when someone just forgets that the `BaseService` class will automatically hash the password field using `authService.hashPassword` by default.\n *\n * So now before `BaseService` hashes it will test it.\n *\n *\n * @param password The password to be tested if is hashed\n * @returns\n */\n isPasswordHashed(password: string) {\n return !Number.isNaN(bcrypt.getRounds(password) * 1);\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Checks if a user has permission for a specific action using static access control rules.\n * Validates user roles against predefined access control configuration.\n *\n * @param user - The user object containing role or roles field\n * @param action - The action being performed\n * @param accessControl - Access control configuration (array of roles or object with action-role mappings)\n * @returns True if user has permission, false otherwise\n * @throws Error if user doesn't have role/roles field\n */\n protected checkStaticAccessControl(\n user: User,\n action: string,\n accessControl: AccessControlConfig\n ) {\n if (!user?.role && !user.roles)\n throw Error(\n \"Validation Error: In order to use static authentication user needs at least role field or roles for multiple roles.\"\n );\n\n let authorizedRoles: string[] = [];\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = Array.isArray(accessControl[action])\n ? accessControl[action]\n : accessControl[action].roles;\n\n const userRoles = Array.isArray(user?.roles) ? user.roles : [user.role];\n\n return !!userRoles.some((role: string) => authorizedRoles.includes(role));\n }\n\n /**\n * Checks if a user has permission for a specific action and resource using dynamic access control.\n * Queries the database to verify user's role permissions.\n *\n * @param userId - The unique identifier of the user\n * @param action - The action being performed\n * @param resource - The resource being accessed\n * @returns Promise resolving to true if user has permission, false otherwise\n */\n protected async checkDynamicAccessControl(\n userId: string,\n action: string,\n resource: string\n ) {\n const prisma = getPrismaInstance();\n return !!(await prisma.userRole.findFirst({\n where: {\n userId,\n role: {\n permissions: {\n some: {\n resource,\n action,\n },\n },\n },\n },\n select: { id: true },\n }));\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resource - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resource: string,\n accessControl?: AccessControlConfig\n ): ArkosRequestHandler {\n authActionService.add(action, resource, accessControl);\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n if (req.user) {\n const user = req.user as User;\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n const notEnoughPermissionsError = new AppError(\n \"You do not have permission to perfom this action\",\n 403,\n {},\n \"NotEnoughPermissions\"\n );\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const hasPermission = await this.checkDynamicAccessControl(\n user.id,\n action,\n resource\n );\n\n if (!hasPermission) return next(notEnoughPermissionsError);\n } else if (configs?.authentication?.mode === \"static\") {\n if (!accessControl) return next(notEnoughPermissionsError);\n\n const hasPermission = this.checkStaticAccessControl(\n user,\n action,\n accessControl\n );\n\n if (!hasPermission) return next(notEnoughPermissionsError);\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token) throw loginRequiredError;\n\n let decoded: AuthJwtPayload | undefined;\n\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw invaliAuthTokenError;\n }\n\n if (!decoded?.id) throw invaliAuthTokenError;\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401,\n {},\n \"UserNoLongerExists\"\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401,\n {},\n \"PasswordChanged\"\n );\n\n req.accessToken = token;\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl?: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n\n /**\n * Creates a permission checker function for a specific action and resource.\n *\n * PS: This method should be called during application initialization to build permission validators.\n *\n * @see {@link https://www.arkosjs.com/docs/advanced-guide/fine-grained-access-control}\n *\n * @param action - The action to check permission for (e.g., 'View', 'Create', 'Delete')\n * @param resource - The resource being accessed, must be in kebabCase (e.g., 'user', 'cart-item', 'order')\n * @param accessControl - Access control rules (required for static authentication mode), and it is automatically loaded for known modules such as all prisma models, auth and file-upload.\n * @returns A function that takes a user object and returns a boolean indicating permission status\n *\n * @example\n * ```typescript\n * const hasViewProductPermission = await authService.permission('View', 'product');\n *\n * // Later in handler:\n * const canAccess = await hasViewProductPermission(user);\n * if (canAccess) {\n * // User has permission\n * }\n * ```\n */\n permission(\n action: string,\n resource: string,\n accessControl?: AccessControlConfig\n ) {\n // Check if called during request handling (deep call stack indicates handler execution)\n const stack = new Error().stack;\n\n if (stack?.includes(\"node_modules/express/lib/router/index.js\"))\n throw new Error(\n \"authService.permission() should be called during application initialization level.\"\n );\n\n authActionService.add(action, resource, accessControl);\n\n return async (user: Record<string, any>): Promise<boolean> => {\n // getArkosConfig must not be called the same time as arkos.init()\n const configs = getArkosConfig();\n if (!configs?.authentication)\n throw Error(\n \"Validation Error: Trying to use authService.permission without setting up authentication.\"\n );\n\n if (!user) throw loginRequiredError;\n if (user.isSuperUser) return true;\n\n if (configs?.authentication?.mode === \"dynamic\") {\n return await this.checkDynamicAccessControl(user?.id, action, resource);\n } else if (configs?.authentication?.mode === \"static\") {\n if (!accessControl && appModules.includes(kebabCase(resource)))\n accessControl = getModuleComponents(kebabCase(resource))?.authConfigs\n ?.accessControl;\n\n return (\n !!accessControl &&\n this.checkStaticAccessControl(user as any, action, accessControl)\n );\n }\n return false;\n };\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.BaseService=void 0;const change_case_helpers_1=require("../../utils/helpers/change-case.helpers"),dynamic_loader_1=require("../../utils/dynamic-loader"),deepmerge_helper_1=__importDefault(require("../../utils/helpers/deepmerge.helper")),base_service_helpers_1=require("./utils/helpers/base.service.helpers"),prisma_helpers_1=require("../../utils/helpers/prisma.helpers"),auth_service_1=__importDefault(require("../auth/auth.service")),service_hooks_manager_1=__importDefault(require("./utils/service-hooks-manager")),prisma_schema_parser_1=__importDefault(require("../../utils/prisma/prisma-schema-parser"));class BaseService{constructor(a){this.modelName=(0,change_case_helpers_1.camelCase)(a);const r=prisma_schema_parser_1.default.getModelRelations(a);this.relationFields={singular:r?.filter(e=>e.isRelation&&!e.isArray)||[],list:r?.filter(e=>e.isRelation&&e.isArray)||[]}}async createOne(a,r,e){const s=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{s?.beforeCreateOne&&!e?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(s.beforeCreateOne,{data:a,queryOptions:r,context:e}),(0,change_case_helpers_1.kebabCase)(this.modelName)==="user"&&a.password&&(auth_service_1.default.isPasswordHashed(a.password)||(a.password=await auth_service_1.default.hashPassword(a.password)));const o=(0,prisma_helpers_1.getPrismaInstance)(),i=(0,base_service_helpers_1.handleRelationFieldsInBody)(a,{...this.relationFields},["delete","disconnect","update"]),d=await o[this.modelName].create((0,deepmerge_helper_1.default)({data:i},r||{}));return s?.afterCreateOne&&!e?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(s.afterCreateOne,{result:d,data:a,queryOptions:r,context:e}),d}catch(o){if(s?.onCreateOneError&&!e?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(s.onCreateOneError,{error:o,data:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw o;return}}async createMany(a,r,e){const s=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{s?.beforeCreateMany&&!e?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(s.beforeCreateMany,{data:a,queryOptions:r,context:e});const o=(0,prisma_helpers_1.getPrismaInstance)(),i=[];if(Array.isArray(a))for(let n=0;n<a.length;n++){const l=a[n];"password"in l&&this.modelName==="user"&&(auth_service_1.default.isPasswordHashed(l.password)||(a[n].password=await auth_service_1.default.hashPassword(l?.password))),i[n]=(0,base_service_helpers_1.handleRelationFieldsInBody)(a[n],{...this.relationFields},["delete","disconnect","update"])}const d=await o[this.modelName].createMany((0,deepmerge_helper_1.default)({data:i},r||{}));return s?.afterCreateMany&&!e?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(s.afterCreateMany,{result:d,data:a,queryOptions:r,context:e}),d}catch(o){if(s?.onCreateManyError&&!e?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(s.onCreateManyError,{error:o,data:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw o;return}}async count(a,r){const e=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{e?.beforeCount&&!r?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(e.beforeCount,{filters:a,context:r});const o=await(0,prisma_helpers_1.getPrismaInstance)()[this.modelName].count({where:a});return e?.afterCount&&!r?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(e.afterCount,{result:o,filters:a,context:r}),o}catch(s){if(e?.onCountError&&!r?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(e.onCountError,{error:s,filters:a,context:r}),r?.throwOnError!==!1)throw s;return 0}}async findMany(a,r,e){const s=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{s?.beforeFindMany&&!e?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(s.beforeFindMany,{filters:a,queryOptions:r,context:e});const i=await(0,prisma_helpers_1.getPrismaInstance)()[this.modelName].findMany((0,deepmerge_helper_1.default)({where:a},r||{}));return s?.afterFindMany&&!e?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(s.afterFindMany,{result:i,filters:a,queryOptions:r,context:e}),i}catch(o){if(s?.onFindManyError&&!e?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(s.onFindManyError,{error:o,filters:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw o;return[]}}async findById(a,r,e){const s=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{s?.beforeFindById&&!e?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(s.beforeFindById,{id:a,queryOptions:r,context:e});const i=await(0,prisma_helpers_1.getPrismaInstance)()[this.modelName].findUnique((0,deepmerge_helper_1.default)({where:{id:a}},r||{}));return s?.afterFindById&&!e?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(s.afterFindById,{result:i,id:a,queryOptions:r,context:e}),i}catch(o){if(s?.onFindByIdError&&!e?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(s.onFindByIdError,{error:o,id:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw o;return}}async findOne(a,r,e){const s=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{s?.beforeFindOne&&!e?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(s.beforeFindOne,{filters:a,queryOptions:r,context:e});const o=(0,prisma_helpers_1.getPrismaInstance)();let i;return Object.keys(a).length===1&&"id"in a&&a.id!=="me"?i=await o[this.modelName].findUnique((0,deepmerge_helper_1.default)({where:a},r||{})):i=await o[this.modelName].findFirst((0,deepmerge_helper_1.default)({where:a},r||{})),s?.afterFindOne&&!e?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(s.afterFindOne,{result:i,filters:a,queryOptions:r,context:e}),i}catch(o){if(s?.onFindOneError&&!e?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(s.onFindOneError,{error:o,filters:a,queryOptions:r,context:e}),e?.throwOnError!==!1)throw o;return}}async updateOne(a,r,e,s){const o=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{o?.beforeUpdateOne&&!s?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(o.beforeUpdateOne,{filters:a,data:r,queryOptions:e,context:s}),(0,change_case_helpers_1.kebabCase)(this.modelName)==="user"&&r?.password&&(auth_service_1.default.isPasswordHashed(r.password)||(r.password=await auth_service_1.default.hashPassword(r?.password)));const i=(0,prisma_helpers_1.getPrismaInstance)(),d=(0,base_service_helpers_1.handleRelationFieldsInBody)(r,{...this.relationFields}),n=await i[this.modelName].update((0,deepmerge_helper_1.default)({where:a,data:d},e||{}));return o?.afterUpdateOne&&!s?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(o.afterUpdateOne,{result:n,filters:a,data:r,queryOptions:e,context:s}),n}catch(i){if(o?.onUpdateOneError&&!s?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(o.onUpdateOneError,{error:i,filters:a,data:r,queryOptions:e,context:s}),s?.throwOnError!==!1)throw i;return}}async updateMany(a,r,e,s){const o=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{o?.beforeUpdateMany&&!s?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(o.beforeUpdateMany,{filters:a,data:r,queryOptions:e,context:s});const i=(0,prisma_helpers_1.getPrismaInstance)();this.modelName==="user"&&"password"in r&&r?.password&&(auth_service_1.default.isPasswordHashed(r.password)||(r.password=await auth_service_1.default.hashPassword(r?.password)));const d=(0,deepmerge_helper_1.default)({data:r},e||{}),n=await i[this.modelName].updateMany((0,deepmerge_helper_1.default)({where:a},d));return o?.afterUpdateMany&&!s?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(o.afterUpdateMany,{result:n,filters:a,data:r,queryOptions:e,context:s}),n}catch(i){if(o?.onUpdateManyError&&!s?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(o.onUpdateManyError,{error:i,filters:a,data:r,queryOptions:e,context:s}),s?.throwOnError!==!1)throw i;return}}async deleteOne(a,r){const e=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{e?.beforeDeleteOne&&!r?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(e.beforeDeleteOne,{filters:a,context:r});const o=await(0,prisma_helpers_1.getPrismaInstance)()[this.modelName].delete({where:a});return e?.afterDeleteOne&&!r?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(e.afterDeleteOne,{result:o,filters:a,context:r}),o}catch(s){if(e?.onDeleteOneError&&!r?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(e.onDeleteOneError,{error:s,filters:a,context:r}),r?.throwOnError!==!1)throw s;return}}async deleteMany(a,r){const e=(0,dynamic_loader_1.getModuleComponents)(this.modelName)?.hooks;try{e?.beforeDeleteMany&&!r?.skip?.includes("before")&&await service_hooks_manager_1.default.handleHook(e.beforeDeleteMany,{filters:a,context:r});const o=await(0,prisma_helpers_1.getPrismaInstance)()[this.modelName].deleteMany({where:a});return e?.afterDeleteMany&&!r?.skip?.includes("after")&&await service_hooks_manager_1.default.handleHook(e.afterDeleteMany,{result:o,filters:a,context:r}),o}catch(s){if(e?.onDeleteManyError&&!r?.skip?.includes("error")&&await service_hooks_manager_1.default.handleHook(e.onDeleteManyError,{error:s,filters:a,context:r}),r?.throwOnError!==!1)throw s;return}}}exports.BaseService=BaseService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCase, kebabCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport {\n ModelDelegate,\n CreateOneData,\n CreateOneOptions,\n CreateOneResult,\n CreateManyData,\n CreateManyOptions,\n CreateManyResult,\n CountFilters,\n FindManyFilters,\n FindManyOptions,\n FindManyResult,\n FindByIdOptions,\n FindByIdResult,\n FindOneFilters,\n FindOneOptions,\n FindOneResult,\n UpdateOneFilters,\n UpdateOneData,\n UpdateOneOptions,\n UpdateOneResult,\n UpdateManyFilters,\n UpdateManyData,\n UpdateManyOptions,\n UpdateManyResult,\n DeleteOneFilters,\n DeleteOneResult,\n DeleteManyFilters,\n DeleteManyResult,\n ServiceBaseContext,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import prisma from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * **Example:** accessing request context in hooks\n *\n * ```ts\n * class ProductService extends BaseService<Product> {\n * async beforeCreateOne(data: CreateOneData<Product>, queryOptions?: CreateOneOptions<Product>, context?: ServiceBaseContext) {\n * // Access current user from request context\n * const userId = context?.req.user?.id;\n * if (userId) {\n * data.createdBy = userId;\n * }\n * }\n * }\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n *\n */\nexport class BaseService<T extends ModelDelegate = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: ModelGroupRelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n const modelFields = prismaSchemaParser.getModelRelations(modelName);\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {CreateOneData<T>} data - The data to create the record with.\n * @param {CreateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<CreateOneResult<T>>} The created record.\n */\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeCreateOne)\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateOne, {\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n const result = await (prisma[this.modelName] as T).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n\n if (serviceHooks?.afterCreateOne)\n await serviceHooksManager.handleHook(serviceHooks.afterCreateOne, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {CreateManyData<T>} data - An array of data to create records with.\n * @param {CreateManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<CreateManyResult<T>>} The result of the createMany operation.\n */\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeCreateMany) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateMany, {\n data,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\"password\" in curr && this.modelName === \"user\") {\n if (!authService.isPasswordHashed(curr.password!)) {\n data[i].password = await authService.hashPassword(curr?.password!);\n }\n }\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n { ...this.relationFields },\n [\"delete\", \"disconnect\", \"update\"]\n );\n }\n }\n\n const result = await (prisma[this.modelName] as T).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n\n if (serviceHooks?.afterCreateMany)\n await serviceHooksManager.handleHook(serviceHooks.afterCreateMany, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {CountFilters<T>} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeCount) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCount, {\n filters,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).count({\n where: filters,\n });\n\n if (serviceHooks?.afterCount) {\n await serviceHooksManager.handleHook(serviceHooks.afterCount, {\n result,\n filters,\n context,\n });\n }\n\n return result;\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {FindManyFilters<T>} filters - The filters to apply to the query.\n * @param {FindManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<FindManyResult<T>>} The found data.\n */\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeFindMany) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindMany, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n\n if (serviceHooks?.afterFindMany)\n await serviceHooksManager.handleHook(serviceHooks.afterFindMany, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {FindByIdOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<FindByIdResult<T>>} The found record or null if not found.\n */\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeFindById) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindById, {\n id,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n\n if (serviceHooks?.afterFindById) {\n await serviceHooksManager.handleHook(serviceHooks.afterFindById, {\n result,\n id,\n queryOptions,\n context,\n });\n }\n\n return result;\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {FindOneFilters<T>} filters - The parameters to find the record by.\n * @param {FindOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<FindOneResult<T>>} The found record or null if not found.\n */\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeFindOne) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindOne, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n let result;\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n )\n result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n else\n result = await (prisma[this.modelName] as T).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n if (serviceHooks?.afterFindOne)\n await serviceHooksManager.handleHook(serviceHooks.afterFindOne, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {UpdateOneFilters<T>} filters - The parameters to find the record by.\n * @param {UpdateOneData<T>} data - The data to update the record with.\n * @param {UpdateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<UpdateOneResult<T>>} The updated record or null if not found.\n */\n async updateOne<TOptions extends UpdateOneOptions<T>>(\n filters: UpdateOneFilters<T>,\n data: UpdateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeUpdateOne)\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateOne, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n const result = await (prisma[this.modelName] as T).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n\n if (serviceHooks?.afterUpdateOne)\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateOne, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {UpdateManyFilters<T>} filters - The filters to identify records to update.\n * @param {UpdateManyData<T>} data - The data to update the records with.\n * @param {UpdateManyOptions<T>} [queryOptions] - Additional query options.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<UpdateManyResult<T>>} The result of the updateMany operation.\n */\n async updateMany<TOptions extends UpdateManyOptions<T>>(\n filters: UpdateManyFilters<T>,\n data: UpdateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeUpdateMany)\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateMany, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n if (\n this.modelName === \"user\" &&\n \"password\" in (data as any) &&\n (data as any)?.password\n ) {\n if (!authService.isPasswordHashed((data as any).password)) {\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n }\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n const result = await (prisma[this.modelName] as T).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n\n if (serviceHooks?.afterUpdateMany)\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateMany, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {DeleteOneFilters<T>} filters - The parameters to find the record by.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<DeleteOneResult<T>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeDeleteOne)\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteOne, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).delete({\n where: filters,\n });\n\n if (serviceHooks?.afterDeleteOne)\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteOne, {\n result,\n filters,\n context,\n });\n\n return result;\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {DeleteManyFilters<T>} filters - The filter to identify records to delete.\n * @param {ServiceBaseContext} [context] - Request context containing req, res, and next for accessing HTTP-specific information.\n * @returns {Promise<DeleteManyResult<T>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (serviceHooks?.beforeDeleteMany)\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteMany, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).deleteMany({\n where: filters,\n });\n\n if (serviceHooks?.afterDeleteMany)\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteMany, {\n result,\n filters,\n context,\n });\n\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCase, kebabCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport {\n ModelDelegate,\n CreateOneData,\n CreateOneOptions,\n CreateOneResult,\n CreateManyData,\n CreateManyOptions,\n CreateManyResult,\n CountFilters,\n FindManyFilters,\n FindManyOptions,\n FindManyResult,\n FindByIdOptions,\n FindByIdResult,\n FindOneFilters,\n FindOneOptions,\n FindOneResult,\n UpdateOneFilters,\n UpdateOneData,\n UpdateOneOptions,\n UpdateOneResult,\n UpdateManyFilters,\n UpdateManyData,\n UpdateManyOptions,\n UpdateManyResult,\n DeleteOneFilters,\n DeleteOneResult,\n DeleteManyFilters,\n DeleteManyResult,\n ServiceBaseContext,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import prisma from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * **Example:** accessing request context in hooks\n *\n * ```ts\n * class ProductService extends BaseService<Product> {\n * async beforeCreateOne(data: CreateOneData<Product>, queryOptions?: CreateOneOptions<Product>, context?: ServiceBaseContext) {\n * // Access current user from request context\n * const userId = context?.user?.id;\n * if (userId) {\n * data.createdBy = userId;\n * }\n * }\n * }\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n *\n */\nexport class BaseService<T extends ModelDelegate = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: ModelGroupRelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n const modelFields = prismaSchemaParser.getModelRelations(modelName);\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {CreateOneData<T>} data - The data to create the record with.\n * @param {CreateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateOneResult<T>>} The created record.\n */\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeCreateOne && !context?.skip?.includes(\"before\"))\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateOne, {\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n const result = await (prisma[this.modelName] as T).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n\n if (serviceHooks?.afterCreateOne && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterCreateOne, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onCreateOneError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onCreateOneError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {CreateManyData<T>} data - An array of data to create records with.\n * @param {CreateManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateManyResult<T>>} The result of the createMany operation.\n */\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCreateMany &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateMany, {\n data,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\"password\" in curr && this.modelName === \"user\") {\n if (!authService.isPasswordHashed(curr.password!)) {\n data[i].password = await authService.hashPassword(\n curr?.password!\n );\n }\n }\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n { ...this.relationFields },\n [\"delete\", \"disconnect\", \"update\"]\n );\n }\n }\n\n const result = await (prisma[this.modelName] as T).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n\n if (serviceHooks?.afterCreateMany && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterCreateMany, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onCreateManyError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onCreateManyError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {CountFilters<T>} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeCount && !context?.skip?.includes(\"before\")) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCount, {\n filters,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).count({\n where: filters,\n });\n\n if (serviceHooks?.afterCount && !context?.skip?.includes(\"after\")) {\n await serviceHooksManager.handleHook(serviceHooks.afterCount, {\n result,\n filters,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onCountError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onCountError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return 0;\n }\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {FindManyFilters<T>} filters - The filters to apply to the query.\n * @param {FindManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindManyResult<T>>} The found data.\n */\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeFindMany && !context?.skip?.includes(\"before\")) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindMany, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n\n if (serviceHooks?.afterFindMany && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterFindMany, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onFindManyError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onFindManyError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return [] as any;\n }\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {FindByIdOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindByIdResult<T>>} The found record or null if not found.\n */\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeFindById && !context?.skip?.includes(\"before\")) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindById, {\n id,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n\n if (serviceHooks?.afterFindById && !context?.skip?.includes(\"after\")) {\n await serviceHooksManager.handleHook(serviceHooks.afterFindById, {\n result,\n id,\n queryOptions,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onFindByIdError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onFindByIdError, {\n error: err,\n id,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {FindOneFilters<T>} filters - The parameters to find the record by.\n * @param {FindOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindOneResult<T>>} The found record or null if not found.\n */\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeFindOne && !context?.skip?.includes(\"before\")) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindOne, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n let result;\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n )\n result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n else\n result = await (prisma[this.modelName] as T).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n if (serviceHooks?.afterFindOne && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterFindOne, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onFindOneError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onFindOneError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {UpdateOneFilters<T>} filters - The parameters to find the record by.\n * @param {UpdateOneData<T>} data - The data to update the record with.\n * @param {UpdateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateOneResult<T>>} The updated record or null if not found.\n */\n async updateOne<TOptions extends UpdateOneOptions<T>>(\n filters: UpdateOneFilters<T>,\n data: UpdateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeUpdateOne && !context?.skip?.includes(\"before\"))\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateOne, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n const result = await (prisma[this.modelName] as T).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n\n if (serviceHooks?.afterUpdateOne && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateOne, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onUpdateOneError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onUpdateOneError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {UpdateManyFilters<T>} filters - The filters to identify records to update.\n * @param {UpdateManyData<T>} data - The data to update the records with.\n * @param {UpdateManyOptions<T>} [queryOptions] - Additional query options.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateManyResult<T>>} The result of the updateMany operation.\n */\n async updateMany<TOptions extends UpdateManyOptions<T>>(\n filters: UpdateManyFilters<T>,\n data: UpdateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeUpdateMany && !context?.skip?.includes(\"before\"))\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateMany, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n if (\n this.modelName === \"user\" &&\n \"password\" in (data as any) &&\n (data as any)?.password\n ) {\n if (!authService.isPasswordHashed((data as any).password)) {\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n }\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n const result = await (prisma[this.modelName] as T).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n\n if (serviceHooks?.afterUpdateMany && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateMany, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onUpdateManyError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onUpdateManyError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {DeleteOneFilters<T>} filters - The parameters to find the record by.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteOneResult<T>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeDeleteOne && !context?.skip?.includes(\"before\"))\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteOne, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).delete({\n where: filters,\n });\n\n if (serviceHooks?.afterDeleteOne && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteOne, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onDeleteOneError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onDeleteOneError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {DeleteManyFilters<T>} filters - The filter to identify records to delete.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteManyResult<T>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (serviceHooks?.beforeDeleteMany && !context?.skip?.includes(\"before\"))\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteMany, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).deleteMany({\n where: filters,\n });\n\n if (serviceHooks?.afterDeleteMany && !context?.skip?.includes(\"after\"))\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteMany, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (serviceHooks?.onDeleteManyError && !context?.skip?.includes(\"error\"))\n await serviceHooksManager.handleHook(serviceHooks.onDeleteManyError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from \"../../../types\";\n\nexport type ModelDelegate = Record<string, any>;\n\n// Create Operations\nexport type CreateOneData<T extends ModelDelegate> = Parameters<\n T[\"create\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type CreateOneOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"create\"]>[0],\n \"data\"\n>;\n\nexport type CreateOneResult<T extends ModelDelegate> =\n T[\"create\"] extends (args: { data: any }) => infer R ? R : any;\n\nexport type CreateManyData<T extends ModelDelegate> = Parameters<\n T[\"createMany\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type CreateManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"createMany\"]>[0],\n \"data\"\n>;\n\nexport type CreateManyResult<T extends ModelDelegate> =\n T[\"createMany\"] extends (args: { data: any }) => infer R ? R : any;\n\n// Read Operations\nexport type CountFilters<T extends ModelDelegate> = Parameters<\n T[\"count\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type FindManyFilters<T extends ModelDelegate> = Parameters<\n T[\"findMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type FindManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"findMany\"]>[0],\n \"where\"\n>;\n\nexport type FindManyResult<\n T extends ModelDelegate,\n TOptions = any,\n> = T[\"findMany\"] extends (args: { where: any } & TOptions) => infer R\n ? R\n : any;\n\nexport type FindByIdOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"findUnique\"]>[0],\n \"where\"\n>;\n\nexport type FindByIdResult<T extends ModelDelegate> =\n T[\"findUnique\"] extends (args: { where: any }) => infer R ? R : any;\n\nexport type FindOneFilters<T extends ModelDelegate> = Parameters<\n T[\"findFirst\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\n// Parameters<T[\"findUnique\"]>[0] extends {\n// where?: infer W;\n// [x: string]: any;\n// }\n// ? W\n// : any;\n\nexport type FindOneOptions<T extends ModelDelegate> =\n | Omit<Parameters<T[\"findFirst\"]>[0], \"where\">\n | Omit<Parameters<T[\"findUnique\"]>[0], \"where\">;\n\nexport type FindOneResult<T extends ModelDelegate> =\n T[\"findFirst\"] extends (args: { where: any }) => infer R\n ? R\n : T[\"findUnique\"] extends (args: { where: any }) => infer R2\n ? R2\n : any;\n\n// Update Operations\nexport type UpdateOneFilters<T extends ModelDelegate> = Parameters<\n T[\"update\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type UpdateOneData<T extends ModelDelegate> = Parameters<\n T[\"update\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type UpdateOneOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"update\"]>[0],\n \"where\" | \"data\"\n>;\n\nexport type UpdateOneResult<T extends ModelDelegate> =\n T[\"update\"] extends (args: { where: any; data: any }) => infer R ? R : any;\n\nexport type UpdateManyFilters<T extends ModelDelegate> = Parameters<\n T[\"updateMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type UpdateManyData<T extends ModelDelegate> = Parameters<\n T[\"updateMany\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type UpdateManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"updateMany\"]>[0],\n \"where\" | \"data\"\n>;\n\nexport type UpdateManyResult<T extends ModelDelegate> =\n T[\"updateMany\"] extends (args: { where: any; data: any }) => infer R\n ? R\n : any;\n\n// Delete Operations\nexport type DeleteOneFilters<T extends ModelDelegate> = Parameters<\n T[\"delete\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type DeleteOneResult<T extends ModelDelegate> = ReturnType<T[\"delete\"]>;\n\nexport type DeleteManyFilters<T extends ModelDelegate> = Parameters<\n T[\"deleteMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : Record<string, any>;\n\nexport type DeleteManyResult<T extends ModelDelegate> = ReturnType<\n T[\"deleteMany\"]\n>;\n\n// Service Hooks types\n\nexport interface ServiceBaseContext {\n user?: User;\n accessToken?: string;\n}\n\nexport interface BeforeCreateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n data: CreateOneData<T>;\n queryOptions?: CreateOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterCreateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: CreateOneResult<T>;\n data: CreateOneData<T>;\n queryOptions?: CreateOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeCreateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n data: CreateManyData<T>;\n queryOptions?: CreateManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterCreateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: CreateManyResult<T>;\n queryOptions?: CreateManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeCountHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters?: CountFilters<T>;\n context?: Context;\n}\n\nexport interface AfterCountHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: number;\n filters?: CountFilters<T>;\n context?: Context;\n}\n\nexport interface BeforeFindManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters?: FindManyFilters<T>;\n queryOptions?: FindManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterFindManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: FindManyResult<T>;\n filters?: FindManyFilters<T>;\n queryOptions?: FindManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeFindOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: FindOneFilters<T>;\n queryOptions?: FindOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterFindOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: FindOneResult<T>;\n filters: FindOneFilters<T>;\n queryOptions?: FindOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeUpdateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: UpdateOneFilters<T>;\n data: UpdateOneData<T>;\n queryOptions?: UpdateOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterUpdateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: UpdateOneResult<T>;\n filters: UpdateOneFilters<T>;\n data: UpdateOneData<T>;\n queryOptions?: UpdateOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeUpdateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: UpdateManyFilters<T>;\n data: UpdateManyData<T>;\n queryOptions?: UpdateManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterUpdateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: UpdateManyResult<T>;\n filters: UpdateManyFilters<T>;\n data: UpdateManyData<T>;\n queryOptions?: UpdateManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeDeleteOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: DeleteOneFilters<T>;\n context?: Context;\n}\n\nexport interface AfterDeleteOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: DeleteOneResult<T>;\n filters: DeleteOneFilters<T>;\n context?: Context;\n}\n\nexport interface BeforeDeleteManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: DeleteManyFilters<T>;\n context?: Context;\n}\n\nexport interface AfterDeleteManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: DeleteManyResult<T>;\n filters: DeleteManyFilters<T>;\n context?: Context;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from \"../../../types\";\n\nexport type ModelDelegate = Record<string, any>;\n\n// Create Operations\nexport type CreateOneData<T extends ModelDelegate> = Parameters<\n T[\"create\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type CreateOneOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"create\"]>[0],\n \"data\"\n>;\n\nexport type CreateOneResult<T extends ModelDelegate> =\n T[\"create\"] extends (args: { data: any }) => infer R ? R : any;\n\nexport type CreateManyData<T extends ModelDelegate> = Parameters<\n T[\"createMany\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type CreateManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"createMany\"]>[0],\n \"data\"\n>;\n\nexport type CreateManyResult<T extends ModelDelegate> =\n T[\"createMany\"] extends (args: { data: any }) => infer R ? R : any;\n\n// Read Operations\nexport type CountFilters<T extends ModelDelegate> = Parameters<\n T[\"count\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type FindManyFilters<T extends ModelDelegate> = Parameters<\n T[\"findMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type FindManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"findMany\"]>[0],\n \"where\"\n>;\n\nexport type FindManyResult<\n T extends ModelDelegate,\n TOptions = any,\n> = T[\"findMany\"] extends (args: { where: any } & TOptions) => infer R\n ? R\n : any;\n\nexport type FindByIdOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"findUnique\"]>[0],\n \"where\"\n>;\n\nexport type FindByIdResult<T extends ModelDelegate> =\n T[\"findUnique\"] extends (args: { where: any }) => infer R ? R : any;\n\nexport type FindOneFilters<T extends ModelDelegate> = Parameters<\n T[\"findFirst\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type FindOneOptions<T extends ModelDelegate> =\n | Omit<Parameters<T[\"findFirst\"]>[0], \"where\">\n | Omit<Parameters<T[\"findUnique\"]>[0], \"where\">;\n\nexport type FindOneResult<T extends ModelDelegate> =\n T[\"findFirst\"] extends (args: { where: any }) => infer R\n ? R\n : T[\"findUnique\"] extends (args: { where: any }) => infer R2\n ? R2\n : any;\n\n// Update Operations\nexport type UpdateOneFilters<T extends ModelDelegate> = Parameters<\n T[\"update\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type UpdateOneData<T extends ModelDelegate> = Parameters<\n T[\"update\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type UpdateOneOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"update\"]>[0],\n \"where\" | \"data\"\n>;\n\nexport type UpdateOneResult<T extends ModelDelegate> =\n T[\"update\"] extends (args: { where: any; data: any }) => infer R ? R : any;\n\nexport type UpdateManyFilters<T extends ModelDelegate> = Parameters<\n T[\"updateMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type UpdateManyData<T extends ModelDelegate> = Parameters<\n T[\"updateMany\"]\n>[0] extends { data: infer D; [x: string]: any }\n ? D\n : any;\n\nexport type UpdateManyOptions<T extends ModelDelegate> = Omit<\n Parameters<T[\"updateMany\"]>[0],\n \"where\" | \"data\"\n>;\n\nexport type UpdateManyResult<T extends ModelDelegate> =\n T[\"updateMany\"] extends (args: { where: any; data: any }) => infer R\n ? R\n : any;\n\n// Delete Operations\nexport type DeleteOneFilters<T extends ModelDelegate> = Parameters<\n T[\"delete\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : any;\n\nexport type DeleteOneResult<T extends ModelDelegate> = ReturnType<T[\"delete\"]>;\n\nexport type DeleteManyFilters<T extends ModelDelegate> = Parameters<\n T[\"deleteMany\"]\n>[0] extends { where?: infer W; [x: string]: any }\n ? W\n : Record<string, any>;\n\nexport type DeleteManyResult<T extends ModelDelegate> = ReturnType<\n T[\"deleteMany\"]\n>;\n\n// Service Hooks types\nexport interface ServiceBaseContext {\n /**\n * The authenticated user making the request\n */\n user?: User;\n\n /**\n * The access token from the request for authorization\n */\n accessToken?: string;\n\n /**\n * Array of hook types to skip for this operation.\n * - \"before\": Skip the before hook (e.g., beforeCreateOne)\n * - \"after\": Skip the after hook (e.g., afterCreateOne)\n * - \"error\": Skip the error hook (e.g., onCreateOneError)\n *\n * @example\n * ```typescript\n * // Skip before and error hooks\n * { skip: [\"before\", \"error\"] }\n *\n * // Skip all hooks\n * { skip: [\"before\", \"after\", \"error\"] }\n * ```\n */\n skip?: (\"before\" | \"after\" | \"error\")[];\n\n /**\n * Whether to re-throw errors after error hooks have been executed.\n * - `true` (default): Error hooks run, then error is re-thrown\n * - `false`: Error hooks run, then method returns fallback value instead of throwing\n * @default true\n * ```\n */\n throwOnError?: boolean;\n}\n\nexport interface BeforeCreateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n data: CreateOneData<T>;\n queryOptions?: CreateOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterCreateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: CreateOneResult<T>;\n data: CreateOneData<T>;\n queryOptions?: CreateOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeCreateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n data: CreateManyData<T>;\n queryOptions?: CreateManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterCreateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: CreateManyResult<T>;\n queryOptions?: CreateManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeCountHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters?: CountFilters<T>;\n context?: Context;\n}\n\nexport interface AfterCountHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: number;\n filters?: CountFilters<T>;\n context?: Context;\n}\n\nexport interface BeforeFindManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters?: FindManyFilters<T>;\n queryOptions?: FindManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterFindManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: FindManyResult<T>;\n filters?: FindManyFilters<T>;\n queryOptions?: FindManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeFindOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: FindOneFilters<T>;\n queryOptions?: FindOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterFindOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: FindOneResult<T>;\n filters: FindOneFilters<T>;\n queryOptions?: FindOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeUpdateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: UpdateOneFilters<T>;\n data: UpdateOneData<T>;\n queryOptions?: UpdateOneOptions<T>;\n context?: Context;\n}\n\nexport interface AfterUpdateOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: UpdateOneResult<T>;\n filters: UpdateOneFilters<T>;\n data: UpdateOneData<T>;\n queryOptions?: UpdateOneOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeUpdateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: UpdateManyFilters<T>;\n data: UpdateManyData<T>;\n queryOptions?: UpdateManyOptions<T>;\n context?: Context;\n}\n\nexport interface AfterUpdateManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: UpdateManyResult<T>;\n filters: UpdateManyFilters<T>;\n data: UpdateManyData<T>;\n queryOptions?: UpdateManyOptions<T>;\n context?: Context;\n}\n\nexport interface BeforeDeleteOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: DeleteOneFilters<T>;\n context?: Context;\n}\n\nexport interface AfterDeleteOneHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: DeleteOneResult<T>;\n filters: DeleteOneFilters<T>;\n context?: Context;\n}\n\nexport interface BeforeDeleteManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n filters: DeleteManyFilters<T>;\n context?: Context;\n}\n\nexport interface AfterDeleteManyHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n result: DeleteManyResult<T>;\n filters: DeleteManyFilters<T>;\n context?: Context;\n}\n\nexport interface OnCreateOneErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeCreateOneHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnCreateManyErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeCreateManyHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnCountErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeCountHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnFindManyErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeFindManyHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnFindByIdErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> {\n error: any;\n id: string | number;\n queryOptions?: FindByIdOptions<T>;\n context?: Context;\n}\n\nexport interface OnFindOneErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeFindOneHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnUpdateOneErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeUpdateOneHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnUpdateManyErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeUpdateManyHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnDeleteOneErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeDeleteOneHookArgs<T, Context> {\n error: any;\n}\n\nexport interface OnDeleteManyErrorHookArgs<\n T extends ModelDelegate,\n Context = ServiceBaseContext,\n> extends BeforeDeleteManyHookArgs<T, Context> {\n error: any;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":";;;;;AAgBA,kDAwHC;AAxID,qCAAiC;AACjC,+DAAiE;AACjE,wEAA+C;AAC/C,sFAA4D;AAE5D,gDAAwB;AACxB,sDAA8B;AAC9B,4FAA6D;AAE7D,+DAAwD;AACxD,yEAAwE;AACxE,6EAAuE;AACvE,mFAA+E;AAE/E,MAAM,MAAM,GAAW,IAAA,gBAAM,GAAE,CAAC;AAEzB,KAAK,UAAU,mBAAmB,CAAC,WAAwB;IAChE,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAEnC,MAAM,gBAAgB,GAAG,IAAA,oCAAmB,EAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,EACF,YAAY,GAAG,EAAS,EACxB,WAAW,GAAG,EAAiB,EAC/B,MAAM,EAAE,kBAAkB,GAC3B,GAAQ,EAAE,CAAC;IAEZ,IAAI,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport authService from \"../auth/auth.service\";\nimport fileUploadController from \"./file-upload.controller\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport path from \"path\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthConfigs } from \"../../types/auth\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\nimport { isEndpointDisabled } from \"../base/utils/helpers/base.router.helpers\";\n\nconst router: Router = Router();\n\nexport async function getFileUploadRouter(arkosConfig: ArkosConfig) {\n const { fileUpload } = arkosConfig;\n\n const moduleComponents = getModuleComponents(\"file-upload\");\n let {\n interceptors = {} as any,\n authConfigs = {} as AuthConfigs,\n router: customRouterModule,\n }: any = {};\n\n if ((moduleComponents)) {\n ({\n interceptors = {},\n authConfigs = {},\n router: customRouterModule,\n } = moduleComponents);\n }\n\n const routerConfig = customRouterModule?.config || {};\n if (routerConfig?.disable === true) return router;\n\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n if (!isEndpointDisabled(routerConfig, \"findFile\")) {\n router.get(\n `${basePathname}*`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(interceptors?.beforeFindFile),\n adjustRequestUrl,\n express.static(\n path.resolve(process.cwd(), fileUpload?.baseUploadDir || \"uploads\"),\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: true,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStaticOptions || {}\n )\n ),\n ...processMiddleware(interceptors?.onFindFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"uploadFile\")) {\n router.post(\n `${basePathname}:fileType`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(interceptors?.beforeUploadFile),\n fileUploadController.uploadFile,\n ...processMiddleware(interceptors?.afterUploadFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUploadFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"updateFile\")) {\n router.patch(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(interceptors?.beforeUpdateFile),\n fileUploadController.updateFile,\n ...processMiddleware(interceptors?.afterUpdateFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"deleteFile\")) {\n router.delete(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(interceptors?.beforeDeleteFile),\n fileUploadController.deleteFile,\n ...processMiddleware(interceptors?.afterDeleteFile),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteFileError, { type: \"error\" })\n );\n }\n\n return router;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-class-validator-json-schemas.js","sourceRoot":"","sources":["../../../../../../../src/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.ts"],"names":[],"mappings":";;;;;AAOA,8EA+CC;AAtDD,2EAA0E;AAC1E,gFAA2E;AAC3E,qDAAqD;AACrD,wEAA0E;AAC1E,sEAAqE;AACrE,4GAAkF;AAE3E,KAAK,UAAU,iCAAiC;IACrD,MAAM,kBAAkB,GAAG;QACzB,GAAG,8BAAkB,CAAC,yBAAyB,EAAE;QACjD,MAAM;KACP,CAAC;IACF,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,IAAA,6BAAY,EACnD,kCAAkC,CACnC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,yDAA4B,EAAC;QAC9C,6BAA6B,EAAE,IAAA,oCAAkB,GAAE;QACnD,+BAA+B,EAAE,sBAAsB;QACvD,gBAAgB,EAAE,uBAAuB;KAC1C,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE;QACzD,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,kBAAkB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACvC,MAAM,gBAAgB,GAAG,IAAA,oCAAmB,EAAC,SAAS,CAAC,CAAC;QAExD,IAAI,gBAAgB,EAAE,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACpE,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,IAAA,iDAAwB,EACzC,OAAO,EACP,SAAS,EACT,KAAK,CACN,CAAC;wBACF,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CACV,iCAAiC,OAAO,IAAI,SAAS,GAAG,EACxD,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { validationMetadatasToSchemas } from \"class-validator-jsonschema\";\nimport { importModule } from \"../../../../../utils/helpers/global.helpers\";\nimport { getMetadataStorage } from \"class-validator\";\nimport { getModuleComponents } from \"../../../../../utils/dynamic-loader\";\nimport { getCorrectJsonSchemaName } from \"../swagger.router.helpers\";\nimport prismaSchemaParser from \"../../../../../utils/prisma/prisma-schema-parser\";\n\nexport async function generateClassValidatorJsonSchemas() {\n const requiredAppModules = [\n ...prismaSchemaParser.getModelsAsArrayOfStrings(),\n \"auth\",\n ];\n const schemas: Record<string, any> = {};\n\n const { defaultMetadataStorage } = await importModule(\n \"class-transformer/cjs/storage.js\"\n );\n\n const jsonSchema = validationMetadatasToSchemas({\n classValidatorMetadataStorage: getMetadataStorage(),\n classTransformerMetadataStorage: defaultMetadataStorage,\n refPointerPrefix: \"#/components/schemas/\",\n });\n\n Object.entries(jsonSchema).forEach(([className, schema]) => {\n schemas[className] = schema;\n });\n\n requiredAppModules.forEach((modelName) => {\n const
|
|
1
|
+
{"version":3,"file":"generate-class-validator-json-schemas.js","sourceRoot":"","sources":["../../../../../../../src/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.ts"],"names":[],"mappings":";;;;;AAOA,8EA+CC;AAtDD,2EAA0E;AAC1E,gFAA2E;AAC3E,qDAAqD;AACrD,wEAA0E;AAC1E,sEAAqE;AACrE,4GAAkF;AAE3E,KAAK,UAAU,iCAAiC;IACrD,MAAM,kBAAkB,GAAG;QACzB,GAAG,8BAAkB,CAAC,yBAAyB,EAAE;QACjD,MAAM;KACP,CAAC;IACF,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,IAAA,6BAAY,EACnD,kCAAkC,CACnC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,yDAA4B,EAAC;QAC9C,6BAA6B,EAAE,IAAA,oCAAkB,GAAE;QACnD,+BAA+B,EAAE,sBAAsB;QACvD,gBAAgB,EAAE,uBAAuB;KAC1C,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE;QACzD,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,kBAAkB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACvC,MAAM,gBAAgB,GAAG,IAAA,oCAAmB,EAAC,SAAS,CAAC,CAAC;QAExD,IAAI,gBAAgB,EAAE,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACpE,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,IAAA,iDAAwB,EACzC,OAAO,EACP,SAAS,EACT,KAAK,CACN,CAAC;wBACF,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CACV,iCAAiC,OAAO,IAAI,SAAS,GAAG,EACxD,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { validationMetadatasToSchemas } from \"class-validator-jsonschema\";\nimport { importModule } from \"../../../../../utils/helpers/global.helpers\";\nimport { getMetadataStorage } from \"class-validator\";\nimport { getModuleComponents } from \"../../../../../utils/dynamic-loader\";\nimport { getCorrectJsonSchemaName } from \"../swagger.router.helpers\";\nimport prismaSchemaParser from \"../../../../../utils/prisma/prisma-schema-parser\";\n\nexport async function generateClassValidatorJsonSchemas() {\n const requiredAppModules = [\n ...prismaSchemaParser.getModelsAsArrayOfStrings(),\n \"auth\",\n ];\n const schemas: Record<string, any> = {};\n\n const { defaultMetadataStorage } = await importModule(\n \"class-transformer/cjs/storage.js\"\n );\n\n const jsonSchema = validationMetadatasToSchemas({\n classValidatorMetadataStorage: getMetadataStorage(),\n classTransformerMetadataStorage: defaultMetadataStorage,\n refPointerPrefix: \"#/components/schemas/\",\n });\n\n Object.entries(jsonSchema).forEach(([className, schema]) => {\n schemas[className] = schema;\n });\n\n requiredAppModules.forEach((modelName) => {\n const moduleComponents = getModuleComponents(modelName);\n\n if (moduleComponents?.dtos) {\n Object.entries(moduleComponents.dtos).forEach(([dtoType, dtoClass]) => {\n if (dtoClass) {\n try {\n const schemaName = getCorrectJsonSchemaName(\n dtoType,\n modelName,\n \"Dto\"\n );\n schemas[schemaName] = jsonSchema[dtoClass.name] || {};\n if (schemas[dtoClass.name]) delete schemas[dtoClass.name];\n } catch (error) {\n console.warn(\n `Failed to generate schema for ${dtoType} ${modelName}:`,\n error\n );\n }\n }\n });\n }\n });\n\n return schemas;\n}\n"]}
|