arkos 0.7.0-beta.1 → 0.9.0-beta.1
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/modules/auth/__tests__/auth.controller.test.js +2 -0
- package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +1 -0
- package/dist/cjs/modules/auth/auth.service.js +1 -1
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js +2 -0
- package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js.map +1 -0
- package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js +2 -0
- package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js.map +1 -0
- package/dist/cjs/utils/helpers/models.helpers.js +51 -18
- package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/pluralize.helpers.js +0 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +34 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/es2020/app.js +1 -1
- package/dist/es2020/app.js.map +1 -1
- package/dist/es2020/exports/auth/index.js +2 -5
- package/dist/es2020/exports/auth/index.js.map +1 -1
- package/dist/es2020/exports/error-handler/index.js +3 -10
- package/dist/es2020/exports/error-handler/index.js.map +1 -1
- package/dist/es2020/exports/index.js +3 -5
- package/dist/es2020/exports/index.js.map +1 -1
- package/dist/es2020/exports/prisma/index.js +1 -2
- package/dist/es2020/exports/services/index.js +8 -52
- package/dist/es2020/exports/services/index.js.map +1 -1
- package/dist/es2020/exports/utils/change-case.js +1 -17
- package/dist/es2020/exports/utils/change-case.js.map +1 -1
- package/dist/es2020/exports/utils/index.js +2 -5
- package/dist/es2020/exports/utils/index.js.map +1 -1
- package/dist/es2020/exports/validation/index.js +2 -8
- package/dist/es2020/exports/validation/index.js.map +1 -1
- package/dist/es2020/modules/auth/auth.controller.js +73 -71
- package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
- package/dist/es2020/modules/auth/auth.router.js +64 -57
- package/dist/es2020/modules/auth/auth.router.js.map +1 -1
- package/dist/es2020/modules/auth/auth.service.js +93 -80
- package/dist/es2020/modules/auth/auth.service.js.map +1 -1
- package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js +6 -10
- package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js.map +1 -1
- package/dist/es2020/modules/base/base.controller.js +125 -118
- package/dist/es2020/modules/base/base.controller.js.map +1 -1
- package/dist/es2020/modules/base/base.middlewares.js +6 -16
- package/dist/es2020/modules/base/base.middlewares.js.map +1 -1
- package/dist/es2020/modules/base/base.router.js +59 -54
- package/dist/es2020/modules/base/base.router.js.map +1 -1
- package/dist/es2020/modules/base/base.service.js +138 -143
- package/dist/es2020/modules/base/base.service.js.map +1 -1
- package/dist/es2020/modules/base/utils/helpers/base.helpers.js +44 -41
- package/dist/es2020/modules/base/utils/helpers/base.helpers.js.map +1 -1
- package/dist/es2020/modules/email/email.service.js +24 -23
- package/dist/es2020/modules/email/email.service.js.map +1 -1
- package/dist/es2020/modules/error-handler/error-handler.controller.js +7 -42
- package/dist/es2020/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/es2020/modules/error-handler/utils/app-error.js +1 -3
- package/dist/es2020/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/es2020/modules/error-handler/utils/catch-async.js +13 -6
- package/dist/es2020/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +105 -131
- package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/es2020/modules/file-uploader/file-uploader.controller.js +60 -56
- package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -1
- package/dist/es2020/modules/file-uploader/file-uploader.router.js +19 -16
- package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -1
- package/dist/es2020/modules/file-uploader/file-uploader.service.js +35 -36
- package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -1
- package/dist/es2020/paths.js +1 -1
- package/dist/es2020/paths.js.map +1 -1
- package/dist/es2020/scripts/create-test.js +12 -17
- package/dist/es2020/scripts/create-test.js.map +1 -1
- package/dist/es2020/server.js +1 -1
- package/dist/es2020/server.js.map +1 -1
- package/dist/es2020/utils/arkos-env.js +1 -3
- package/dist/es2020/utils/arkos-env.js.map +1 -1
- package/dist/es2020/utils/features/api.features.js +60 -72
- package/dist/es2020/utils/features/api.features.js.map +1 -1
- package/dist/es2020/utils/features/change-case.features.js +12 -48
- package/dist/es2020/utils/features/change-case.features.js.map +1 -1
- package/dist/es2020/utils/helpers/api.features.helpers.js +3 -5
- package/dist/es2020/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/base.controller.helpers.js +30 -24
- package/dist/es2020/utils/helpers/base.controller.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/change-case.helpers.js +48 -56
- package/dist/es2020/utils/helpers/change-case.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/deepmerge.helper.js +9 -7
- package/dist/es2020/utils/helpers/deepmerge.helper.js.map +1 -1
- package/dist/es2020/utils/helpers/fs.helpers.js +5 -7
- package/dist/es2020/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/models.helpers.js +151 -152
- package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/pluralize.helpers.js +0 -1
- package/dist/es2020/utils/helpers/prisma.helpers.js +24 -23
- package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/query-parser.helpers.js +5 -10
- package/dist/es2020/utils/helpers/query-parser.helpers.js.map +1 -1
- package/dist/es2020/utils/helpers/text.helpers.js +1 -4
- package/dist/es2020/utils/helpers/text.helpers.js.map +1 -1
- package/dist/es2020/utils/scripts/export-prisma-types.js +2 -37
- package/dist/es2020/utils/scripts/export-prisma-types.js.map +1 -1
- package/dist/es2020/utils/scripts/generate-zod-schemas.js +108 -100
- package/dist/es2020/utils/scripts/generate-zod-schemas.js.map +1 -1
- package/dist/es2020/utils/scripts/prisma-db-push.js +8 -13
- package/dist/es2020/utils/scripts/prisma-db-push.js.map +1 -1
- package/dist/es2020/utils/validate-dto.js +19 -14
- package/dist/es2020/utils/validate-dto.js.map +1 -1
- package/dist/es2020/utils/validate-schema.js +17 -12
- package/dist/es2020/utils/validate-schema.js.map +1 -1
- package/package.json +4 -5
package/dist/es2020/app.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=function(u,e,i,n){function p(a){return a instanceof i?a:new i(function(l){l(a)})}return new(i||(i=Promise))(function(a,l){function w(o){try{c(n.next(o))}catch(d){l(d)}}function g(o){try{c(n.throw(o))}catch(d){l(d)}}function c(o){o.done?a(o.value):p(o.value).then(w,g)}c((n=n.apply(u,e||[])).next())})};import f from"express";import y from"cors";import x from"cookie-parser";import E from"./modules/auth/auth.router";import T from"./modules/base/base.router";import C from"./modules/error-handler/error-handler.controller";import{rateLimit as P}from"express-rate-limit";import t from"path";import*as H from"dotenv";import N from"compression";import{handleRequestLogs as _}from"./modules/base/base.middlewares";import{checkDatabaseConnection as q,loadPrismaModule as v}from"./utils/helpers/prisma.helpers";import{fileUploaderRouter as O}from"./modules/file-uploader/file-uploader.router";import{queryParser as R}from"./utils/helpers/query-parser.helpers";const s=process.env.NODE_ENV;let r=".env";s==="production"?r=t.resolve(process.cwd(),".env.production"):s==="staging"?r=t.resolve(process.cwd(),".env.staging"):s==="development"?r=t.resolve(process.cwd(),".env.development"):s==="local"?r=t.resolve(process.cwd(),".env.local"):s==="test"?r=t.resolve(process.cwd(),".env.test"):s==="qa"&&(r=t.resolve(process.cwd(),".env.qa")),H.config({path:r});let b,h;m(void 0,void 0,void 0,function*(){h=yield v()});export function bootstrap(u){return m(this,void 0,void 0,function*(){const e=f();h=yield v(),b=u,e.use(N());const i=P({windowMs:60*1e3,limit:1e3,standardHeaders:"draft-7",legacyHeaders:!1});return e.use(i),e.set("trust proxy",1),e.use("/api/uploads",f.static(t.join("uploads"),{maxAge:"1y",etag:!0,lastModified:!0,dotfiles:"ignore",fallthrough:!0,index:!1,cacheControl:!0})),e.use(y({origin:(n,p)=>{p(null,!0)},methods:["GET","POST","PUT","DELETE","PATCH","OPTION"],allowedHeaders:["Content-Type","Authorization","Connection"],credentials:!0})),e.use(f.json()),e.use(x()),e.use(R({parseNull:!0,parseUndefined:!0,parseBoolean:!0})),e.use(q),e.use(_),u.authentication&&e.use("/api",E),e.use("/api",T),e.use("/api",O),e.use(C),e})}
|
package/dist/es2020/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"
|
|
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 authRouter from \"./modules/auth/auth.router\";\nimport baseRouter 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 { fileUploaderRouter } from \"./modules/file-uploader/file-uploader.router\";\nimport { InitConfigs } from \"./types/app\";\nimport { queryParser } from \"./utils/helpers/query-parser.helpers\";\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\nlet initConfigs: InitConfigs;\nlet prisma: any;\n\n(async () => {\n prisma = await loadPrismaModule();\n})();\n\nexport async function bootstrap(\n configs: InitConfigs\n): Promise<express.Express> {\n const app = express();\n\n prisma = await loadPrismaModule();\n\n initConfigs = configs;\n\n app.use(compression());\n\n const limiter = rateLimit({\n windowMs: 60 * 1000,\n limit: 1000,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n });\n\n app.use(limiter);\n\n app.set(\"trust proxy\", 1);\n\n app.use(\n \"/api/uploads\",\n express.static(path.join(\"uploads\"), {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: true,\n index: false,\n cacheControl: true,\n })\n );\n\n app.use(\n cors({\n origin: (origin, callback) => {\n callback(null, true);\n },\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTION\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\", \"Connection\"],\n credentials: true,\n })\n );\n\n app.use(express.json());\n app.use(cookieParser());\n app.use(\n queryParser({\n parseNull: true,\n parseUndefined: true,\n parseBoolean: true,\n })\n );\n\n app.use(checkDatabaseConnection);\n\n app.use(handleRequestLogs);\n\n if (configs.authentication) app.use(\"/api\", authRouter);\n app.use(\"/api\", baseRouter);\n app.use(\"/api\", fileUploaderRouter);\n app.use(errorHandler);\n\n return app;\n}\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.defaultExcludedUserFields = void 0;
|
|
4
|
-
const auth_controller_1 = require("./../../modules/auth/auth.controller");
|
|
5
|
-
Object.defineProperty(exports, "defaultExcludedUserFields", { enumerable: true, get: function () { return auth_controller_1.defaultExcludedUserFields; } });
|
|
1
|
+
import { defaultExcludedUserFields } from "./../../modules/auth/auth.controller";
|
|
2
|
+
export { defaultExcludedUserFields };
|
|
6
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/auth/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAAE,yBAAyB,EAA+B,CAAC","sourcesContent":["import { defaultExcludedUserFields } from \"./../../modules/auth/auth.controller\";\nimport { AuthConfigs, AuthJwtPayload } from \"../../types/auth\";\n\nexport { defaultExcludedUserFields, AuthConfigs, AuthJwtPayload };\n"]}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AppError = exports.catchAsync = void 0;
|
|
7
|
-
const catch_async_1 = __importDefault(require("../../modules/error-handler/utils/catch-async"));
|
|
8
|
-
exports.catchAsync = catch_async_1.default;
|
|
9
|
-
const app_error_1 = __importDefault(require("../../modules/error-handler/utils/app-error"));
|
|
10
|
-
exports.AppError = app_error_1.default;
|
|
1
|
+
import catchAsync from "../../modules/error-handler/utils/catch-async";
|
|
2
|
+
import AppError from "../../modules/error-handler/utils/app-error";
|
|
3
|
+
export { catchAsync, AppError };
|
|
11
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/error-handler/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/error-handler/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,+CAA+C,CAAC;AACvE,OAAO,QAAQ,MAAM,6CAA6C,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import catchAsync from \"../../modules/error-handler/utils/catch-async\";\nimport AppError from \"../../modules/error-handler/utils/app-error\";\n\nexport { catchAsync, AppError };\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const server_1 = require("../server");
|
|
1
|
+
import { initApp } from "../server";
|
|
4
2
|
const arkos = {
|
|
5
|
-
init:
|
|
3
|
+
init: initApp,
|
|
6
4
|
};
|
|
7
|
-
|
|
5
|
+
export default arkos;
|
|
8
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,OAAO;CACd,CAAC;AASF,eAAe,KAAK,CAAC","sourcesContent":["import { initApp } from \"../server\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../types\";\n\n/**\n * Initializes the Arkos application.\n *\n * @module arkos\n * @property {Function} init - Function to initialize the app.\n */\nconst arkos = {\n init: initApp,\n};\n\nexport { ArkosRequest, ArkosResponse, ArkosNextFunction, ArkosRequestHandler };\n\n/**\n * Main entry point for the Arkos module.\n *\n * @module arkos\n */\nexport default arkos;\n\n// export * from \"./services\";\n// export * from \"./utils\";\n// export * from \"./validation\";\n// export * from \"./error-handler\";\n"]}
|
|
@@ -1,53 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.fileUploaderService = exports.videoUploaderService = exports.documentUploaderService = exports.imageUploaderService = exports.EmailService = exports.emailService = exports.getBaseServices = exports.BaseService = exports.authService = void 0;
|
|
40
|
-
const auth_service_1 = __importDefault(require("../../modules/auth/auth.service"));
|
|
41
|
-
exports.authService = auth_service_1.default;
|
|
42
|
-
const email_service_1 = __importStar(require("../../modules/email/email.service"));
|
|
43
|
-
exports.emailService = email_service_1.default;
|
|
44
|
-
Object.defineProperty(exports, "EmailService", { enumerable: true, get: function () { return email_service_1.EmailService; } });
|
|
45
|
-
const file_uploader_service_1 = require("../../modules/file-uploader/file-uploader.service");
|
|
46
|
-
Object.defineProperty(exports, "imageUploaderService", { enumerable: true, get: function () { return file_uploader_service_1.imageUploaderService; } });
|
|
47
|
-
Object.defineProperty(exports, "documentUploaderService", { enumerable: true, get: function () { return file_uploader_service_1.documentUploaderService; } });
|
|
48
|
-
Object.defineProperty(exports, "videoUploaderService", { enumerable: true, get: function () { return file_uploader_service_1.videoUploaderService; } });
|
|
49
|
-
Object.defineProperty(exports, "fileUploaderService", { enumerable: true, get: function () { return file_uploader_service_1.fileUploaderService; } });
|
|
50
|
-
const base_service_1 = require("../../modules/base/base.service");
|
|
51
|
-
Object.defineProperty(exports, "BaseService", { enumerable: true, get: function () { return base_service_1.BaseService; } });
|
|
52
|
-
Object.defineProperty(exports, "getBaseServices", { enumerable: true, get: function () { return base_service_1.getBaseServices; } });
|
|
1
|
+
import authService from "../../modules/auth/auth.service";
|
|
2
|
+
import emailService, { EmailService } from "../../modules/email/email.service";
|
|
3
|
+
import { imageUploaderService, documentUploaderService, videoUploaderService, fileUploaderService, } from "../../modules/file-uploader/file-uploader.service";
|
|
4
|
+
import { BaseService, getBaseServices } from "../../modules/base/base.service";
|
|
5
|
+
export { authService };
|
|
6
|
+
export { BaseService, getBaseServices };
|
|
7
|
+
export { emailService, EmailService };
|
|
8
|
+
export { imageUploaderService, documentUploaderService, videoUploaderService, fileUploaderService, };
|
|
53
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/services/index.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAK/E,OAAO,EAAE,WAAW,EAAE,CAAC;AAKvB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAKxC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAgB,CAAC;AAKpD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,CAAC","sourcesContent":["import { EmailOptions } from \"../../modules/email/email.service\";\nimport authService from \"../../modules/auth/auth.service\";\nimport emailService, { EmailService } from \"../../modules/email/email.service\";\nimport {\n imageUploaderService,\n documentUploaderService,\n videoUploaderService,\n fileUploaderService,\n} from \"../../modules/file-uploader/file-uploader.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 {\n imageUploaderService,\n documentUploaderService,\n videoUploaderService,\n fileUploaderService,\n};\n"]}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("../../utils/features/change-case.features"), exports);
|
|
1
|
+
export * from "../../utils/features/change-case.features";
|
|
18
2
|
//# sourceMappingURL=change-case.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-case.js","sourceRoot":"","sources":["../../../../src/exports/utils/change-case.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"change-case.js","sourceRoot":"","sources":["../../../../src/exports/utils/change-case.ts"],"names":[],"mappings":"AAAA,cAAc,2CAA2C,CAAC","sourcesContent":["export * from \"../../utils/features/change-case.features\";\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.getPrismaModels = void 0;
|
|
4
|
-
const models_helpers_1 = require("../../utils/helpers/models.helpers");
|
|
5
|
-
Object.defineProperty(exports, "getPrismaModels", { enumerable: true, get: function () { return models_helpers_1.getModels; } });
|
|
1
|
+
import { getModels } from "../../utils/helpers/models.helpers";
|
|
2
|
+
export { getModels as getPrismaModels };
|
|
6
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,CAAC","sourcesContent":["import { getModels } from \"../../utils/helpers/models.helpers\";\n\nexport { getModels as getPrismaModels };\n"]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateDto = void 0;
|
|
7
|
-
const validate_dto_1 = __importDefault(require("../../utils/validate-dto"));
|
|
8
|
-
exports.validateDto = validate_dto_1.default;
|
|
1
|
+
import validateDto from "../../utils/validate-dto";
|
|
2
|
+
export { validateDto };
|
|
9
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/validation/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,CAAC","sourcesContent":["import validateDto from \"../../utils/validate-dto\";\n\nexport { validateDto };\n"]}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
4
9
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const auth_helpers_1 = require("./utils/helpers/auth.helpers");
|
|
17
|
-
exports.defaultExcludedUserFields = {
|
|
10
|
+
import catchAsync from "../error-handler/utils/catch-async";
|
|
11
|
+
import AppError from "../error-handler/utils/app-error";
|
|
12
|
+
import authService from "./auth.service";
|
|
13
|
+
import { getBaseServices } from "../base/base.service";
|
|
14
|
+
import { getPrismaInstance } from "../../utils/helpers/prisma.helpers";
|
|
15
|
+
import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
|
|
16
|
+
import deepmerge from "../../utils/helpers/deepmerge.helper";
|
|
17
|
+
import arkosEnv from "../../utils/arkos-env";
|
|
18
|
+
import { getInitConfigs } from "../../server";
|
|
19
|
+
import { determineUsernameField } from "./utils/helpers/auth.helpers";
|
|
20
|
+
export const defaultExcludedUserFields = {
|
|
18
21
|
password: false,
|
|
19
22
|
passwordChangedAt: false,
|
|
20
23
|
passwordResetToken: false,
|
|
@@ -25,76 +28,76 @@ exports.defaultExcludedUserFields = {
|
|
|
25
28
|
deletedSelfAccount: false,
|
|
26
29
|
active: false,
|
|
27
30
|
};
|
|
28
|
-
const authControllerFactory =
|
|
29
|
-
const baseServices =
|
|
31
|
+
export const authControllerFactory = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (middlewares = {}) {
|
|
32
|
+
const baseServices = getBaseServices();
|
|
30
33
|
let prismaQueryOptions = {};
|
|
31
|
-
const userModules =
|
|
34
|
+
const userModules = yield importPrismaModelModules("user");
|
|
32
35
|
if (userModules)
|
|
33
|
-
prismaQueryOptions = userModules
|
|
34
|
-
const stringifiedQueryOptions = JSON.stringify((0
|
|
36
|
+
prismaQueryOptions = (userModules === null || userModules === void 0 ? void 0 : userModules.prismaQueryOptions) || {};
|
|
37
|
+
const stringifiedQueryOptions = JSON.stringify(deepmerge((prismaQueryOptions === null || prismaQueryOptions === void 0 ? void 0 : prismaQueryOptions.queryOptions) || {}, (prismaQueryOptions === null || prismaQueryOptions === void 0 ? void 0 : prismaQueryOptions.findOne) || {}) || {});
|
|
35
38
|
return {
|
|
36
|
-
getMe: (
|
|
37
|
-
const user =
|
|
38
|
-
Object.keys(
|
|
39
|
+
getMe: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
|
+
const user = yield baseServices["user"].findOne({ id: req.user.id }, stringifiedQueryOptions);
|
|
41
|
+
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
39
42
|
if (req.user)
|
|
40
43
|
delete req.user[key];
|
|
41
44
|
});
|
|
42
|
-
if (middlewares
|
|
45
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterGetMe) {
|
|
43
46
|
req.responseData = user;
|
|
44
47
|
req.responseStatus = 200;
|
|
45
48
|
return next();
|
|
46
49
|
}
|
|
47
50
|
res.status(200).json({ data: req.user });
|
|
48
|
-
}),
|
|
49
|
-
updateMe: (
|
|
50
|
-
const user =
|
|
51
|
-
Object.keys(
|
|
51
|
+
})),
|
|
52
|
+
updateMe: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const user = yield baseServices["user"].updateOne({ id: req.user.id }, req.body, stringifiedQueryOptions);
|
|
54
|
+
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
52
55
|
if (req.user)
|
|
53
56
|
delete req.user[key];
|
|
54
57
|
});
|
|
55
|
-
if (middlewares
|
|
58
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterGetMe) {
|
|
56
59
|
req.responseData = user;
|
|
57
60
|
req.responseStatus = 200;
|
|
58
61
|
return next();
|
|
59
62
|
}
|
|
60
63
|
res.status(200).json({ data: req.user });
|
|
61
|
-
}),
|
|
62
|
-
logout: (
|
|
64
|
+
})),
|
|
65
|
+
logout: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
66
|
res.cookie("arkos_access_token", "no-token", {
|
|
64
67
|
expires: new Date(Date.now() + 10 * 1000),
|
|
65
68
|
httpOnly: true,
|
|
66
69
|
});
|
|
67
|
-
if (middlewares
|
|
70
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterLogout) {
|
|
68
71
|
req.responseData = null;
|
|
69
72
|
req.responseStatus = 204;
|
|
70
73
|
return next();
|
|
71
74
|
}
|
|
72
75
|
res.status(204).json();
|
|
73
|
-
}),
|
|
74
|
-
login: (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const usernameField =
|
|
76
|
+
})),
|
|
77
|
+
login: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
+
var _a, _b, _c;
|
|
79
|
+
const initAuthConfigs = (_a = getInitConfigs()) === null || _a === void 0 ? void 0 : _a.authentication;
|
|
80
|
+
const usernameField = determineUsernameField(req);
|
|
78
81
|
const usernameValue = req.body[usernameField];
|
|
79
82
|
const { password } = req.body;
|
|
80
83
|
if (!usernameValue || !password) {
|
|
81
|
-
return next(new
|
|
84
|
+
return next(new AppError(`Please provide ${usernameField} and password`, 400));
|
|
82
85
|
}
|
|
83
|
-
const prisma =
|
|
86
|
+
const prisma = getPrismaInstance();
|
|
84
87
|
const whereClause = {};
|
|
85
88
|
whereClause[usernameField] = usernameValue;
|
|
86
|
-
const user =
|
|
89
|
+
const user = yield prisma.user.findUnique({
|
|
87
90
|
where: whereClause,
|
|
88
91
|
});
|
|
89
92
|
if (!user ||
|
|
90
|
-
!(
|
|
91
|
-
return next(new
|
|
93
|
+
!(yield authService.isCorrectPassword(password, user.password))) {
|
|
94
|
+
return next(new AppError(`Incorrect ${usernameField} or password`, 401));
|
|
92
95
|
}
|
|
93
|
-
const token =
|
|
96
|
+
const token = authService.signJwtToken(user.id);
|
|
94
97
|
const cookieOptions = {
|
|
95
98
|
expires: new Date(Date.now() +
|
|
96
99
|
Number(process.env.JWT_COOKIE_EXPIRES_IN ||
|
|
97
|
-
|
|
100
|
+
arkosEnv.JWT_COOKIE_EXPIRES_IN) *
|
|
98
101
|
24 *
|
|
99
102
|
60 *
|
|
100
103
|
60 *
|
|
@@ -106,15 +109,15 @@ const authControllerFactory = async (middlewares = {}) => {
|
|
|
106
109
|
if (process.env.NODE_ENV === "production" &&
|
|
107
110
|
process.env.JWT_SECURE !== "false")
|
|
108
111
|
cookieOptions.secure = true;
|
|
109
|
-
if (middlewares
|
|
112
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterLogin) {
|
|
110
113
|
req.responseData = { accessToken: token };
|
|
111
114
|
req.responseStatus = 200;
|
|
112
115
|
return next();
|
|
113
116
|
}
|
|
114
|
-
if (initAuthConfigs
|
|
117
|
+
if (((_b = initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.login) === null || _b === void 0 ? void 0 : _b.sendAccessTokenThrough) === "response-only") {
|
|
115
118
|
res.status(200).json({ accessToken: token });
|
|
116
119
|
}
|
|
117
|
-
else if (initAuthConfigs
|
|
120
|
+
else if (((_c = initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.login) === null || _c === void 0 ? void 0 : _c.sendAccessTokenThrough) === "cookie-only") {
|
|
118
121
|
res.cookie("arkos_access_token", token, cookieOptions);
|
|
119
122
|
res.status(200).send();
|
|
120
123
|
}
|
|
@@ -122,47 +125,47 @@ const authControllerFactory = async (middlewares = {}) => {
|
|
|
122
125
|
res.cookie("arkos_access_token", token, cookieOptions);
|
|
123
126
|
res.status(200).json({ accessToken: token });
|
|
124
127
|
}
|
|
125
|
-
}),
|
|
126
|
-
signup: (
|
|
128
|
+
})),
|
|
129
|
+
signup: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
127
130
|
const userService = baseServices["user"];
|
|
128
|
-
const user =
|
|
129
|
-
if (middlewares
|
|
131
|
+
const user = yield userService.createOne(req.body, stringifiedQueryOptions);
|
|
132
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterSignup) {
|
|
130
133
|
req.responseData = { data: user };
|
|
131
134
|
req.responseStatus = 201;
|
|
132
135
|
return next();
|
|
133
136
|
}
|
|
134
|
-
Object.keys(
|
|
137
|
+
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
135
138
|
delete user[key];
|
|
136
139
|
});
|
|
137
140
|
res.status(201).json({ data: user });
|
|
138
|
-
}),
|
|
139
|
-
updatePassword: (
|
|
141
|
+
})),
|
|
142
|
+
updatePassword: catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
140
143
|
const { currentPassword, newPassword } = req.body;
|
|
141
144
|
if (!currentPassword || !newPassword)
|
|
142
|
-
return next(new
|
|
145
|
+
return next(new AppError("currentPassword and newPassword are required", 400));
|
|
143
146
|
const user = req.user;
|
|
144
147
|
if (!user ||
|
|
145
|
-
user
|
|
146
|
-
user
|
|
147
|
-
return next(new
|
|
148
|
+
(user === null || user === void 0 ? void 0 : user.active) === false ||
|
|
149
|
+
(user === null || user === void 0 ? void 0 : user.deletedSelfAccount) === true)
|
|
150
|
+
return next(new AppError("User not found!", 404));
|
|
148
151
|
if (!user.isVerified)
|
|
149
|
-
return next(new
|
|
152
|
+
return next(new AppError("You need to verify your account to proceed", 423, {
|
|
150
153
|
error: "email_verification_required",
|
|
151
154
|
}));
|
|
152
|
-
const isPasswordCorrect =
|
|
155
|
+
const isPasswordCorrect = yield authService.isCorrectPassword(String(currentPassword), String(user.password));
|
|
153
156
|
if (!isPasswordCorrect)
|
|
154
|
-
return next(new
|
|
155
|
-
if (!
|
|
156
|
-
return next(new
|
|
157
|
-
const prisma =
|
|
158
|
-
|
|
157
|
+
return next(new AppError("Current password is incorrect.", 400));
|
|
158
|
+
if (!authService.isPasswordStrong(String(newPassword)))
|
|
159
|
+
return next(new AppError("Password must contain at least one uppercase letter, one lowercase letter, and one number", 400));
|
|
160
|
+
const prisma = getPrismaInstance();
|
|
161
|
+
yield prisma.user.update({
|
|
159
162
|
where: { id: user.id },
|
|
160
163
|
data: {
|
|
161
|
-
password:
|
|
164
|
+
password: yield authService.hashPassword(newPassword),
|
|
162
165
|
passwordChangedAt: new Date(),
|
|
163
166
|
},
|
|
164
167
|
});
|
|
165
|
-
if (middlewares
|
|
168
|
+
if (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterUpdatePassword) {
|
|
166
169
|
req.additionalData = {
|
|
167
170
|
user,
|
|
168
171
|
};
|
|
@@ -177,8 +180,7 @@ const authControllerFactory = async (middlewares = {}) => {
|
|
|
177
180
|
status: "success",
|
|
178
181
|
message: "Password updated successfully!",
|
|
179
182
|
});
|
|
180
|
-
}),
|
|
183
|
+
})),
|
|
181
184
|
};
|
|
182
|
-
};
|
|
183
|
-
exports.authControllerFactory = authControllerFactory;
|
|
185
|
+
});
|
|
184
186
|
//# sourceMappingURL=auth.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { CookieOptions } from \"express\";\nimport { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport authService from \"./auth.service\";\nimport { getBaseServices } from \"../base/base.service\";\nimport { User } from \"../../types\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getInitConfigs } from \"../../server\";\nimport { determineUsernameField } from \"./utils/helpers/auth.helpers\";\nimport { InitConfigsAuthenticationOptions } from \"../../types/app\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: false,\n passwordChangedAt: false,\n passwordResetToken: false,\n passwordResetTokenExpiresAt: false,\n verificationToken: false,\n verificationTokenExpiresAt: false,\n isVerified: false,\n deletedSelfAccount: false,\n active: false,\n};\n\n/**\n * Factory function to create authentication controller with configurable middlewares\n *\n * @param middlewares - Optional middleware functions to execute after controller actions\n * @returns An object containing all authentication controller methods\n */\nexport const authControllerFactory = async (middlewares: any = {}) => {\n const baseServices = getBaseServices();\n let prismaQueryOptions: Record<string, any> = {};\n\n const userModules = await importPrismaModelModules(\"user\");\n if (userModules) prismaQueryOptions = userModules?.prismaQueryOptions || {};\n\n const stringifiedQueryOptions = JSON.stringify(\n deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.findOne || {}\n ) || {}\n );\n\n return {\n /**\n * Retrieves the current authenticated user's information\n */\n getMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].findOne(\n { id: req.user!.id },\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Updates the current authenticated user's information\n */\n updateMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].updateOne(\n { id: req.user!.id },\n req.body,\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Logs out the current user by invalidating their access token cookie\n */\n logout: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (middlewares?.afterLogout) {\n req.responseData = null;\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n }\n ),\n\n /**\n * Authenticates a user using configurable username field and password\n * Username field can be specified in query parameter or config\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const initAuthConfigs = getInitConfigs()\n ?.authentication as InitConfigsAuthenticationOptions;\n const usernameField = determineUsernameField(req);\n\n const usernameValue = req.body[usernameField];\n const { password } = req.body;\n\n if (!usernameValue || !password) {\n return next(\n new AppError(`Please provide ${usernameField} and password`, 400)\n );\n }\n\n const prisma = getPrismaInstance();\n\n // Create dynamic where clause based on username field\n const whereClause: any = {};\n whereClause[usernameField] = usernameValue;\n\n const user = await (prisma as any).user.findUnique({\n where: whereClause,\n });\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(\n new AppError(`Incorrect ${usernameField} or password`, 401)\n );\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n process.env.JWT_COOKIE_EXPIRES_IN ||\n arkosEnv.JWT_COOKIE_EXPIRES_IN\n ) *\n 24 *\n 60 *\n 60 *\n 1000\n ),\n httpOnly: true,\n secure: req.secure || req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite: process.env.JWT_SECURE !== \"false\" ? \"lax\" : \"none\",\n };\n\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.JWT_SECURE !== \"false\"\n )\n cookieOptions.secure = true;\n\n if (middlewares?.afterLogin) {\n req.responseData = { accessToken: token };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"response-only\"\n ) {\n res.status(200).json({ accessToken: token });\n } else if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"cookie-only\"\n ) {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).send();\n } else {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).json({ accessToken: token });\n }\n }\n ),\n\n /**\n * Creates a new user account\n */\n signup: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userService = baseServices[\"user\"];\n\n const user = await userService.createOne(\n req.body,\n stringifiedQueryOptions\n );\n\n if (middlewares?.afterSignup) {\n req.responseData = { data: user };\n req.responseStatus = 201;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete user[key as keyof User];\n });\n\n res.status(201).json({ data: user });\n }\n ),\n\n /**\n * Updates the password of the authenticated user\n */\n updatePassword: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const { currentPassword, newPassword } = req.body;\n\n if (!currentPassword || !newPassword)\n return next(\n new AppError(\"currentPassword and newPassword are required\", 400)\n );\n\n const user = req.user;\n\n if (\n !user ||\n user?.active === false ||\n user?.deletedSelfAccount === true\n )\n return next(new AppError(\"User not found!\", 404));\n\n if (!user.isVerified)\n return next(\n new AppError(\"You need to verify your account to proceed\", 423, {\n error: \"email_verification_required\",\n })\n );\n\n // Check if the current password is correct\n const isPasswordCorrect = await authService.isCorrectPassword(\n String(currentPassword),\n String(user.password)\n );\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (!authService.isPasswordStrong(String(newPassword)))\n return next(\n new AppError(\n \"Password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\n );\n\n const prisma = getPrismaInstance();\n\n // Update the password\n await (prisma as any).user.update({\n where: { id: user.id },\n data: {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(),\n },\n });\n\n if (middlewares?.afterUpdatePassword) {\n (req as any).additionalData = {\n user,\n };\n req.responseData = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n }\n ),\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { CookieOptions } from \"express\";\nimport { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport authService from \"./auth.service\";\nimport { getBaseServices } from \"../base/base.service\";\nimport { User } from \"../../types\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getInitConfigs } from \"../../server\";\nimport { determineUsernameField } from \"./utils/helpers/auth.helpers\";\nimport { InitConfigsAuthenticationOptions } from \"../../types/app\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: false,\n passwordChangedAt: false,\n passwordResetToken: false,\n passwordResetTokenExpiresAt: false,\n verificationToken: false,\n verificationTokenExpiresAt: false,\n isVerified: false,\n deletedSelfAccount: false,\n active: false,\n};\n\n/**\n * Factory function to create authentication controller with configurable middlewares\n *\n * @param middlewares - Optional middleware functions to execute after controller actions\n * @returns An object containing all authentication controller methods\n */\nexport const authControllerFactory = async (middlewares: any = {}) => {\n const baseServices = getBaseServices();\n let prismaQueryOptions: Record<string, any> = {};\n\n const userModules = await importPrismaModelModules(\"user\");\n if (userModules) prismaQueryOptions = userModules?.prismaQueryOptions || {};\n\n const stringifiedQueryOptions = JSON.stringify(\n deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.findOne || {}\n ) || {}\n );\n\n return {\n /**\n * Retrieves the current authenticated user's information\n */\n getMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].findOne(\n { id: req.user!.id },\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Updates the current authenticated user's information\n */\n updateMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await baseServices[\"user\"].updateOne(\n { id: req.user!.id },\n req.body,\n stringifiedQueryOptions\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (req.user) delete req.user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = user;\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: req.user });\n }\n ),\n\n /**\n * Logs out the current user by invalidating their access token cookie\n */\n logout: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (middlewares?.afterLogout) {\n req.responseData = null;\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n }\n ),\n\n /**\n * Authenticates a user using configurable username field and password\n * Username field can be specified in query parameter or config\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const initAuthConfigs = getInitConfigs()\n ?.authentication as InitConfigsAuthenticationOptions;\n const usernameField = determineUsernameField(req);\n\n const usernameValue = req.body[usernameField];\n const { password } = req.body;\n\n if (!usernameValue || !password) {\n return next(\n new AppError(`Please provide ${usernameField} and password`, 400)\n );\n }\n\n const prisma = getPrismaInstance();\n\n // Create dynamic where clause based on username field\n const whereClause: any = {};\n whereClause[usernameField] = usernameValue;\n\n const user = await (prisma as any).user.findUnique({\n where: whereClause,\n });\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(\n new AppError(`Incorrect ${usernameField} or password`, 401)\n );\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n process.env.JWT_COOKIE_EXPIRES_IN ||\n arkosEnv.JWT_COOKIE_EXPIRES_IN\n ) *\n 24 *\n 60 *\n 60 *\n 1000\n ),\n httpOnly: true,\n secure: req.secure || req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite: process.env.JWT_SECURE !== \"false\" ? \"lax\" : \"none\",\n };\n\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.JWT_SECURE !== \"false\"\n )\n cookieOptions.secure = true;\n\n if (middlewares?.afterLogin) {\n req.responseData = { accessToken: token };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"response-only\"\n ) {\n res.status(200).json({ accessToken: token });\n } else if (\n initAuthConfigs?.login?.sendAccessTokenThrough === \"cookie-only\"\n ) {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).send();\n } else {\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n res.status(200).json({ accessToken: token });\n }\n }\n ),\n\n /**\n * Creates a new user account\n */\n signup: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userService = baseServices[\"user\"];\n\n const user = await userService.createOne(\n req.body,\n stringifiedQueryOptions\n );\n\n if (middlewares?.afterSignup) {\n req.responseData = { data: user };\n req.responseStatus = 201;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete user[key as keyof User];\n });\n\n res.status(201).json({ data: user });\n }\n ),\n\n /**\n * Updates the password of the authenticated user\n */\n updatePassword: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const { currentPassword, newPassword } = req.body;\n\n if (!currentPassword || !newPassword)\n return next(\n new AppError(\"currentPassword and newPassword are required\", 400)\n );\n\n const user = req.user;\n\n if (\n !user ||\n user?.active === false ||\n user?.deletedSelfAccount === true\n )\n return next(new AppError(\"User not found!\", 404));\n\n if (!user.isVerified)\n return next(\n new AppError(\"You need to verify your account to proceed\", 423, {\n error: \"email_verification_required\",\n })\n );\n\n // Check if the current password is correct\n const isPasswordCorrect = await authService.isCorrectPassword(\n String(currentPassword),\n String(user.password)\n );\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (!authService.isPasswordStrong(String(newPassword)))\n return next(\n new AppError(\n \"Password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\n );\n\n const prisma = getPrismaInstance();\n\n // Update the password\n await (prisma as any).user.update({\n where: { id: user.id },\n data: {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(),\n },\n });\n\n if (middlewares?.afterUpdatePassword) {\n (req as any).additionalData = {\n user,\n };\n req.responseData = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({\n status: \"success\",\n message: \"Password updated successfully!\",\n });\n }\n ),\n };\n};\n"]}
|