arkos 1.0.1-beta → 1.0.2-alpha
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/README.md +2 -2
- package/dist/cjs/app.js +1 -1
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/services/index.js +3 -3
- package/dist/cjs/exports/services/index.js.map +1 -1
- package/dist/cjs/modules/auth/__tests__/auth.controller.test.js +0 -1
- package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +1 -1
- package/dist/cjs/modules/auth/__tests__/auth.service.test.js +470 -0
- package/dist/cjs/modules/auth/__tests__/auth.service.test.js.map +1 -0
- package/dist/cjs/modules/auth/auth.service.js +30 -9
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/email/email.service.js +12 -7
- package/dist/cjs/modules/email/email.service.js.map +1 -1
- package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js +402 -0
- package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js.map +1 -0
- package/dist/cjs/modules/file-uploader/file-uploader.controller.js +226 -0
- package/dist/cjs/modules/file-uploader/file-uploader.controller.js.map +1 -0
- package/dist/cjs/modules/file-uploader/file-uploader.router.js +50 -0
- package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -0
- package/dist/cjs/modules/file-uploader/file-uploader.service.js +299 -0
- package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -0
- package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js +164 -0
- package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js.map +1 -0
- package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js +85 -0
- package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -0
- package/dist/cjs/server.js +1 -1
- package/dist/cjs/server.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/types/index.js.map +1 -1
- package/dist/cjs/utils/helpers/models.helpers.js +19 -6
- package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
- package/dist/es2020/app.js +1 -1
- package/dist/es2020/app.js.map +1 -1
- package/dist/es2020/exports/services/index.js +1 -1
- package/dist/es2020/exports/services/index.js.map +1 -1
- package/dist/es2020/modules/auth/auth.service.js +30 -9
- package/dist/es2020/modules/auth/auth.service.js.map +1 -1
- package/dist/es2020/modules/email/email.service.js +12 -7
- package/dist/es2020/modules/email/email.service.js.map +1 -1
- package/dist/es2020/modules/file-uploader/file-uploader.controller.js +220 -0
- package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -0
- package/dist/es2020/modules/file-uploader/file-uploader.router.js +44 -0
- package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -0
- package/dist/es2020/modules/file-uploader/file-uploader.service.js +291 -0
- package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -0
- package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js +77 -0
- package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -0
- package/dist/es2020/server.js +1 -1
- package/dist/es2020/server.js.map +1 -1
- package/dist/es2020/types/arkos-config.js.map +1 -1
- package/dist/es2020/types/auth.js.map +1 -1
- package/dist/es2020/types/index.js.map +1 -1
- package/dist/es2020/utils/helpers/models.helpers.js +19 -6
- package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
- package/dist/types/exports/services/index.d.ts +1 -1
- package/dist/types/modules/email/email.service.d.ts +1 -2
- package/dist/types/modules/file-uploader/file-uploader.controller.d.ts +3 -0
- package/dist/types/modules/file-uploader/file-uploader.router.d.ts +3 -0
- package/dist/types/modules/file-uploader/file-uploader.service.d.ts +30 -0
- package/dist/types/modules/file-uploader/utils/helpers/file-uploader.helpers.d.ts +2 -0
- package/dist/types/types/arkos-config.d.ts +8 -1
- package/dist/types/types/auth.d.ts +2 -2
- package/dist/types/types/index.d.ts +1 -0
- package/package.json +6 -7
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Arkos
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### The Express And Prisma Framework For RESTful API
|
|
6
6
|
|
|
7
7
|
Used to simplify the development of a secure and scalable RESTful API with minimal configuration, allowing developers to focus on what really matters for the business
|
|
8
8
|
|
|
@@ -54,7 +54,7 @@ That's it! Your RESTful API is ready to use.
|
|
|
54
54
|
|
|
55
55
|
## Documentation
|
|
56
56
|
|
|
57
|
-
For detailed documentation, visit our [official docs](https://
|
|
57
|
+
For detailed documentation, visit our [official docs](https://arkosjs.com/docs/intro).
|
|
58
58
|
|
|
59
59
|
## License
|
|
60
60
|
|
package/dist/cjs/app.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,i,r){r===void 0&&(r=i);var l=Object.getOwnPropertyDescriptor(t,i);(!l||("get"in l?!t.__esModule:l.writable||l.configurable))&&(l={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,r,l)}:function(e,t,i,r){r===void 0&&(r=i),e[r]=t[i]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(i){var r=[];for(var l in i)Object.prototype.hasOwnProperty.call(i,l)&&(r[r.length]=l);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var i={};if(t!=null)for(var r=e(t),l=0;l<r.length;l++)r[l]!=="default"&&__createBinding(i,t,r[l]);return __setModuleDefault(i,t),i}}(),__awaiter=this&&this.__awaiter||function(e,t,i,r){function l(u){return u instanceof i?u:new i(function(d){d(u)})}return new(i||(i=Promise))(function(u,d){function o(s){try{n(r.next(s))}catch(a){d(a)}}function c(s){try{n(r.throw(s))}catch(a){d(a)}}function n(s){s.done?u(s.value):l(s.value).then(o,c)}n((r=r.apply(e,t||[])).next())})},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.bootstrap=bootstrap;const express_1=__importDefault(require("express")),cors_1=__importDefault(require("cors")),cookie_parser_1=__importDefault(require("cookie-parser")),auth_router_1=require("./modules/auth/auth.router"),base_router_1=require("./modules/base/base.router"),error_handler_controller_1=__importDefault(require("./modules/error-handler/error-handler.controller")),express_rate_limit_1=require("express-rate-limit"),path_1=__importDefault(require("path")),dotenv=__importStar(require("dotenv")),compression_1=__importDefault(require("compression")),base_middlewares_1=require("./modules/base/base.middlewares"),prisma_helpers_1=require("./utils/helpers/prisma.helpers"),file_uploader_router_1=require("./modules/file-uploader/file-uploader.router"),query_parser_helpers_1=require("./utils/helpers/query-parser.helpers"),deepmerge_helper_1=__importDefault(require("./utils/helpers/deepmerge.helper")),ENV=process.env.NODE_ENV;let envPath=".env";ENV==="production"?envPath=path_1.default.resolve(process.cwd(),".env.production"):ENV==="staging"?envPath=path_1.default.resolve(process.cwd(),".env.staging"):ENV==="development"?envPath=path_1.default.resolve(process.cwd(),".env.development"):ENV==="local"?envPath=path_1.default.resolve(process.cwd(),".env.local"):ENV==="test"?envPath=path_1.default.resolve(process.cwd(),".env.test"):ENV==="qa"&&(envPath=path_1.default.resolve(process.cwd(),".env.qa")),dotenv.config({path:envPath});const app=(0,express_1.default)();function bootstrap(e){return __awaiter(this,void 0,void 0,function*(){var t,i,r;yield(0,prisma_helpers_1.loadPrismaModule)(),e.configureApp&&(yield e.configureApp(app));const l=e?.middlewares,u=l?.disable||[],d=l?.replace||{};u.includes("compression")||app.use(d.compression||(0,compression_1.default)(e?.compressionOptions)),u.includes("global-rate-limit")||app.use(d.globalRateLimit||(0,express_rate_limit_1.rateLimit)((0,deepmerge_helper_1.default)({windowMs:60*1e3,limit:1e3,standardHeaders:"draft-7",legacyHeaders:!1},e?.globalRequestRateLimitOptions||{}))),u.includes("cors")||app.use(d.cors||(0,cors_1.default)(!((t=e?.cors)===null||t===void 0)&&t.customHandler?e.cors.customHandler:(0,deepmerge_helper_1.default)({origin:(s,a)=>{var v;const p=(v=e?.cors)===null||v===void 0?void 0:v.allowedOrigins;p==="*"?a(null,!0):Array.isArray(p)?a(null,!s||p.includes(s)):typeof p=="string"?a(null,!s||p===s):a(null,!1)},methods:["GET","POST","PUT","DELETE","PATCH","OPTIONS"],allowedHeaders:["Content-Type","Authorization","Connection"],credentials:!0},((i=e?.cors)===null||i===void 0?void 0:i.options)||{}))),u.includes("express-json")||app.use(d.expressJson||express_1.default.json(e?.jsonBodyParserOptions)),u.includes("cookie-parser")||app.use(d.cookieParser||(0,cookie_parser_1.default)(...e?.cookieParserParameters||[])),u.includes("query-parser")||app.use(d.queryParser||(0,query_parser_helpers_1.queryParser)((0,deepmerge_helper_1.default)({parseNull:!0,parseUndefined:!0,parseBoolean:!0},e?.queryParserOptions||{}))),u.includes("database-connection")||app.use(d.databaseConnection||prisma_helpers_1.checkDatabaseConnection),u.includes("request-logger")||app.use(d.requestLogger||base_middlewares_1.handleRequestLogs),!((r=e?.middlewares)===null||r===void 0)&&r.additionals&&e.middlewares.additionals.forEach(s=>{app.use(s)});const o=e?.routers,c=o?.disable||[],n=o?.replace||{};if(c.includes("welcome-endpoint")||app.get("/api",n.welcomeEndpoint||((s,a)=>{a.status(200).json({message:e.welcomeMessage})})),!c.includes("file-uploader")){const s=n.fileUploader?yield n.fileUploader(e):yield(0,file_uploader_router_1.getFileUploaderRouter)(e);app.use("/api",s)}if(!c.includes("auth-router")&&e.authentication){const s=n.authRouter?yield n.authRouter(e):yield(0,auth_router_1.getAuthRouter)(e);app.use("/api",s)}if(!c.includes("prisma-models-router")){const s=n.prismaModelsRouter?yield n.prismaModelsRouter(e):yield(0,base_router_1.getPrismaModelsRouter)();app.use("/api",s)}return app.use("/api",(0,base_router_1.getAvailableResourcesAndRoutesRouter)()),o?.additionals&&o.additionals.forEach(s=>{app.use(s)}),u.includes("global-error-handler")||app.use(d.globalErrorHandler||error_handler_controller_1.default),app})}
|
package/dist/cjs/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import express from \"express\";\nimport cors from \"cors\";\nimport cookieParser from \"cookie-parser\";\nimport { getAuthRouter } from \"./modules/auth/auth.router\";\nimport {\n getPrismaModelsRouter,\n getAvailableResourcesAndRoutesRouter,\n} from \"./modules/base/base.router\";\nimport errorHandler from \"./modules/error-handler/error-handler.controller\";\nimport { rateLimit } from \"express-rate-limit\";\nimport path from \"path\";\nimport * as dotenv from \"dotenv\";\nimport compression from \"compression\";\nimport { handleRequestLogs } from \"./modules/base/base.middlewares\";\nimport {\n checkDatabaseConnection,\n loadPrismaModule,\n} from \"./utils/helpers/prisma.helpers\";\nimport { getFileUploaderRouter } from \"./modules/file-upload/file-upload.router\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport { queryParser } from \"./utils/helpers/query-parser.helpers\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\n\nconst ENV = process.env.NODE_ENV;\nlet envPath = \".env\";\n\n// Default to `.env.local` if available in any environment\nif (ENV === \"production\") {\n envPath = path.resolve(process.cwd(), \".env.production\");\n} else if (ENV === \"staging\") {\n envPath = path.resolve(process.cwd(), \".env.staging\");\n} else if (ENV === \"development\") {\n envPath = path.resolve(process.cwd(), \".env.development\");\n} else if (ENV === \"local\") {\n // For local development, .env.local can be used\n envPath = path.resolve(process.cwd(), \".env.local\");\n}\n\n// Optionally, add support for `.env.test`, `.env.qa`, or other environments if required\nelse if (ENV === \"test\") {\n envPath = path.resolve(process.cwd(), \".env.test\");\n} else if (ENV === \"qa\") {\n envPath = path.resolve(process.cwd(), \".env.qa\");\n}\n\ndotenv.config({ path: envPath });\n\nconst app = express();\n\n(async () => {\n await loadPrismaModule();\n})();\n\nexport async function bootstrap(\n arkosConfig: ArkosConfig\n): Promise<express.Express> {\n await loadPrismaModule();\n\n if (arkosConfig.configureApp) await arkosConfig.configureApp(app);\n\n const middlewaresConfig = arkosConfig?.middlewares;\n const disabledMiddlewares = middlewaresConfig?.disable || [];\n const replacedMiddlewares = middlewaresConfig?.replace || {};\n\n // Compression middleware\n if (!disabledMiddlewares.includes(\"compression\"))\n app.use(\n replacedMiddlewares.compression ||\n compression(arkosConfig?.compressionOptions)\n );\n\n // Global rate limit middleware\n if (!disabledMiddlewares.includes(\"global-rate-limit\"))\n app.use(\n replacedMiddlewares.globalRateLimit ||\n rateLimit(\n deepmerge(\n {\n windowMs: 60 * 1000,\n limit: 1000,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfig?.globalRequestRateLimitOptions || {}\n )\n )\n );\n\n // CORS middleware\n if (!disabledMiddlewares.includes(\"cors\"))\n app.use(\n replacedMiddlewares.cors ||\n cors(\n arkosConfig?.cors?.customHandler\n ? arkosConfig.cors.customHandler\n : deepmerge(\n {\n origin: (\n origin: string,\n cb: (err: Error | null, allow?: boolean) => void\n ) => {\n const allowed = arkosConfig?.cors?.allowedOrigins;\n\n if (allowed === \"*\") {\n cb(null, true);\n } else if (Array.isArray(allowed)) {\n cb(null, !origin || allowed.includes(origin));\n } else if (typeof allowed === \"string\") {\n cb(null, !origin || allowed === origin);\n } else {\n cb(null, false);\n }\n },\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"Connection\",\n ],\n credentials: true,\n },\n arkosConfig?.cors?.options || {}\n )\n )\n );\n\n // JSON body parser middleware\n if (!disabledMiddlewares.includes(\"express-json\"))\n app.use(\n replacedMiddlewares.expressJson ||\n express.json(arkosConfig?.jsonBodyParserOptions)\n );\n\n // Cookie parser middleware\n if (!disabledMiddlewares.includes(\"cookie-parser\"))\n app.use(\n replacedMiddlewares.cookieParser ||\n cookieParser(...[...(arkosConfig?.cookieParserParameters || [])])\n );\n\n // Query parser middleware\n if (!disabledMiddlewares.includes(\"query-parser\"))\n app.use(\n replacedMiddlewares.queryParser ||\n queryParser(\n deepmerge(\n {\n parseNull: true,\n parseUndefined: true,\n parseBoolean: true,\n },\n arkosConfig?.queryParserOptions || {}\n )\n )\n );\n\n // Database connection check middleware\n if (!disabledMiddlewares.includes(\"database-connection\"))\n app.use(replacedMiddlewares.databaseConnection || checkDatabaseConnection);\n\n // Request logger middleware\n if (!disabledMiddlewares.includes(\"request-logger\"))\n app.use(replacedMiddlewares.requestLogger || handleRequestLogs);\n\n // Additional custom middlewares\n if (arkosConfig?.middlewares?.additionals)\n arkosConfig.middlewares.additionals.forEach((middleware) => {\n app.use(middleware);\n });\n\n // Configure routers\n const routersConfig = arkosConfig?.routers;\n const disabledRouters = routersConfig?.disable || [];\n const replacedRouters = routersConfig?.replace || {};\n\n // Welcome endpoint\n if (!disabledRouters.includes(\"welcome-endpoint\"))\n app.get(\n \"/api\",\n replacedRouters.welcomeEndpoint ||\n ((req, res) => {\n res.status(200).json({ message: arkosConfig.welcomeMessage });\n })\n );\n\n // File uploader router\n if (!disabledRouters.includes(\"file-uploader\")) {\n const fileUploaderRouter = replacedRouters.fileUploader\n ? await replacedRouters.fileUploader(arkosConfig)\n : await getFileUploaderRouter(arkosConfig);\n app.use(\"/api\", fileUploaderRouter);\n }\n\n // Auth router\n if (!disabledRouters.includes(\"auth-router\") && arkosConfig.authentication) {\n const authRouter = replacedRouters.authRouter\n ? await replacedRouters.authRouter(arkosConfig)\n : await getAuthRouter(arkosConfig);\n app.use(\"/api\", authRouter);\n }\n\n // Prisma models router\n if (!disabledRouters.includes(\"prisma-models-router\")) {\n const modelsRouter = replacedRouters.prismaModelsRouter\n ? await replacedRouters.prismaModelsRouter(arkosConfig)\n : await getPrismaModelsRouter();\n app.use(\"/api\", modelsRouter);\n }\n\n app.use(\"/api\", getAvailableResourcesAndRoutesRouter());\n\n // Additional custom routers\n if (routersConfig?.additionals) {\n routersConfig.additionals.forEach((router) => {\n app.use(router);\n });\n }\n\n // Global error handler middleware (must be last)\n if (!disabledMiddlewares.includes(\"global-error-handler\"))\n app.use(replacedMiddlewares.globalErrorHandler || errorHandler);\n\n return app;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import express from \"express\";\nimport cors from \"cors\";\nimport cookieParser from \"cookie-parser\";\nimport { getAuthRouter } from \"./modules/auth/auth.router\";\nimport {\n getPrismaModelsRouter,\n getAvailableResourcesAndRoutesRouter,\n} from \"./modules/base/base.router\";\nimport errorHandler from \"./modules/error-handler/error-handler.controller\";\nimport { rateLimit } from \"express-rate-limit\";\nimport path from \"path\";\nimport * as dotenv from \"dotenv\";\nimport compression from \"compression\";\nimport { handleRequestLogs } from \"./modules/base/base.middlewares\";\nimport {\n checkDatabaseConnection,\n loadPrismaModule,\n} from \"./utils/helpers/prisma.helpers\";\nimport { getFileUploaderRouter } from \"./modules/file-uploader/file-uploader.router\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport { queryParser } from \"./utils/helpers/query-parser.helpers\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\n\nconst ENV = process.env.NODE_ENV;\nlet envPath = \".env\";\n\n// Default to `.env.local` if available in any environment\nif (ENV === \"production\") {\n envPath = path.resolve(process.cwd(), \".env.production\");\n} else if (ENV === \"staging\") {\n envPath = path.resolve(process.cwd(), \".env.staging\");\n} else if (ENV === \"development\") {\n envPath = path.resolve(process.cwd(), \".env.development\");\n} else if (ENV === \"local\") {\n // For local development, .env.local can be used\n envPath = path.resolve(process.cwd(), \".env.local\");\n}\n\n// Optionally, add support for `.env.test`, `.env.qa`, or other environments if required\nelse if (ENV === \"test\") {\n envPath = path.resolve(process.cwd(), \".env.test\");\n} else if (ENV === \"qa\") {\n envPath = path.resolve(process.cwd(), \".env.qa\");\n}\n\ndotenv.config({ path: envPath });\n\nconst app = express();\n\nexport async function bootstrap(\n arkosConfig: ArkosConfig\n): Promise<express.Express> {\n await loadPrismaModule();\n\n if (arkosConfig.configureApp) await arkosConfig.configureApp(app);\n\n const middlewaresConfig = arkosConfig?.middlewares;\n const disabledMiddlewares = middlewaresConfig?.disable || [];\n const replacedMiddlewares = middlewaresConfig?.replace || {};\n\n // Compression middleware\n if (!disabledMiddlewares.includes(\"compression\"))\n app.use(\n replacedMiddlewares.compression ||\n compression(arkosConfig?.compressionOptions)\n );\n\n // Global rate limit middleware\n if (!disabledMiddlewares.includes(\"global-rate-limit\"))\n app.use(\n replacedMiddlewares.globalRateLimit ||\n rateLimit(\n deepmerge(\n {\n windowMs: 60 * 1000,\n limit: 1000,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfig?.globalRequestRateLimitOptions || {}\n )\n )\n );\n\n // CORS middleware\n if (!disabledMiddlewares.includes(\"cors\"))\n app.use(\n replacedMiddlewares.cors ||\n cors(\n arkosConfig?.cors?.customHandler\n ? arkosConfig.cors.customHandler\n : deepmerge(\n {\n origin: (\n origin: string,\n cb: (err: Error | null, allow?: boolean) => void\n ) => {\n const allowed = arkosConfig?.cors?.allowedOrigins;\n\n if (allowed === \"*\") {\n cb(null, true);\n } else if (Array.isArray(allowed)) {\n cb(null, !origin || allowed.includes(origin));\n } else if (typeof allowed === \"string\") {\n cb(null, !origin || allowed === origin);\n } else {\n cb(null, false);\n }\n },\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"Connection\",\n ],\n credentials: true,\n },\n arkosConfig?.cors?.options || {}\n )\n )\n );\n\n // JSON body parser middleware\n if (!disabledMiddlewares.includes(\"express-json\"))\n app.use(\n replacedMiddlewares.expressJson ||\n express.json(arkosConfig?.jsonBodyParserOptions)\n );\n\n // Cookie parser middleware\n if (!disabledMiddlewares.includes(\"cookie-parser\"))\n app.use(\n replacedMiddlewares.cookieParser ||\n cookieParser(...[...(arkosConfig?.cookieParserParameters || [])])\n );\n\n // Query parser middleware\n if (!disabledMiddlewares.includes(\"query-parser\"))\n app.use(\n replacedMiddlewares.queryParser ||\n queryParser(\n deepmerge(\n {\n parseNull: true,\n parseUndefined: true,\n parseBoolean: true,\n },\n arkosConfig?.queryParserOptions || {}\n )\n )\n );\n\n // Database connection check middleware\n if (!disabledMiddlewares.includes(\"database-connection\"))\n app.use(replacedMiddlewares.databaseConnection || checkDatabaseConnection);\n\n // Request logger middleware\n if (!disabledMiddlewares.includes(\"request-logger\"))\n app.use(replacedMiddlewares.requestLogger || handleRequestLogs);\n\n // Additional custom middlewares\n if (arkosConfig?.middlewares?.additionals)\n arkosConfig.middlewares.additionals.forEach((middleware) => {\n app.use(middleware);\n });\n\n // Configure routers\n const routersConfig = arkosConfig?.routers;\n const disabledRouters = routersConfig?.disable || [];\n const replacedRouters = routersConfig?.replace || {};\n\n // Welcome endpoint\n if (!disabledRouters.includes(\"welcome-endpoint\"))\n app.get(\n \"/api\",\n replacedRouters.welcomeEndpoint ||\n ((req, res) => {\n res.status(200).json({ message: arkosConfig.welcomeMessage });\n })\n );\n\n // File uploader router\n if (!disabledRouters.includes(\"file-uploader\")) {\n const fileUploaderRouter = replacedRouters.fileUploader\n ? await replacedRouters.fileUploader(arkosConfig)\n : await getFileUploaderRouter(arkosConfig);\n app.use(\"/api\", fileUploaderRouter);\n }\n\n // Auth router\n if (!disabledRouters.includes(\"auth-router\") && arkosConfig.authentication) {\n const authRouter = replacedRouters.authRouter\n ? await replacedRouters.authRouter(arkosConfig)\n : await getAuthRouter(arkosConfig);\n app.use(\"/api\", authRouter);\n }\n\n // Prisma models router\n if (!disabledRouters.includes(\"prisma-models-router\")) {\n const modelsRouter = replacedRouters.prismaModelsRouter\n ? await replacedRouters.prismaModelsRouter(arkosConfig)\n : await getPrismaModelsRouter();\n app.use(\"/api\", modelsRouter);\n }\n\n app.use(\"/api\", getAvailableResourcesAndRoutesRouter());\n\n // Additional custom routers\n if (routersConfig?.additionals) {\n routersConfig.additionals.forEach((router) => {\n app.use(router);\n });\n }\n\n // Global error handler middleware (must be last)\n if (!disabledMiddlewares.includes(\"global-error-handler\"))\n app.use(replacedMiddlewares.globalErrorHandler || errorHandler);\n\n return app;\n}\n"]}
|
|
@@ -37,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.FileUploaderService = exports.getFileUploaderServices = exports.EmailService = exports.emailService = exports.getBaseServices = exports.BaseService = exports.authService = void 0;
|
|
40
|
-
const
|
|
41
|
-
Object.defineProperty(exports, "getFileUploaderServices", { enumerable: true, get: function () { return
|
|
42
|
-
Object.defineProperty(exports, "FileUploaderService", { enumerable: true, get: function () { return
|
|
40
|
+
const file_uploader_service_1 = require("../../modules/file-uploader/file-uploader.service");
|
|
41
|
+
Object.defineProperty(exports, "getFileUploaderServices", { enumerable: true, get: function () { return file_uploader_service_1.getFileUploaderServices; } });
|
|
42
|
+
Object.defineProperty(exports, "FileUploaderService", { enumerable: true, get: function () { return file_uploader_service_1.FileUploaderService; } });
|
|
43
43
|
const auth_service_1 = __importDefault(require("../../modules/auth/auth.service"));
|
|
44
44
|
exports.authService = auth_service_1.default;
|
|
45
45
|
const email_service_1 = __importStar(require("../../modules/email/email.service"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6FAG2D;AAwBlD,wGA1BP,+CAAuB,OA0BO;AAAE,oGAzBhC,2CAAmB,OAyBgC;AAtBrD,mFAA0D;AAOjD,sBAPF,sBAAW,CAOE;AANpB,mFAA+E;AAgBtE,uBAhBF,uBAAY,CAgBE;AAAE,6FAhBA,4BAAY,OAgBA;AAfnC,kEAA+E;AAUtE,4FAVA,0BAAW,OAUA;AAAE,gGAVA,8BAAe,OAUA","sourcesContent":["import {\n getFileUploaderServices,\n FileUploaderService,\n} from \"../../modules/file-uploader/file-uploader.service\";\nimport { EmailOptions } from \"../../modules/email/email.service\";\nimport authService from \"../../modules/auth/auth.service\";\nimport emailService, { EmailService } from \"../../modules/email/email.service\";\nimport { BaseService, getBaseServices } from \"../../modules/base/base.service\";\n\n/**\n * Authentication service.\n */\nexport { authService };\n\n/**\n * Base service.\n */\nexport { BaseService, getBaseServices };\n\n/**\n * Email service.\n */\nexport { emailService, EmailService, EmailOptions };\n\n/**\n * File upload services.\n */\nexport { getFileUploaderServices, FileUploaderService };\n"]}
|
|
@@ -193,7 +193,6 @@ describe("Auth Controller Factory", () => {
|
|
|
193
193
|
username: "testuser",
|
|
194
194
|
password: "hashedPassword",
|
|
195
195
|
});
|
|
196
|
-
console.log(JSON.stringify(auth_service_1.default, null, 2));
|
|
197
196
|
auth_service_1.default.isCorrectPassword.mockResolvedValueOnce(true);
|
|
198
197
|
auth_service_1.default.signJwtToken.mockReturnValue("jwt-token-123");
|
|
199
198
|
yield authController.login(req, res, next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.controller.test.js","sourceRoot":"","sources":["../../../../../src/modules/auth/__tests__/auth.controller.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n authControllerFactory,\n defaultExcludedUserFields,\n} from \"../auth.controller\";\nimport authService from \"../auth.service\";\nimport { getBaseServices } from \"../../base/base.service\";\nimport { getPrismaInstance } from \"../../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../../utils/helpers/models.helpers\";\nimport { getArkosConfig } from \"../../../server\";\n\njest.mock(\"bcrypt\", () => ({\n default: {\n compare: jest.fn(),\n hash: jest.fn(),\n },\n}));\n\n// Mock dependencies\njest.mock(\"../auth.service\", () => ({\n isCorrectPassword: jest.fn(),\n signJwtToken: jest.fn(),\n isPasswordStrong: jest.fn(),\n hashPassword: jest.fn(),\n authenticate: jest.fn(),\n handleAuthenticationControl: jest.fn(),\n handleActionAccessControl: jest.fn(),\n}));\n\njest.mock(\"../../base/base.service\", () => ({\n getBaseServices: jest.fn(),\n}));\n\njest.mock(\"../../../utils/helpers/prisma.helpers\", () => ({\n getPrismaInstance: jest.fn(),\n}));\n\n// Update your mock for models.helpers.ts\njest.mock(\"../../../utils/helpers/models.helpers\", () => ({\n importPrismaModelModules: jest.fn(),\n getPrismaModelRelations: jest.fn(),\n getModels: jest.fn(() => []),\n getModelUniqueFields: jest.fn(() => []),\n models: [],\n prismaModelRelationFields: {},\n}));\n\njest.mock(\"../../../server\", () => ({\n getArkosConfig: jest.fn(),\n close: jest.fn(),\n}));\n\ndescribe(\"Auth Controller Factory\", () => {\n let req: any;\n let res: any;\n let next: any;\n let mockPrisma: any;\n let authController: any;\n let userService: any;\n\n beforeEach(async () => {\n // Reset mocks\n jest.resetAllMocks();\n\n // Setup mocks\n userService = {\n findOne: jest.fn(),\n createOne: jest.fn(),\n };\n\n mockPrisma = {\n user: {\n findUnique: jest.fn(),\n update: jest.fn(),\n },\n };\n\n // Setup mock implementations\n (getBaseServices as jest.Mock).mockReturnValue({\n user: userService,\n });\n\n (getPrismaInstance as jest.Mock).mockReturnValue(mockPrisma);\n (importPrismaModelModules as jest.Mock).mockResolvedValue({\n prismaQueryOptions: {\n queryOptions: {},\n findOne: {},\n },\n });\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Create request, response, and next function mocks\n req = {\n user: {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n active: true,\n },\n body: {},\n query: {},\n secure: false,\n headers: {},\n };\n\n res = {\n status: jest.fn().mockReturnThis(),\n json: jest.fn(),\n cookie: jest.fn(),\n send: jest.fn(),\n };\n\n next = jest.fn();\n\n // Create the auth controller\n authController = await authControllerFactory();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe(\"getMe\", () => {\n it(\"should get the current user and return it\", async () => {\n // Setup\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n expect(userService.findOne).toHaveBeenCalledWith(\n { id: \"user-id-123\" },\n expect.any(String)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({ data: req.user });\n });\n\n it(\"should remove excluded fields from the user object\", async () => {\n // Setup\n const fullUser = {\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n passwordChangedAt: new Date(),\n active: true,\n };\n\n req.user = { ...fullUser };\n userService.findOne.mockResolvedValueOnce(fullUser);\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(req.user[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterGetMe is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterGetMe: true,\n });\n\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await controllerWithMiddleware.getMe(req, res, next);\n\n // Verify\n expect(req.responseData).toBeDefined();\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"logout\", () => {\n it(\"should clear the access token cookie and return 204\", async () => {\n // Execute\n await authController.logout(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"no-token\",\n expect.objectContaining({\n httpOnly: true,\n })\n );\n expect(res.status).toHaveBeenCalledWith(204);\n expect(res.json).toHaveBeenCalled();\n });\n\n it(\"should call next middleware when afterLogout is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogout: true,\n });\n\n // Execute\n await controllerWithMiddleware.logout(req, res, next);\n\n // Verify\n expect(req.responseData).toBeNull();\n expect(req.responseStatus).toBe(204);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"login\", () => {\n it(\"should return 400 if username or password is missing\", async () => {\n // Setup\n req.body = { username: \"testuser\" }; // Missing password\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"username and password\"),\n })\n );\n });\n\n it(\"should use default username field from config when not specified in query\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n console.log(JSON.stringify(authService, null, 2));\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { username: \"testuser\" },\n });\n });\n\n it(\"should use username field from query parameter when provided\", async () => {\n // Setup\n req.query.usernameField = \"email\";\n req.body = { email: \"test@example.com\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { email: \"test@example.com\" },\n });\n });\n\n it(\"should return 401 if user is not found\", async () => {\n // Setup\n req.body = { username: \"nonexistentuser\", password: \"Password123\" };\n mockPrisma.user.findUnique.mockResolvedValueOnce(null);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it(\"should return 401 if password is incorrect\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"WrongPassword123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(false);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it('should set cookie and return token in response when config is \"both\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it('should only set cookie when config is \"cookie-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"cookie-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.send).toHaveBeenCalled();\n expect(res.json).not.toHaveBeenCalled();\n });\n\n it('should only return token in response when config is \"response-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"response-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).not.toHaveBeenCalled();\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it(\"should call next middleware when afterLogin is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogin: true,\n });\n\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await controllerWithMiddleware.login(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ accessToken: \"jwt-token-123\" });\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"signup\", () => {\n it(\"should create a new user and return 201\", async () => {\n // Setup\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n active: true,\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await authController.signup(req, res, next);\n\n // Verify\n expect(userService.createOne).toHaveBeenCalledWith({ ...req.body }, \"{}\");\n expect(res.status).toHaveBeenCalledWith(201);\n\n // Check that excluded fields are removed\n const responseUser = res.json.mock.calls[0][0].data;\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(responseUser[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterSignup is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterSignup: true,\n });\n\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await controllerWithMiddleware.signup(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ data: createdUser });\n expect(req.responseStatus).toBe(201);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"updatePassword\", () => {\n it(\"should return 400 if currentPassword or newPassword is missing\", async () => {\n // Setup - missing newPassword\n req.body = { currentPassword: \"CurrentPassword123\" };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\n \"currentPassword and newPassword are required\"\n ),\n })\n );\n });\n\n it(\"should return 404 if user is not found or inactive\", async () => {\n // Setup\n req.user = null;\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 404,\n message: expect.stringContaining(\"User not found\"),\n })\n );\n });\n\n it(\"should return 400 if current password is incorrect\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"WrongPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Current password is incorrect\"),\n })\n );\n });\n\n it(\"should return 400 if new password is not strong enough\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"weakpassword\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Password must contain\"),\n })\n );\n });\n\n it(\"should update password and return 200 on success\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(true);\n (authService.hashPassword as jest.Mock).mockResolvedValueOnce(\n \"newHashedPassword\"\n );\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(mockPrisma.user.update).toHaveBeenCalledWith({\n where: { id: \"user-id-123\" },\n data: {\n password: \"newHashedPassword\",\n passwordChangedAt: expect.any(Date),\n },\n });\n\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n });\n\n it(\"should call next middleware when afterUpdatePassword is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterUpdatePassword: true,\n });\n\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(true);\n (authService.hashPassword as jest.Mock).mockResolvedValueOnce(\n \"newHashedPassword123\"\n );\n\n // Execute\n await controllerWithMiddleware.updatePassword(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n expect(req.responseStatus).toBe(200);\n expect(req.additionalData).toEqual({\n user: req.user,\n });\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"auth.controller.test.js","sourceRoot":"","sources":["../../../../../src/modules/auth/__tests__/auth.controller.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n authControllerFactory,\n defaultExcludedUserFields,\n} from \"../auth.controller\";\nimport authService from \"../auth.service\";\nimport { getBaseServices } from \"../../base/base.service\";\nimport { getPrismaInstance } from \"../../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../../utils/helpers/models.helpers\";\nimport { getArkosConfig } from \"../../../server\";\n\njest.mock(\"bcrypt\", () => ({\n default: {\n compare: jest.fn(),\n hash: jest.fn(),\n },\n}));\n\n// Mock dependencies\njest.mock(\"../auth.service\", () => ({\n isCorrectPassword: jest.fn(),\n signJwtToken: jest.fn(),\n isPasswordStrong: jest.fn(),\n hashPassword: jest.fn(),\n authenticate: jest.fn(),\n handleAuthenticationControl: jest.fn(),\n handleActionAccessControl: jest.fn(),\n}));\n\njest.mock(\"../../base/base.service\", () => ({\n getBaseServices: jest.fn(),\n}));\n\njest.mock(\"../../../utils/helpers/prisma.helpers\", () => ({\n getPrismaInstance: jest.fn(),\n}));\n\n// Update your mock for models.helpers.ts\njest.mock(\"../../../utils/helpers/models.helpers\", () => ({\n importPrismaModelModules: jest.fn(),\n getPrismaModelRelations: jest.fn(),\n getModels: jest.fn(() => []),\n getModelUniqueFields: jest.fn(() => []),\n models: [],\n prismaModelRelationFields: {},\n}));\n\njest.mock(\"../../../server\", () => ({\n getArkosConfig: jest.fn(),\n close: jest.fn(),\n}));\n\ndescribe(\"Auth Controller Factory\", () => {\n let req: any;\n let res: any;\n let next: any;\n let mockPrisma: any;\n let authController: any;\n let userService: any;\n\n beforeEach(async () => {\n // Reset mocks\n jest.resetAllMocks();\n\n // Setup mocks\n userService = {\n findOne: jest.fn(),\n createOne: jest.fn(),\n };\n\n mockPrisma = {\n user: {\n findUnique: jest.fn(),\n update: jest.fn(),\n },\n };\n\n // Setup mock implementations\n (getBaseServices as jest.Mock).mockReturnValue({\n user: userService,\n });\n\n (getPrismaInstance as jest.Mock).mockReturnValue(mockPrisma);\n (importPrismaModelModules as jest.Mock).mockResolvedValue({\n prismaQueryOptions: {\n queryOptions: {},\n findOne: {},\n },\n });\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Create request, response, and next function mocks\n req = {\n user: {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n active: true,\n },\n body: {},\n query: {},\n secure: false,\n headers: {},\n };\n\n res = {\n status: jest.fn().mockReturnThis(),\n json: jest.fn(),\n cookie: jest.fn(),\n send: jest.fn(),\n };\n\n next = jest.fn();\n\n // Create the auth controller\n authController = await authControllerFactory();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe(\"getMe\", () => {\n it(\"should get the current user and return it\", async () => {\n // Setup\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n expect(userService.findOne).toHaveBeenCalledWith(\n { id: \"user-id-123\" },\n expect.any(String)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({ data: req.user });\n });\n\n it(\"should remove excluded fields from the user object\", async () => {\n // Setup\n const fullUser = {\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n passwordChangedAt: new Date(),\n active: true,\n };\n\n req.user = { ...fullUser };\n userService.findOne.mockResolvedValueOnce(fullUser);\n\n // Execute\n await authController.getMe(req, res, next);\n\n // Verify\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(req.user[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterGetMe is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterGetMe: true,\n });\n\n userService.findOne.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n email: \"test@example.com\",\n });\n\n // Execute\n await controllerWithMiddleware.getMe(req, res, next);\n\n // Verify\n expect(req.responseData).toBeDefined();\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"logout\", () => {\n it(\"should clear the access token cookie and return 204\", async () => {\n // Execute\n await authController.logout(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"no-token\",\n expect.objectContaining({\n httpOnly: true,\n })\n );\n expect(res.status).toHaveBeenCalledWith(204);\n expect(res.json).toHaveBeenCalled();\n });\n\n it(\"should call next middleware when afterLogout is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogout: true,\n });\n\n // Execute\n await controllerWithMiddleware.logout(req, res, next);\n\n // Verify\n expect(req.responseData).toBeNull();\n expect(req.responseStatus).toBe(204);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"login\", () => {\n it(\"should return 400 if username or password is missing\", async () => {\n // Setup\n req.body = { username: \"testuser\" }; // Missing password\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"username and password\"),\n })\n );\n });\n\n it(\"should use default username field from config when not specified in query\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { username: \"testuser\" },\n });\n });\n\n it(\"should use username field from query parameter when provided\", async () => {\n // Setup\n req.query.usernameField = \"email\";\n req.body = { email: \"test@example.com\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n email: \"test@example.com\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(mockPrisma.user.findUnique).toHaveBeenCalledWith({\n where: { email: \"test@example.com\" },\n });\n });\n\n it(\"should return 401 if user is not found\", async () => {\n // Setup\n req.body = { username: \"nonexistentuser\", password: \"Password123\" };\n mockPrisma.user.findUnique.mockResolvedValueOnce(null);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it(\"should return 401 if password is incorrect\", async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"WrongPassword123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(false);\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 401,\n message: expect.stringContaining(\"Incorrect username or password\"),\n })\n );\n });\n\n it('should set cookie and return token in response when config is \"both\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"both\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it('should only set cookie when config is \"cookie-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"cookie-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).toHaveBeenCalledWith(\n \"arkos_access_token\",\n \"jwt-token-123\",\n expect.any(Object)\n );\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.send).toHaveBeenCalled();\n expect(res.json).not.toHaveBeenCalled();\n });\n\n it('should only return token in response when config is \"response-only\"', async () => {\n // Setup\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n (getArkosConfig as jest.Mock).mockReturnValue({\n authentication: {\n usernameField: \"username\",\n login: {\n sendAccessTokenThrough: \"response-only\",\n },\n },\n });\n\n // Execute\n await authController.login(req, res, next);\n\n // Verify\n expect(res.cookie).not.toHaveBeenCalled();\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n accessToken: \"jwt-token-123\",\n });\n });\n\n it(\"should call next middleware when afterLogin is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterLogin: true,\n });\n\n req.body = { username: \"testuser\", password: \"Password123\" };\n\n mockPrisma.user.findUnique.mockResolvedValueOnce({\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n });\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.signJwtToken as jest.Mock).mockReturnValue(\"jwt-token-123\");\n\n // Execute\n await controllerWithMiddleware.login(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ accessToken: \"jwt-token-123\" });\n expect(req.responseStatus).toBe(200);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"signup\", () => {\n it(\"should create a new user and return 201\", async () => {\n // Setup\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n active: true,\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await authController.signup(req, res, next);\n\n // Verify\n expect(userService.createOne).toHaveBeenCalledWith({ ...req.body }, \"{}\");\n expect(res.status).toHaveBeenCalledWith(201);\n\n // Check that excluded fields are removed\n const responseUser = res.json.mock.calls[0][0].data;\n Object.keys(defaultExcludedUserFields).forEach((field) => {\n expect(responseUser[field]).toBeUndefined();\n });\n });\n\n it(\"should call next middleware when afterSignup is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterSignup: true,\n });\n\n req.body = {\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"Password123\",\n };\n\n const createdUser = {\n id: \"new-user-id\",\n username: \"newuser\",\n email: \"newuser@example.com\",\n password: \"hashedPassword\",\n };\n\n userService.createOne.mockResolvedValueOnce({ ...createdUser });\n\n // Execute\n await controllerWithMiddleware.signup(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({ data: createdUser });\n expect(req.responseStatus).toBe(201);\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n\n describe(\"updatePassword\", () => {\n it(\"should return 400 if currentPassword or newPassword is missing\", async () => {\n // Setup - missing newPassword\n req.body = { currentPassword: \"CurrentPassword123\" };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\n \"currentPassword and newPassword are required\"\n ),\n })\n );\n });\n\n it(\"should return 404 if user is not found or inactive\", async () => {\n // Setup\n req.user = null;\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 404,\n message: expect.stringContaining(\"User not found\"),\n })\n );\n });\n\n it(\"should return 400 if current password is incorrect\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"WrongPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Current password is incorrect\"),\n })\n );\n });\n\n it(\"should return 400 if new password is not strong enough\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"weakpassword\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(false);\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(next).toHaveBeenCalledWith(\n expect.objectContaining({\n statusCode: 400,\n message: expect.stringContaining(\"Password must contain\"),\n })\n );\n });\n\n it(\"should update password and return 200 on success\", async () => {\n // Setup\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(true);\n (authService.hashPassword as jest.Mock).mockResolvedValueOnce(\n \"newHashedPassword\"\n );\n\n // Execute\n await authController.updatePassword(req, res, next);\n\n // Verify\n expect(mockPrisma.user.update).toHaveBeenCalledWith({\n where: { id: \"user-id-123\" },\n data: {\n password: \"newHashedPassword\",\n passwordChangedAt: expect.any(Date),\n },\n });\n\n expect(res.status).toHaveBeenCalledWith(200);\n expect(res.json).toHaveBeenCalledWith({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n });\n\n it(\"should call next middleware when afterUpdatePassword is provided\", async () => {\n // Setup\n const controllerWithMiddleware = await authControllerFactory({\n afterUpdatePassword: true,\n });\n\n req.user = {\n id: \"user-id-123\",\n username: \"testuser\",\n password: \"hashedPassword\",\n isVerified: true,\n };\n\n req.body = {\n currentPassword: \"CurrentPassword123\",\n newPassword: \"NewPassword123\",\n };\n\n (authService.isCorrectPassword as jest.Mock).mockResolvedValueOnce(true);\n (authService.isPasswordStrong as jest.Mock).mockReturnValue(true);\n (authService.hashPassword as jest.Mock).mockResolvedValueOnce(\n \"newHashedPassword123\"\n );\n\n // Execute\n await controllerWithMiddleware.updatePassword(req, res, next);\n\n // Verify\n expect(req.responseData).toEqual({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n expect(req.responseStatus).toBe(200);\n expect(req.additionalData).toEqual({\n user: req.user,\n });\n expect(next).toHaveBeenCalled();\n expect(res.status).not.toHaveBeenCalled();\n });\n });\n});\n"]}
|