arkos 1.1.47-test → 1.1.48-test

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/prisma/index.ts"],"names":[],"mappings":";;;AACA,uEAA+D;AAErB,gGAFjC,0BAAS,OAEuC","sourcesContent":["import { PrismaQueryOptions } from \"../../types\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\n\nexport { PrismaQueryOptions, getModels as getPrismaModels };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/prisma/index.ts"],"names":[],"mappings":";;;AACA,uEAA+D;AAIhD,gGAJN,0BAAS,OAIY","sourcesContent":["import { PrismaQueryOptions, AuthPrismaQueryOptions } from \"../../types\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\n\nexport {\n PrismaQueryOptions,\n getModels as getPrismaModels,\n AuthPrismaQueryOptions,\n};\n"]}
@@ -8,9 +8,7 @@ const catch_async_1 = __importDefault(require("../error-handler/utils/catch-asyn
8
8
  const app_error_1 = __importDefault(require("../error-handler/utils/app-error"));
9
9
  const auth_service_1 = __importDefault(require("./auth.service"));
10
10
  const base_service_1 = require("../base/base.service");
11
- const prisma_helpers_1 = require("../../utils/helpers/prisma.helpers");
12
11
  const models_helpers_1 = require("../../utils/helpers/models.helpers");
13
- const deepmerge_helper_1 = __importDefault(require("../../utils/helpers/deepmerge.helper"));
14
12
  const arkos_env_1 = __importDefault(require("../../utils/arkos-env"));
15
13
  const server_1 = require("../../server");
16
14
  const auth_controller_helpers_1 = require("./utils/helpers/auth.controller.helpers");
@@ -18,15 +16,14 @@ exports.defaultExcludedUserFields = {
18
16
  password: false,
19
17
  };
20
18
  const authControllerFactory = async (middlewares = {}) => {
21
- const baseServices = (0, base_service_1.getBaseServices)();
19
+ const userService = (0, base_service_1.getBaseServices)()["user"];
22
20
  let prismaQueryOptions = {};
23
21
  const userModules = await (0, models_helpers_1.importPrismaModelModules)("user");
24
22
  if (userModules)
25
23
  prismaQueryOptions = userModules?.prismaQueryOptions || {};
26
- const queryOptions = (0, deepmerge_helper_1.default)(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions?.findOne || {});
27
24
  return {
28
25
  getMe: (0, catch_async_1.default)(async (req, res, next) => {
29
- const user = await baseServices["user"].findOne({ id: req.user.id });
26
+ const user = await userService.findOne({ id: req.user.id }, req.prismaQueryOptions || {});
30
27
  Object.keys(exports.defaultExcludedUserFields).forEach((key) => {
31
28
  if (user)
32
29
  delete user[key];
@@ -40,14 +37,14 @@ const authControllerFactory = async (middlewares = {}) => {
40
37
  }),
41
38
  updateMe: (0, catch_async_1.default)(async (req, res, next) => {
42
39
  if ("password" in req.body)
43
- throw new app_error_1.default("In order to update password use the update-password endpoint.", 400);
44
- const user = await baseServices["user"].updateOne({ id: req.user.id }, req.body);
40
+ throw new app_error_1.default("In order to update password use the update-password endpoint.", 400, {}, "invalid_field_password");
41
+ const user = await userService.updateOne({ id: req.user.id }, req.body, req.prismaQueryOptions || {});
45
42
  Object.keys(exports.defaultExcludedUserFields).forEach((key) => {
46
43
  if (user)
47
44
  delete user[key];
48
45
  });
49
46
  if (middlewares?.afterGetMe) {
50
- req.responseData = user;
47
+ req.responseData = { data: user };
51
48
  req.responseStatus = 200;
52
49
  return next();
53
50
  }
@@ -73,7 +70,6 @@ const authControllerFactory = async (middlewares = {}) => {
73
70
  const { password } = req.body;
74
71
  if (!usernameValue || !password)
75
72
  return next(new app_error_1.default(`Please provide both ${lastField} and password`, 400));
76
- const prisma = (0, prisma_helpers_1.getPrismaInstance)();
77
73
  let whereClause;
78
74
  if (usernameField?.includes?.(".")) {
79
75
  const valueToFind = (0, auth_controller_helpers_1.getNestedValue)(req.body, usernameField);
@@ -85,9 +81,7 @@ const authControllerFactory = async (middlewares = {}) => {
85
81
  else {
86
82
  whereClause = { [usernameField]: usernameValue };
87
83
  }
88
- const user = await prisma.user.findFirst({
89
- where: whereClause,
90
- });
84
+ const user = await userService.findOne(whereClause, req.prismaQueryOptions || {});
91
85
  if (!user ||
92
86
  !(await auth_service_1.default.isCorrectPassword(password, user.password))) {
93
87
  return next(new app_error_1.default(`Incorrect ${lastField} or password`, 401));
@@ -136,8 +130,7 @@ const authControllerFactory = async (middlewares = {}) => {
136
130
  res.status(200).send();
137
131
  }),
138
132
  signup: (0, catch_async_1.default)(async (req, res, next) => {
139
- const userService = baseServices["user"];
140
- const user = await userService.createOne(req.body, queryOptions);
133
+ const user = await userService.createOne(req.body, req.prismaQueryOptions || {});
141
134
  if (middlewares?.afterSignup) {
142
135
  req.responseData = { data: user };
143
136
  req.responseStatus = 201;
@@ -149,11 +142,10 @@ const authControllerFactory = async (middlewares = {}) => {
149
142
  res.status(201).json({ data: user });
150
143
  }),
151
144
  deleteMe: (0, catch_async_1.default)(async (req, res, next) => {
152
- const userService = baseServices["user"];
153
145
  const userId = req.user.id;
154
146
  const updatedUser = await userService.updateOne({ id: userId }, {
155
147
  deletedSelfAccountAt: new Date().toISOString(),
156
- });
148
+ }, req.prismaQueryOptions || {});
157
149
  if (middlewares?.afterDeleteMe) {
158
150
  req.responseData = { data: updatedUser };
159
151
  req.responseStatus = 200;
@@ -183,13 +175,9 @@ const authControllerFactory = async (middlewares = {}) => {
183
175
  return next(new app_error_1.default(initAuthConfigs?.passwordValidation?.message ||
184
176
  "The new password must contain at least one uppercase letter, one lowercase letter, and one number", 400));
185
177
  }
186
- const prisma = (0, prisma_helpers_1.getPrismaInstance)();
187
- await prisma.user.update({
188
- where: { id: user.id },
189
- data: {
190
- password: await auth_service_1.default.hashPassword(newPassword),
191
- passwordChangedAt: new Date(Date.now()),
192
- },
178
+ await userService.updateOne({ id: user.id }, {
179
+ password: await auth_service_1.default.hashPassword(newPassword),
180
+ passwordChangedAt: new Date(Date.now()),
193
181
  });
194
182
  if (middlewares?.afterUpdatePassword) {
195
183
  req.additionalData = {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;AAAA,qFAA4D;AAC5D,iFAAwD;AAGxD,kEAAyC;AACzC,uDAAuD;AAEvD,uEAAuE;AACvE,uEAA8E;AAC9E,4FAA6D;AAC7D,sEAA6C;AAC7C,yCAA8C;AAC9C,qFAMiD;AAKpC,QAAA,yBAAyB,GAAG;IACvC,QAAQ,EAAE,KAAK;CAChB,CAAC;AAQK,MAAM,qBAAqB,GAAG,KAAK,EAAE,cAAmB,EAAE,EAAE,EAAE;IACnE,MAAM,YAAY,GAAG,IAAA,8BAAe,GAAE,CAAC;IACvC,IAAI,kBAAkB,GAAwB,EAAE,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,IAAA,yCAAwB,EAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,WAAW;QAAE,kBAAkB,GAAG,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAE5E,MAAM,YAAY,GAAG,IAAA,0BAAS,EAC5B,kBAAkB,EAAE,YAAY,IAAI,EAAE,EACtC,kBAAkB,EAAE,OAAO,IAAI,EAAE,CAClC,CAAC;IAEF,OAAO;QAIL,KAAK,EAAE,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAEtE,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAKD,QAAQ,EAAE,IAAA,qBAAU,EAClB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,IAAI,UAAU,IAAI,GAAG,CAAC,IAAI;gBACxB,MAAM,IAAI,mBAAQ,CAChB,+DAA+D,EAC/D,GAAG,CACJ,CAAC;YAEJ,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,CAC/C,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EACpB,GAAG,CAAC,IAAI,CACT,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;gBACxB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAKD,MAAM,EAAE,IAAA,qBAAU,EAChB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,UAAU,EAAE;gBAC3C,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBACzC,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;gBACxB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CACF;QAOD,KAAK,EAAE,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,EAAE,cAAc,CAAC;YAErD,MAAM,aAAa,GAAG,IAAA,gDAAsB,EAAC,GAAG,CAAC,CAAC;YAGlD,MAAM,SAAS,GACb,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEhE,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE1C,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAE9B,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ;gBAC7B,OAAO,IAAI,CACT,IAAI,mBAAQ,CAAC,uBAAuB,SAAS,eAAe,EAAE,GAAG,CAAC,CACnE,CAAC;YAEJ,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;YAGnC,IAAI,WAAgC,CAAC;YAErC,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAEnC,MAAM,WAAW,GAAG,IAAA,wCAAc,EAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBAC5D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,WAAW,aAAa,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,WAAW,GAAG,IAAA,iDAAuB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBAEN,WAAW,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;YACnD,CAAC;YAGD,MAAM,IAAI,GAAG,MAAO,MAAc,CAAC,IAAI,CAAC,SAAS,CAAC;gBAChD,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YAEH,IACE,CAAC,IAAI;gBACL,CAAC,CAAC,MAAM,sBAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAC/D,CAAC;gBACD,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,aAAa,SAAS,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,KAAK,GAAG,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;YAEjD,MAAM,aAAa,GAAkB;gBACnC,OAAO,EAAE,IAAI,IAAI,CACf,IAAI,CAAC,GAAG,EAAE;oBACR,MAAM,CACJ,IAAA,8BAAI,EACF,WAAW,EAAE,GAAG,EAAE,SAAS;wBACxB,OAAO,CAAC,GAAG,CAAC,cAA6B;wBACzC,mBAAQ,CAAC,cAA6B,CAC1C,CACF,CACJ;gBACD,QAAQ,EACN,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ;oBAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;oBAC3C,IAAI;gBACN,MAAM,EACJ,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;oBAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;oBACxC,GAAG,CAAC,MAAM;oBACV,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,OAAO;gBAC9C,QAAQ,EACN,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ;oBAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB;oBAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;oBACnC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,KAAK;aACZ,CAAC;YAEF,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,eAAe;gBAC9D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAC3C,CAAC;gBACD,GAAG,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC5C,CAAC;YAED,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,aAAa;gBAC5D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB;gBAE3C,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YAEzD,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC9B,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,eAAe;gBAC9D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAC3C,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;iBAAM,IACL,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,aAAa;gBAC5D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB;gBAE3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CACF;QAKD,MAAM,EAAE,IAAA,qBAAU,EAChB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAEzC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,YAAmB,CAAC,CAAC;YAExE,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAID,QAAQ,EAAE,IAAA,qBAAU,EAClB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;YAE5B,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,SAAS,CAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,EACd;gBACE,oBAAoB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC/C,CACF,CAAC;YAEF,IAAI,WAAW,EAAE,aAAa,EAAE,CAAC;gBAC/B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACzC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,OAAO,WAAW,CAAC,GAAiB,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,8BAA8B;aACxC,CAAC,CAAC;QACL,CAAC,CACF;QAKD,cAAc,EAAE,IAAA,qBAAU,EACxB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAElD,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW;gBAClC,OAAO,IAAI,CACT,IAAI,mBAAQ,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAClE,CAAC;YAEJ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtB,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,KAAK,IAAI,IAAI,EAAE,oBAAoB;gBACjE,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;YAGpD,MAAM,iBAAiB,GAAG,MAAM,sBAAW,CAAC,iBAAiB,CAC3D,MAAM,CAAC,eAAe,CAAC,EACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CACtB,CAAC;YAEF,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;YACjC,MAAM,eAAe,GAAG,OAAO,EAAE,cAAc,CAAC;YAGhD,IAAI,CAAC,iBAAiB;gBACpB,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC,CAAC;YAGnE,IACE,CAAC,sBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAClD,CAAC,OAAO,EAAE,UAAU,EACpB,CAAC;gBACD,OAAO,IAAI,CACT,IAAI,mBAAQ,CACV,eAAe,EAAE,kBAAkB,EAAE,OAAO;oBAC1C,mGAAmG,EACrG,GAAG,CACJ,CACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;YAGnC,MAAO,MAAc,CAAC,IAAI,CAAC,MAAM,CAAC;gBAChC,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;gBACtB,IAAI,EAAE;oBACJ,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,WAAW,CAAC;oBACrD,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;iBACxC;aACF,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,mBAAmB,EAAE,CAAC;gBACrC,GAAG,CAAC,cAAc,GAAG;oBACnB,IAAI;iBACL,CAAC;gBACF,GAAG,CAAC,YAAY,GAAG;oBACjB,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,gCAAgC;iBAC1C,CAAC;gBACF,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC,CACF;KACF,CAAC;AACJ,CAAC,CAAC;AAtWW,QAAA,qBAAqB,yBAsWhC","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 { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n MsDuration,\n toMs,\n} from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: 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 queryOptions = deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.findOne || {}\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({ id: req.user!.id });\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400\n );\n\n const user = await baseServices[\"user\"].updateOne(\n { id: req.user!.id },\n req.body\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete 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: 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 * Supports nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n // For the error message, we only care about the top-level field name\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(`Please provide both ${lastField} and password`, 400)\n );\n\n const prisma = getPrismaInstance();\n\n // Create appropriate where clause for the query\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\n // For nested paths, we need to extract the actual value to search for\n const valueToFind = getNestedValue(req.body, usernameField);\n if (valueToFind === undefined) {\n return next(new AppError(`Invalid ${usernameField} provided`, 400));\n }\n whereClause = createPrismaWhereClause(usernameField, valueToFind);\n } else {\n // Simple field case\n whereClause = { [usernameField]: usernameValue };\n }\n\n // Use findFirst instead of findUnique for complex queries\n const user = await (prisma as any).user.findFirst({\n where: whereClause,\n });\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(new AppError(`Incorrect ${lastField} or password`, 401));\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n toMs(\n authConfigs?.jwt?.expiresIn ||\n (process.env.JWT_EXPIRES_IN as MsDuration) ||\n (arkosEnv.JWT_EXPIRES_IN as MsDuration)\n )\n )\n ),\n httpOnly:\n authConfigs?.jwt?.cookie?.httpOnly ||\n process.env.JWT_COOKIE_HTTP_ONLY === \"true\" ||\n true,\n secure:\n authConfigs?.jwt?.cookie?.secure ||\n process.env.JWT_COOKIE_SECURE === \"true\" ||\n req.secure ||\n req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite:\n authConfigs?.jwt?.cookie?.sameSite ||\n process.env.JWT_COOKIE_SAME_SITE ||\n process.env.NODE_ENV === \"production\"\n ? \"none\"\n : \"lax\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n req.responseData = { accessToken: token };\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n\n if (middlewares?.afterLogin) {\n req.additionalData = { user };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n res.status(200).json(req.responseData);\n } else if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.status(200).send();\n }\n ),\n\n /**\n * Creates a new user account using the userService\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(req.body, queryOptions as any);\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 * Marks user account as self-deleted by setting deletedSelfAccountAt timestamp\n */\n deleteMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userService = baseServices[\"user\"];\n const userId = req.user!.id; // Assuming the authenticated user's ID is available in req.user\n\n const updatedUser = await userService.updateOne(\n { id: userId },\n {\n deletedSelfAccountAt: new Date().toISOString(),\n }\n );\n\n if (middlewares?.afterDeleteMe) {\n req.responseData = { data: updatedUser };\n req.responseStatus = 200;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete updatedUser[key as keyof User];\n });\n\n res.status(200).json({\n message: \"Account deleted successfully\",\n });\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 (!user || user?.isActive === false || user?.deletedSelfAccountAt)\n return next(new AppError(\"User not found!\", 404));\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 const configs = getArkosConfig();\n const initAuthConfigs = configs?.authentication;\n // const modules = getModelModules(\"auth\");\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (\n !authService.isPasswordStrong(String(newPassword)) &&\n !configs?.validation\n ) {\n return next(\n new AppError(\n initAuthConfigs?.passwordValidation?.message ||\n \"The new password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\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(Date.now()),\n },\n });\n\n if (middlewares?.afterUpdatePassword) {\n req.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":";;;;;;AAAA,qFAA4D;AAC5D,iFAAwD;AAGxD,kEAAyC;AACzC,uDAAuD;AAGvD,uEAA8E;AAE9E,sEAA6C;AAC7C,yCAA8C;AAC9C,qFAMiD;AAKpC,QAAA,yBAAyB,GAAG;IACvC,QAAQ,EAAE,KAAK;CAChB,CAAC;AAQK,MAAM,qBAAqB,GAAG,KAAK,EAAE,cAAmB,EAAE,EAAE,EAAE;IACnE,MAAM,WAAW,GAAG,IAAA,8BAAe,GAAE,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,kBAAkB,GAAwB,EAAE,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,IAAA,yCAAwB,EAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,WAAW;QAAE,kBAAkB,GAAG,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAE5E,OAAO;QAIL,KAAK,EAAE,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CACpC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EACpB,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAC7B,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAKD,QAAQ,EAAE,IAAA,qBAAU,EAClB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,IAAI,UAAU,IAAI,GAAG,CAAC,IAAI;gBACxB,MAAM,IAAI,mBAAQ,CAChB,+DAA+D,EAC/D,GAAG,EACH,EAAE,EACF,wBAAwB,CACzB,CAAC;YAEJ,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CACtC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EACpB,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAC7B,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAKD,MAAM,EAAE,IAAA,qBAAU,EAChB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,UAAU,EAAE;gBAC3C,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBACzC,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;gBACxB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CACF;QAOD,KAAK,EAAE,IAAA,qBAAU,EACf,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,EAAE,cAAc,CAAC;YAErD,MAAM,aAAa,GAAG,IAAA,gDAAsB,EAAC,GAAG,CAAC,CAAC;YAGlD,MAAM,SAAS,GACb,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEhE,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE1C,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAE9B,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ;gBAC7B,OAAO,IAAI,CACT,IAAI,mBAAQ,CAAC,uBAAuB,SAAS,eAAe,EAAE,GAAG,CAAC,CACnE,CAAC;YAGJ,IAAI,WAAgC,CAAC;YAErC,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAEnC,MAAM,WAAW,GAAG,IAAA,wCAAc,EAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBAC5D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,WAAW,aAAa,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,WAAW,GAAG,IAAA,iDAAuB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBAEN,WAAW,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;YACnD,CAAC;YAGD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CACpC,WAAW,EACX,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAC7B,CAAC;YAEF,IACE,CAAC,IAAI;gBACL,CAAC,CAAC,MAAM,sBAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAC/D,CAAC;gBACD,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,aAAa,SAAS,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,KAAK,GAAG,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;YAEjD,MAAM,aAAa,GAAkB;gBACnC,OAAO,EAAE,IAAI,IAAI,CACf,IAAI,CAAC,GAAG,EAAE;oBACR,MAAM,CACJ,IAAA,8BAAI,EACF,WAAW,EAAE,GAAG,EAAE,SAAS;wBACxB,OAAO,CAAC,GAAG,CAAC,cAA6B;wBACzC,mBAAQ,CAAC,cAA6B,CAC1C,CACF,CACJ;gBACD,QAAQ,EACN,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ;oBAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;oBAC3C,IAAI;gBACN,MAAM,EACJ,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;oBAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;oBACxC,GAAG,CAAC,MAAM;oBACV,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,OAAO;gBAC9C,QAAQ,EACN,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ;oBAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB;oBAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;oBACnC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,KAAK;aACZ,CAAC;YAEF,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,eAAe;gBAC9D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAC3C,CAAC;gBACD,GAAG,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC5C,CAAC;YAED,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,aAAa;gBAC5D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB;gBAE3C,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YAEzD,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC9B,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IACE,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,eAAe;gBAC9D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAC3C,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;iBAAM,IACL,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,aAAa;gBAC5D,WAAW,EAAE,KAAK,EAAE,sBAAsB,KAAK,MAAM;gBACrD,CAAC,WAAW,EAAE,KAAK,EAAE,sBAAsB;gBAE3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CACF;QAKD,MAAM,EAAE,IAAA,qBAAU,EAChB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CACtC,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAC7B,CAAC;YAEF,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,OAAO,IAAI,CAAC,GAAiB,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACF;QAID,QAAQ,EAAE,IAAA,qBAAU,EAClB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,MAAM,GAAG,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;YAE5B,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,SAAS,CAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,EACd;gBACE,oBAAoB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC/C,EACD,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAC7B,CAAC;YAEF,IAAI,WAAW,EAAE,aAAa,EAAE,CAAC;gBAC/B,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACzC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrD,OAAO,WAAW,CAAC,GAAiB,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,8BAA8B;aACxC,CAAC,CAAC;QACL,CAAC,CACF;QAKD,cAAc,EAAE,IAAA,qBAAU,EACxB,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACvB,EAAE;YACF,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAElD,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW;gBAClC,OAAO,IAAI,CACT,IAAI,mBAAQ,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAClE,CAAC;YAEJ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtB,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,KAAK,IAAI,IAAI,EAAE,oBAAoB;gBACjE,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;YAGpD,MAAM,iBAAiB,GAAG,MAAM,sBAAW,CAAC,iBAAiB,CAC3D,MAAM,CAAC,eAAe,CAAC,EACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CACtB,CAAC;YAEF,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;YACjC,MAAM,eAAe,GAAG,OAAO,EAAE,cAAc,CAAC;YAGhD,IAAI,CAAC,iBAAiB;gBACpB,OAAO,IAAI,CAAC,IAAI,mBAAQ,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC,CAAC;YAGnE,IACE,CAAC,sBAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAClD,CAAC,OAAO,EAAE,UAAU,EACpB,CAAC;gBACD,OAAO,IAAI,CACT,IAAI,mBAAQ,CACV,eAAe,EAAE,kBAAkB,EAAE,OAAO;oBAC1C,mGAAmG,EACrG,GAAG,CACJ,CACF,CAAC;YACJ,CAAC;YAGD,MAAM,WAAW,CAAC,SAAS,CACzB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EACf;gBACE,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,WAAW,CAAC;gBACrD,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACxC,CACF,CAAC;YAEF,IAAI,WAAW,EAAE,mBAAmB,EAAE,CAAC;gBACrC,GAAG,CAAC,cAAc,GAAG;oBACnB,IAAI;iBACL,CAAC;gBACF,GAAG,CAAC,YAAY,GAAG;oBACjB,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,gCAAgC;iBAC1C,CAAC;gBACF,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC,CACF;KACF,CAAC;AACJ,CAAC,CAAC;AArWW,QAAA,qBAAqB,yBAqWhC","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 { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n MsDuration,\n toMs,\n} from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: 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 userService = getBaseServices()[\"user\"];\n let prismaQueryOptions: Record<string, any> = {};\n\n const userModules = await importPrismaModelModules(\"user\");\n if (userModules) prismaQueryOptions = userModules?.prismaQueryOptions || {};\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 userService.findOne(\n { id: req.user!.id },\n req.prismaQueryOptions || {}\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400,\n {},\n \"invalid_field_password\"\n );\n\n const user = await userService.updateOne(\n { id: req.user!.id },\n req.body,\n req.prismaQueryOptions || {}\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 * Supports nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n // For the error message, we only care about the top-level field name\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(`Please provide both ${lastField} and password`, 400)\n );\n\n // Create appropriate where clause for the query\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\n // For nested paths, we need to extract the actual value to search for\n const valueToFind = getNestedValue(req.body, usernameField);\n if (valueToFind === undefined) {\n return next(new AppError(`Invalid ${usernameField} provided`, 400));\n }\n whereClause = createPrismaWhereClause(usernameField, valueToFind);\n } else {\n // Simple field case\n whereClause = { [usernameField]: usernameValue };\n }\n\n // Use findFirst instead of findUnique for complex queries\n const user = await userService.findOne(\n whereClause,\n req.prismaQueryOptions || {}\n );\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(new AppError(`Incorrect ${lastField} or password`, 401));\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n toMs(\n authConfigs?.jwt?.expiresIn ||\n (process.env.JWT_EXPIRES_IN as MsDuration) ||\n (arkosEnv.JWT_EXPIRES_IN as MsDuration)\n )\n )\n ),\n httpOnly:\n authConfigs?.jwt?.cookie?.httpOnly ||\n process.env.JWT_COOKIE_HTTP_ONLY === \"true\" ||\n true,\n secure:\n authConfigs?.jwt?.cookie?.secure ||\n process.env.JWT_COOKIE_SECURE === \"true\" ||\n req.secure ||\n req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite:\n authConfigs?.jwt?.cookie?.sameSite ||\n process.env.JWT_COOKIE_SAME_SITE ||\n process.env.NODE_ENV === \"production\"\n ? \"none\"\n : \"lax\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n req.responseData = { accessToken: token };\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n\n if (middlewares?.afterLogin) {\n req.additionalData = { user };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n res.status(200).json(req.responseData);\n } else if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.status(200).send();\n }\n ),\n\n /**\n * Creates a new user account using the userService\n */\n signup: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await userService.createOne(\n req.body,\n req.prismaQueryOptions || {}\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 * Marks user account as self-deleted by setting deletedSelfAccountAt timestamp\n */\n deleteMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userId = req.user!.id; // Assuming the authenticated user's ID is available in req.user\n\n const updatedUser = await userService.updateOne(\n { id: userId },\n {\n deletedSelfAccountAt: new Date().toISOString(),\n },\n req.prismaQueryOptions || {}\n );\n\n if (middlewares?.afterDeleteMe) {\n req.responseData = { data: updatedUser };\n req.responseStatus = 200;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete updatedUser[key as keyof User];\n });\n\n res.status(200).json({\n message: \"Account deleted successfully\",\n });\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 (!user || user?.isActive === false || user?.deletedSelfAccountAt)\n return next(new AppError(\"User not found!\", 404));\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 const configs = getArkosConfig();\n const initAuthConfigs = configs?.authentication;\n // const modules = getModelModules(\"auth\");\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (\n !authService.isPasswordStrong(String(newPassword)) &&\n !configs?.validation\n ) {\n return next(\n new AppError(\n initAuthConfigs?.passwordValidation?.message ||\n \"The new password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\n );\n }\n\n // Update the password\n await userService.updateOne(\n { id: user.id },\n {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(Date.now()),\n }\n );\n\n if (middlewares?.afterUpdatePassword) {\n req.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"]}
@@ -13,7 +13,7 @@ const base_middlewares_1 = require("../base/base.middlewares");
13
13
  const deepmerge_helper_1 = __importDefault(require("../../utils/helpers/deepmerge.helper"));
14
14
  const router = (0, express_1.Router)();
15
15
  async function getAuthRouter(arkosConfigs) {
16
- const { middlewares, dtos, schemas } = await (0, models_helpers_1.importPrismaModelModules)("auth");
16
+ const { middlewares, dtos, schemas, prismaQueryOptions } = await (0, models_helpers_1.importPrismaModelModules)("auth");
17
17
  const authController = await (0, auth_controller_1.authControllerFactory)(middlewares);
18
18
  const getValidationSchemaOrDto = (key) => {
19
19
  const validationConfigs = arkosConfigs?.validation;
@@ -26,17 +26,17 @@ async function getAuthRouter(arkosConfigs) {
26
26
  return undefined;
27
27
  };
28
28
  router
29
- .get("/users/me", auth_service_1.default.authenticate, middlewares?.beforeGetMe || authController.getMe, middlewares?.beforeGetMe
29
+ .get("/users/me", auth_service_1.default.authenticate, (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "getMe"), middlewares?.beforeGetMe || authController.getMe, middlewares?.beforeGetMe
30
30
  ? authController.getMe
31
31
  : middlewares?.afterGetMe || base_middlewares_1.sendResponse, middlewares?.beforeGetMe && middlewares?.afterGetMe
32
32
  ? middlewares?.afterGetMe
33
33
  : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
34
- .patch("/users/me", auth_service_1.default.authenticate, (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("updateMe")), middlewares?.beforeUpdateMe || authController.updateMe, middlewares?.beforeUpdateMe
34
+ .patch("/users/me", auth_service_1.default.authenticate, (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("updateMe")), (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "updateMe"), middlewares?.beforeUpdateMe || authController.updateMe, middlewares?.beforeUpdateMe
35
35
  ? authController.updateMe
36
36
  : middlewares?.afterUpdateMe || base_middlewares_1.sendResponse, middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe
37
37
  ? middlewares?.afterUpdateMe
38
38
  : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
39
- .delete("/users/me", auth_service_1.default.authenticate, middlewares?.beforeDeleteMe || authController.deleteMe, middlewares?.beforeDeleteMe
39
+ .delete("/users/me", auth_service_1.default.authenticate, (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "deleteMe"), middlewares?.beforeDeleteMe || authController.deleteMe, middlewares?.beforeDeleteMe
40
40
  ? authController.deleteMe
41
41
  : middlewares?.afterDeleteMe || base_middlewares_1.sendResponse, middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe
42
42
  ? middlewares?.afterDeleteMe
@@ -47,7 +47,7 @@ async function getAuthRouter(arkosConfigs) {
47
47
  standardHeaders: "draft-7",
48
48
  legacyHeaders: false,
49
49
  }, arkosConfigs?.authentication?.requestRateLimitOptions || {})));
50
- router.post("/auth/login", (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("login")), middlewares?.beforeLogin || authController.login, middlewares?.beforeLogin
50
+ router.post("/auth/login", (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("login")), (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "login"), middlewares?.beforeLogin || authController.login, middlewares?.beforeLogin
51
51
  ? authController.login
52
52
  : middlewares?.afterLogin || base_middlewares_1.sendResponse, middlewares?.beforeLogin && middlewares?.afterLogin
53
53
  ? middlewares?.afterLogin
@@ -57,12 +57,12 @@ async function getAuthRouter(arkosConfigs) {
57
57
  : middlewares?.afterLogout || base_middlewares_1.sendResponse, middlewares?.beforeLogout && middlewares?.afterLogout
58
58
  ? middlewares?.afterLogout
59
59
  : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse);
60
- router.post("/auth/signup", (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("signup")), middlewares?.beforeSignup || authController.signup, middlewares?.beforeSignup
60
+ router.post("/auth/signup", (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("signup")), (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "signup"), middlewares?.beforeSignup || authController.signup, middlewares?.beforeSignup
61
61
  ? authController.signup
62
62
  : middlewares?.afterSignup || base_middlewares_1.sendResponse, middlewares?.beforeSignup && middlewares?.afterSignup
63
63
  ? middlewares?.afterSignup
64
64
  : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse);
65
- router.post("/auth/update-password", auth_service_1.default.authenticate, (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("updatePassword")), middlewares?.beforeUpdatePassword || authController.updatePassword, middlewares?.beforeUpdatePassword
65
+ router.post("/auth/update-password", auth_service_1.default.authenticate, (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(getValidationSchemaOrDto("updatePassword")), (0, base_middlewares_1.addPrismaQueryOptionsToRequest)(prismaQueryOptions, "updatePassword"), middlewares?.beforeUpdatePassword || authController.updatePassword, middlewares?.beforeUpdatePassword
66
66
  ? authController.updatePassword
67
67
  : middlewares?.afterUpdatePassword || base_middlewares_1.sendResponse, middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword
68
68
  ? middlewares?.afterUpdatePassword
@@ -1 +1 @@
1
- {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":";;;;;AAcA,sCAkIC;AAhJD,qCAAiC;AACjC,uDAA0D;AAC1D,kEAAyC;AACzC,4EAA2C;AAC3C,uEAA8E;AAC9E,+DAGkC;AAElC,4FAA6D;AAE7D,MAAM,MAAM,GAAW,IAAA,gBAAM,GAAE,CAAC;AAEzB,KAAK,UAAU,aAAa,CAAC,YAAyB;IAC3D,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,yCAAwB,EAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,MAAM,IAAA,uCAAqB,EAAC,WAAW,CAAC,CAAC;IAGhE,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/C,MAAM,iBAAiB,GAAG,YAAY,EAAE,UAAU,CAAC;QACnD,IAAI,iBAAiB,EAAE,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACtD,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,iBAAiB,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAC;YACjD,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM;SACH,GAAG,CACF,WAAW,EACX,sBAAW,CAAC,YAAY,EACxB,WAAW,EAAE,WAAW,IAAI,cAAc,CAAC,KAAK,EAChD,WAAW,EAAE,WAAW;QACtB,CAAC,CAAC,cAAc,CAAC,KAAK;QACtB,CAAC,CAAC,WAAW,EAAE,UAAU,IAAI,+BAAY,EAC3C,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,UAAU;QACjD,CAAC,CAAC,WAAW,EAAE,UAAU;QACzB,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb;SACA,KAAK,CACJ,WAAW,EACX,sBAAW,CAAC,YAAY,EACxB,IAAA,+DAA4C,EAC1C,wBAAwB,CAAC,UAAU,CAAC,CACrC,EACD,WAAW,EAAE,cAAc,IAAI,cAAc,CAAC,QAAQ,EACtD,WAAW,EAAE,cAAc;QACzB,CAAC,CAAC,cAAc,CAAC,QAAQ;QACzB,CAAC,CAAC,WAAW,EAAE,aAAa,IAAI,+BAAY,EAC9C,WAAW,EAAE,cAAc,IAAI,WAAW,EAAE,aAAa;QACvD,CAAC,CAAC,WAAW,EAAE,aAAa;QAC5B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb;SACA,MAAM,CACL,WAAW,EACX,sBAAW,CAAC,YAAY,EACxB,WAAW,EAAE,cAAc,IAAI,cAAc,CAAC,QAAQ,EACtD,WAAW,EAAE,cAAc;QACzB,CAAC,CAAC,cAAc,CAAC,QAAQ;QACzB,CAAC,CAAC,WAAW,EAAE,aAAa,IAAI,+BAAY,EAC9C,WAAW,EAAE,cAAc,IAAI,WAAW,EAAE,aAAa;QACvD,CAAC,CAAC,WAAW,EAAE,aAAa;QAC5B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;IAEJ,MAAM,CAAC,GAAG,CACR,IAAA,4BAAS,EACP,IAAA,0BAAS,EACP;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,SAAS;QAC1B,aAAa,EAAE,KAAK;KACrB,EACD,YAAY,EAAE,cAAc,EAAE,uBAAuB,IAAI,EAAE,CAC5D,CACF,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,IAAA,+DAA4C,EAC1C,wBAAwB,CAAC,OAAO,CAAC,CAClC,EACD,WAAW,EAAE,WAAW,IAAI,cAAc,CAAC,KAAK,EAChD,WAAW,EAAE,WAAW;QACtB,CAAC,CAAC,cAAc,CAAC,KAAK;QACtB,CAAC,CAAC,WAAW,EAAE,UAAU,IAAI,+BAAY,EAC3C,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,UAAU;QACjD,CAAC,CAAC,WAAW,EAAE,UAAU;QACzB,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,cAAc,EACd,sBAAW,CAAC,YAAY,EACxB,WAAW,EAAE,YAAY,IAAI,cAAc,CAAC,MAAM,EAClD,WAAW,EAAE,YAAY;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM;QACvB,CAAC,CAAC,WAAW,EAAE,WAAW,IAAI,+BAAY,EAC5C,WAAW,EAAE,YAAY,IAAI,WAAW,EAAE,WAAW;QACnD,CAAC,CAAC,WAAW,EAAE,WAAW;QAC1B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,IAAA,+DAA4C,EAC1C,wBAAwB,CAAC,QAAQ,CAAC,CACnC,EACD,WAAW,EAAE,YAAY,IAAI,cAAc,CAAC,MAAM,EAClD,WAAW,EAAE,YAAY;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM;QACvB,CAAC,CAAC,WAAW,EAAE,WAAW,IAAI,+BAAY,EAC5C,WAAW,EAAE,YAAY,IAAI,WAAW,EAAE,WAAW;QACnD,CAAC,CAAC,WAAW,EAAE,WAAW;QAC1B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,sBAAW,CAAC,YAAY,EACxB,IAAA,+DAA4C,EAC1C,wBAAwB,CAAC,gBAAgB,CAAC,CAC3C,EACD,WAAW,EAAE,oBAAoB,IAAI,cAAc,CAAC,cAAc,EAClE,WAAW,EAAE,oBAAoB;QAC/B,CAAC,CAAC,cAAc,CAAC,cAAc;QAC/B,CAAC,CAAC,WAAW,EAAE,mBAAmB,IAAI,+BAAY,EACpD,WAAW,EAAE,oBAAoB,IAAI,WAAW,EAAE,mBAAmB;QACnE,CAAC,CAAC,WAAW,EAAE,mBAAmB;QAClC,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas } = await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeGetMe || authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe || sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n middlewares?.beforeUpdateMe || authController.updateMe,\n middlewares?.beforeUpdateMe\n ? authController.updateMe\n : middlewares?.afterUpdateMe || sendResponse,\n middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe\n ? middlewares?.afterUpdateMe\n : sendResponse,\n sendResponse\n )\n .delete(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeDeleteMe || authController.deleteMe,\n middlewares?.beforeDeleteMe\n ? authController.deleteMe\n : middlewares?.afterDeleteMe || sendResponse,\n middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe\n ? middlewares?.afterDeleteMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n middlewares?.beforeLogin || authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin || sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n middlewares?.beforeLogout || authController.logout,\n middlewares?.beforeLogout\n ? authController.logout\n : middlewares?.afterLogout || sendResponse,\n middlewares?.beforeLogout && middlewares?.afterLogout\n ? middlewares?.afterLogout\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n middlewares?.beforeSignup || authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup || sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n middlewares?.beforeUpdatePassword || authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword || sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
1
+ {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas, prismaQueryOptions } =\n await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n middlewares?.beforeGetMe || authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe || sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n middlewares?.beforeUpdateMe || authController.updateMe,\n middlewares?.beforeUpdateMe\n ? authController.updateMe\n : middlewares?.afterUpdateMe || sendResponse,\n middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe\n ? middlewares?.afterUpdateMe\n : sendResponse,\n sendResponse\n )\n .delete(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n middlewares?.beforeDeleteMe || authController.deleteMe,\n middlewares?.beforeDeleteMe\n ? authController.deleteMe\n : middlewares?.afterDeleteMe || sendResponse,\n middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe\n ? middlewares?.afterDeleteMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n middlewares?.beforeLogin || authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin || sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n middlewares?.beforeLogout || authController.logout,\n middlewares?.beforeLogout\n ? authController.logout\n : middlewares?.afterLogout || sendResponse,\n middlewares?.beforeLogout && middlewares?.afterLogout\n ? middlewares?.afterLogout\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n middlewares?.beforeSignup || authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup || sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n middlewares?.beforeUpdatePassword || authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword || sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
@@ -33,10 +33,17 @@ function addRouteMiddlwaresAndConfigs() { }
33
33
  function addPrismaQueryOptionsToRequest(prismaQueryOptions, action) {
34
34
  return (req, res, next) => {
35
35
  const configs = (0, server_1.getArkosConfig)();
36
- const firstMerge = (0, deepmerge_helper_1.default)(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions?.[action] || {});
37
- req.prismaQueryOptions = (0, deepmerge_helper_1.default)(firstMerge, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
38
- ? req.query?.prismaQueryOptions
39
- : "{}"));
36
+ if (prismaQueryOptions && action in prismaQueryOptions) {
37
+ const firstMerge = (0, deepmerge_helper_1.default)(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions[action] || {});
38
+ req.prismaQueryOptions = (0, deepmerge_helper_1.default)(firstMerge, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
39
+ ? req.query?.prismaQueryOptions || "{}"
40
+ : "{}"));
41
+ }
42
+ else {
43
+ req.prismaQueryOptions = (0, deepmerge_helper_1.default)(prismaQueryOptions?.queryOptions || {}, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
44
+ ? req.query?.prismaQueryOptions || "{}"
45
+ : "{}"));
46
+ }
40
47
  next();
41
48
  };
42
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\n\nexport function callNext(req: Request, res: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(\n req: ArkosRequest,\n res: ArkosResponse,\n next: NextFunction\n) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T>,\n action: keyof PrismaQueryOptions<T>\n) {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const firstMerge = deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.[action] || {}\n ) as Record<string, any>;\n\n req.prismaQueryOptions = deepmerge(\n firstMerge,\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string)\n : \"{}\"\n )\n );\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n // if (process.env.NODE_ENV === \"production\") return next()\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const dayName = dayNames[now.getDay()];\n const dayOfMonth = now.getDate();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mINFO\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n // Keep the commented-out example as it is\n // console.info(\n // `[\\x1b[36mINFO\\x1b[0m] ${dayName} ${dayOfMonth} ${time} ${methodColor}${req.method}\\x1b[0m ${req.originalUrl} \\x1b[32m${res.statusCode}\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n // );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
1
+ {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":";;;;;AAkBA,4BAEC;AAED,oCAeC;AAED,oEAAiD;AAkBjD,wEAoCC;AAKD,8CAwDC;AAcD,oGA2BC;AA1LD,yCAA8C;AAC9C,4FAA6D;AAC7D,+DAAyD;AACzD,4EAAmD;AACnD,kFAAyD;AAKzD,SAAgB,QAAQ,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACtE,IAAI,EAAE,CAAC;AACT,CAAC;AAED,SAAgB,YAAY,CAC1B,GAAiB,EACjB,GAAkB,EAClB,IAAkB;IAElB,IAAI,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,GAAG;QACrC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAC5C,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,EAAE,cAAc;QAC9C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC5D,IAAI,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY;QACvD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;;QAE/C,GAAG;aACA,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,4BAA4B,KAAI,CAAC;AAkBjD,SAAgB,8BAA8B,CAC5C,kBAAqE,EACrE,MAAyB;IAEzB,OAAO,CAAC,GAAiB,EAAE,GAAkB,EAAE,IAAkB,EAAE,EAAE;QACnE,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;QAGjC,IAAI,kBAAkB,IAAI,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,IAAA,0BAAS,EACzB,kBAA0B,EAAE,YAAY,IAAI,EAAE,EAC9C,kBAA0B,CAAC,MAAM,CAAC,IAAI,EAAE,CACnB,CAAC;YAEzB,GAAG,CAAC,kBAAkB,GAAG,IAAA,0BAAS,EAChC,UAAU,EACV,IAAI,CAAC,KAAK,CACR,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gCAAgC;gBAC5D,CAAC,CAAE,GAAG,CAAC,KAAK,EAAE,kBAA6B,IAAI,IAAI;gBACnD,CAAC,CAAC,IAAI,CACT,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YAEN,GAAG,CAAC,kBAAkB,GAAG,IAAA,0BAAS,EAC/B,kBAA0B,EAAE,YAAY,IAAI,EAAE,EAC/C,IAAI,CAAC,KAAK,CACR,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gCAAgC;gBAC5D,CAAC,CAAE,GAAG,CAAC,KAAK,EAAE,kBAA6B,IAAI,IAAI;gBACnD,CAAC,CAAC,IAAI,CACT,CACF,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAKD,SAAgB,iBAAiB,CAC/B,GAAY,EACZ,GAAa,EACb,IAAkB;IAGlB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAG7B,MAAM,YAAY,GAAG;QACnB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,UAAU;KACpB,CAAC;IAGF,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,EAAE;QAC5C,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,OAAO,UAAU,CAAC;QAC7D,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,OAAO,UAAU,CAAC;QAC7D,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,OAAO,UAAU,CAAC;QAC7D,IAAI,UAAU,IAAI,GAAG;YAAE,OAAO,UAAU,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAGxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,WAAW,GACf,YAAY,CAAC,GAAG,CAAC,MAAmC,CAAC,IAAI,SAAS,CAAC;QACrE,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnD,OAAO,CAAC,IAAI,CACV,iCAAiC,IAAI,WAAW,WAAW,GACzD,GAAG,CAAC,MACN,WAAW,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,GAC3D,GAAG,CAAC,UACN,mBAAmB,QAAQ,WAAW,CACvC,CAAC;IAKJ,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC;AAcD,SAAgB,4CAA4C,CAC1D,gBAAqD,EACrD,+BAAkD;IAElD,OAAO,IAAA,0BAAU,EACf,KAAK,EAAE,GAAiB,EAAE,GAAkB,EAAE,IAAuB,EAAE,EAAE;QACvE,MAAM,iBAAiB,GAAG,IAAA,uBAAc,GAAE,EAAE,UAAU,CAAC;QACvD,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAEpB,IAAI,iBAAiB,EAAE,QAAQ,KAAK,iBAAiB,IAAI,gBAAgB;YACvE,GAAG,CAAC,IAAI,GAAG,MAAM,IAAA,sBAAW,EAC1B,gBAAuC,EACvC,IAAI,EACJ,IAAA,0BAAS,EACP;gBACE,SAAS,EAAE,IAAI;gBACf,GAAG,+BAA+B;aACnC,EACD,iBAAiB,EAAE,iBAAiB,IAAI,EAAE,CAC3C,CACF,CAAC;aACC,IAAI,iBAAiB,EAAE,QAAQ,KAAK,KAAK,IAAI,gBAAgB;YAChE,GAAG,CAAC,IAAI,GAAG,MAAM,IAAA,yBAAc,EAAC,gBAAgC,EAAE,IAAI,CAAC,CAAC;QAE1E,IAAI,EAAE,CAAC;IACT,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\n\nexport function callNext(req: Request, res: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(\n req: ArkosRequest,\n res: ArkosResponse,\n next: NextFunction\n) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n // Check if the action exists in the provided options object\n if (prismaQueryOptions && action in prismaQueryOptions) {\n const firstMerge = deepmerge(\n (prismaQueryOptions as any)?.queryOptions || {},\n (prismaQueryOptions as any)[action] || {}\n ) as Record<string, any>;\n\n req.prismaQueryOptions = deepmerge(\n firstMerge,\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string) || \"{}\"\n : \"{}\"\n )\n );\n } else {\n // If no specific options for this action, just use the general queryOptions\n req.prismaQueryOptions = deepmerge(\n (prismaQueryOptions as any)?.queryOptions || {},\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string) || \"{}\"\n : \"{}\"\n )\n );\n }\n\n next();\n };\n}\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n // if (process.env.NODE_ENV === \"production\") return next()\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const dayName = dayNames[now.getDay()];\n const dayOfMonth = now.getDate();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mINFO\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n // Keep the commented-out example as it is\n // console.info(\n // `[\\x1b[36mINFO\\x1b[0m] ${dayName} ${dayOfMonth} ${time} ${methodColor}${req.method}\\x1b[0m ${req.originalUrl} \\x1b[32m${res.statusCode}\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n // );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAiEA,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,yCAAiB,CAAA;AACnB,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B","sourcesContent":["import { NextFunction, Request, RequestHandler, Response } from \"express\";\n\nexport type PrismaOperations = \"findMany\";\n\nexport type PrismaQueryOptions<T extends Record<string, any>> = {\n queryOptions?: Partial<Parameters<T[\"findMany\"]>[0]>;\n findOne?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n findMany?: Partial<Parameters<T[\"findMany\"]>[0]>;\n deleteMany?: Partial<Parameters<T[\"deleteMany\"]>[0]>;\n updateMany?: Partial<Parameters<T[\"updateMany\"]>[0]>;\n createMany?: Partial<Parameters<T[\"createMany\"]>[0]>;\n createOne?: Partial<Parameters<T[\"create\"]>[0]>;\n updateOne?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteOne?: Partial<Parameters<T[\"delete\"]>[0]>;\n};\n\n/**\n * Interface defining the minimum structure required for Prisma model delegates\n * This allows us to constraint TModel without requiring Prisma imports\n */\nexport type PrismaModelDelegate = Record<\n string,\n (args: Record<string, never>) => any\n>;\n\ntype a = {\n create: (args: { data: never; [key: string]: never }) => Promise<any>;\n createMany: (args: { data: never; [key: string]: never }) => Promise<any>;\n findMany: (args: { [key: string]: never }) => Promise<any[]>;\n findFirst: (args: { where: never; [key: string]: never }) => Promise<any>;\n findUnique: (args: { where: never; [key: string]: never }) => Promise<any>;\n update: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n updateMany: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n delete: (args: { where: never; [key: string]: never }) => Promise<any>;\n deleteMany: (args: { where: never; [key: string]: never }) => Promise<any>;\n count: (args: { where: never; [key: string]: never }) => Promise<number>;\n};\n\nexport interface UserRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n roleId: string;\n role: AuthRole;\n user: User;\n userId: string;\n}\n\nexport interface AuthRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n name: string;\n permissions: AuthPermission[];\n userRoles: UserRole[];\n}\n\nexport enum AuthPermissionAction {\n Create = \"Create\",\n View = \"View\",\n Update = \"Update\",\n Delete = \"Delete\",\n}\n\nexport interface AuthPermission {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n resource: string;\n action: AuthPermissionAction;\n roleId: string;\n role: AuthRole;\n}\n\nexport interface User {\n id: string;\n isStaff: boolean;\n isSuperUser: boolean;\n password: string;\n passwordChangedAt?: Date;\n deletedSelfAccountAt: Date;\n isActive: boolean;\n roles?: UserRole[] | any[];\n role?: UserRole | any;\n}\n\nexport interface ArkosRequest<Body = any, Query = any> extends Request {\n user?: User & Record<string, any>;\n relationFields?: Record<string, boolean>;\n include?: Record<string, any>;\n responseData?: Record<string, any> | null | undefined;\n additionalData?: Record<string, any> | null | undefined;\n responseStatus?: number | string | null | undefined;\n body: Body;\n prismaQueryOptions?: Record<string, any>;\n // query: Query extends Request['ParsedQs'];\n}\n\nexport interface ArkosResponse extends Response {}\nexport interface ArkosNextFunction extends NextFunction {}\nexport interface ArkosRequestHandler extends RequestHandler {}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AA6EA,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,yCAAiB,CAAA;AACnB,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B","sourcesContent":["import { NextFunction, Request, RequestHandler, Response } from \"express\";\n\nexport type PrismaOperations = \"findMany\";\n\nexport type PrismaQueryOptions<T extends Record<string, any>> = {\n queryOptions?: Partial<Parameters<T[\"findMany\"]>[0]>;\n findOne?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n findMany?: Partial<Parameters<T[\"findMany\"]>[0]>;\n deleteMany?: Partial<Parameters<T[\"deleteMany\"]>[0]>;\n updateMany?: Partial<Parameters<T[\"updateMany\"]>[0]>;\n createMany?: Partial<Parameters<T[\"createMany\"]>[0]>;\n createOne?: Partial<Parameters<T[\"create\"]>[0]>;\n updateOne?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteOne?: Partial<Parameters<T[\"delete\"]>[0]>;\n};\n\nexport type AuthPrismaQueryOptions<T extends Record<string, any>> = {\n // User profile endpoints\n getMe?: Partial<Parameters<T[\"findUnique\"]>[0]>;\n updateMe?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteMe?: Partial<Parameters<T[\"update\"]>[0]>;\n\n // Authentication endpoints\n login?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n signup?: Partial<Parameters<T[\"create\"]>[0]>;\n updatePassword?: Partial<Parameters<T[\"update\"]>[0]>;\n};\n\n/**\n * Interface defining the minimum structure required for Prisma model delegates\n * This allows us to constraint TModel without requiring Prisma imports\n */\nexport type PrismaModelDelegate = Record<\n string,\n (args: Record<string, never>) => any\n>;\n\ntype a = {\n create: (args: { data: never; [key: string]: never }) => Promise<any>;\n createMany: (args: { data: never; [key: string]: never }) => Promise<any>;\n findMany: (args: { [key: string]: never }) => Promise<any[]>;\n findFirst: (args: { where: never; [key: string]: never }) => Promise<any>;\n findUnique: (args: { where: never; [key: string]: never }) => Promise<any>;\n update: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n updateMany: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n delete: (args: { where: never; [key: string]: never }) => Promise<any>;\n deleteMany: (args: { where: never; [key: string]: never }) => Promise<any>;\n count: (args: { where: never; [key: string]: never }) => Promise<number>;\n};\n\nexport interface UserRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n roleId: string;\n role: AuthRole;\n user: User;\n userId: string;\n}\n\nexport interface AuthRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n name: string;\n permissions: AuthPermission[];\n userRoles: UserRole[];\n}\n\nexport enum AuthPermissionAction {\n Create = \"Create\",\n View = \"View\",\n Update = \"Update\",\n Delete = \"Delete\",\n}\n\nexport interface AuthPermission {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n resource: string;\n action: AuthPermissionAction;\n roleId: string;\n role: AuthRole;\n}\n\nexport interface User {\n id: string;\n isStaff: boolean;\n isSuperUser: boolean;\n password: string;\n passwordChangedAt?: Date;\n deletedSelfAccountAt: Date;\n isActive: boolean;\n roles?: UserRole[] | any[];\n role?: UserRole | any;\n}\n\nexport interface ArkosRequest<Body = any, Query = any> extends Request {\n user?: User & Record<string, any>;\n relationFields?: Record<string, boolean>;\n include?: Record<string, any>;\n responseData?: Record<string, any> | null | undefined;\n additionalData?: Record<string, any> | null | undefined;\n responseStatus?: number | string | null | undefined;\n body: Body;\n prismaQueryOptions?: Record<string, any>;\n // query: Query extends Request['ParsedQs'];\n}\n\nexport interface ArkosResponse extends Response {}\nexport interface ArkosNextFunction extends NextFunction {}\nexport interface ArkosRequestHandler extends RequestHandler {}\n"]}
@@ -1,3 +1,3 @@
1
1
  import { getModels } from "../../utils/helpers/models.helpers";
2
- export { getModels as getPrismaModels };
2
+ export { getModels as getPrismaModels, };
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/prisma/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,EAAsB,SAAS,IAAI,eAAe,EAAE,CAAC","sourcesContent":["import { PrismaQueryOptions } from \"../../types\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\n\nexport { PrismaQueryOptions, getModels as getPrismaModels };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/prisma/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,EAEL,SAAS,IAAI,eAAe,GAE7B,CAAC","sourcesContent":["import { PrismaQueryOptions, AuthPrismaQueryOptions } from \"../../types\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\n\nexport {\n PrismaQueryOptions,\n getModels as getPrismaModels,\n AuthPrismaQueryOptions,\n};\n"]}
@@ -2,9 +2,7 @@ import catchAsync from "../error-handler/utils/catch-async";
2
2
  import AppError from "../error-handler/utils/app-error";
3
3
  import authService from "./auth.service";
4
4
  import { getBaseServices } from "../base/base.service";
5
- import { getPrismaInstance } from "../../utils/helpers/prisma.helpers";
6
5
  import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
7
- import deepmerge from "../../utils/helpers/deepmerge.helper";
8
6
  import arkosEnv from "../../utils/arkos-env";
9
7
  import { getArkosConfig } from "../../server";
10
8
  import { createPrismaWhereClause, determineUsernameField, getNestedValue, toMs, } from "./utils/helpers/auth.controller.helpers";
@@ -12,15 +10,14 @@ export const defaultExcludedUserFields = {
12
10
  password: false,
13
11
  };
14
12
  export const authControllerFactory = async (middlewares = {}) => {
15
- const baseServices = getBaseServices();
13
+ const userService = getBaseServices()["user"];
16
14
  let prismaQueryOptions = {};
17
15
  const userModules = await importPrismaModelModules("user");
18
16
  if (userModules)
19
17
  prismaQueryOptions = userModules?.prismaQueryOptions || {};
20
- const queryOptions = deepmerge(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions?.findOne || {});
21
18
  return {
22
19
  getMe: catchAsync(async (req, res, next) => {
23
- const user = await baseServices["user"].findOne({ id: req.user.id });
20
+ const user = await userService.findOne({ id: req.user.id }, req.prismaQueryOptions || {});
24
21
  Object.keys(defaultExcludedUserFields).forEach((key) => {
25
22
  if (user)
26
23
  delete user[key];
@@ -34,14 +31,14 @@ export const authControllerFactory = async (middlewares = {}) => {
34
31
  }),
35
32
  updateMe: catchAsync(async (req, res, next) => {
36
33
  if ("password" in req.body)
37
- throw new AppError("In order to update password use the update-password endpoint.", 400);
38
- const user = await baseServices["user"].updateOne({ id: req.user.id }, req.body);
34
+ throw new AppError("In order to update password use the update-password endpoint.", 400, {}, "invalid_field_password");
35
+ const user = await userService.updateOne({ id: req.user.id }, req.body, req.prismaQueryOptions || {});
39
36
  Object.keys(defaultExcludedUserFields).forEach((key) => {
40
37
  if (user)
41
38
  delete user[key];
42
39
  });
43
40
  if (middlewares?.afterGetMe) {
44
- req.responseData = user;
41
+ req.responseData = { data: user };
45
42
  req.responseStatus = 200;
46
43
  return next();
47
44
  }
@@ -67,7 +64,6 @@ export const authControllerFactory = async (middlewares = {}) => {
67
64
  const { password } = req.body;
68
65
  if (!usernameValue || !password)
69
66
  return next(new AppError(`Please provide both ${lastField} and password`, 400));
70
- const prisma = getPrismaInstance();
71
67
  let whereClause;
72
68
  if (usernameField?.includes?.(".")) {
73
69
  const valueToFind = getNestedValue(req.body, usernameField);
@@ -79,9 +75,7 @@ export const authControllerFactory = async (middlewares = {}) => {
79
75
  else {
80
76
  whereClause = { [usernameField]: usernameValue };
81
77
  }
82
- const user = await prisma.user.findFirst({
83
- where: whereClause,
84
- });
78
+ const user = await userService.findOne(whereClause, req.prismaQueryOptions || {});
85
79
  if (!user ||
86
80
  !(await authService.isCorrectPassword(password, user.password))) {
87
81
  return next(new AppError(`Incorrect ${lastField} or password`, 401));
@@ -130,8 +124,7 @@ export const authControllerFactory = async (middlewares = {}) => {
130
124
  res.status(200).send();
131
125
  }),
132
126
  signup: catchAsync(async (req, res, next) => {
133
- const userService = baseServices["user"];
134
- const user = await userService.createOne(req.body, queryOptions);
127
+ const user = await userService.createOne(req.body, req.prismaQueryOptions || {});
135
128
  if (middlewares?.afterSignup) {
136
129
  req.responseData = { data: user };
137
130
  req.responseStatus = 201;
@@ -143,11 +136,10 @@ export const authControllerFactory = async (middlewares = {}) => {
143
136
  res.status(201).json({ data: user });
144
137
  }),
145
138
  deleteMe: catchAsync(async (req, res, next) => {
146
- const userService = baseServices["user"];
147
139
  const userId = req.user.id;
148
140
  const updatedUser = await userService.updateOne({ id: userId }, {
149
141
  deletedSelfAccountAt: new Date().toISOString(),
150
- });
142
+ }, req.prismaQueryOptions || {});
151
143
  if (middlewares?.afterDeleteMe) {
152
144
  req.responseData = { data: updatedUser };
153
145
  req.responseStatus = 200;
@@ -177,13 +169,9 @@ export const authControllerFactory = async (middlewares = {}) => {
177
169
  return next(new AppError(initAuthConfigs?.passwordValidation?.message ||
178
170
  "The new password must contain at least one uppercase letter, one lowercase letter, and one number", 400));
179
171
  }
180
- const prisma = getPrismaInstance();
181
- await prisma.user.update({
182
- where: { id: user.id },
183
- data: {
184
- password: await authService.hashPassword(newPassword),
185
- passwordChangedAt: new Date(Date.now()),
186
- },
172
+ await userService.updateOne({ id: user.id }, {
173
+ password: await authService.hashPassword(newPassword),
174
+ passwordChangedAt: new Date(Date.now()),
187
175
  });
188
176
  if (middlewares?.afterUpdatePassword) {
189
177
  req.additionalData = {
@@ -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 { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n MsDuration,\n toMs,\n} from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: 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 queryOptions = deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.findOne || {}\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({ id: req.user!.id });\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400\n );\n\n const user = await baseServices[\"user\"].updateOne(\n { id: req.user!.id },\n req.body\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete 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: 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 * Supports nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n // For the error message, we only care about the top-level field name\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(`Please provide both ${lastField} and password`, 400)\n );\n\n const prisma = getPrismaInstance();\n\n // Create appropriate where clause for the query\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\n // For nested paths, we need to extract the actual value to search for\n const valueToFind = getNestedValue(req.body, usernameField);\n if (valueToFind === undefined) {\n return next(new AppError(`Invalid ${usernameField} provided`, 400));\n }\n whereClause = createPrismaWhereClause(usernameField, valueToFind);\n } else {\n // Simple field case\n whereClause = { [usernameField]: usernameValue };\n }\n\n // Use findFirst instead of findUnique for complex queries\n const user = await (prisma as any).user.findFirst({\n where: whereClause,\n });\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(new AppError(`Incorrect ${lastField} or password`, 401));\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n toMs(\n authConfigs?.jwt?.expiresIn ||\n (process.env.JWT_EXPIRES_IN as MsDuration) ||\n (arkosEnv.JWT_EXPIRES_IN as MsDuration)\n )\n )\n ),\n httpOnly:\n authConfigs?.jwt?.cookie?.httpOnly ||\n process.env.JWT_COOKIE_HTTP_ONLY === \"true\" ||\n true,\n secure:\n authConfigs?.jwt?.cookie?.secure ||\n process.env.JWT_COOKIE_SECURE === \"true\" ||\n req.secure ||\n req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite:\n authConfigs?.jwt?.cookie?.sameSite ||\n process.env.JWT_COOKIE_SAME_SITE ||\n process.env.NODE_ENV === \"production\"\n ? \"none\"\n : \"lax\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n req.responseData = { accessToken: token };\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n\n if (middlewares?.afterLogin) {\n req.additionalData = { user };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n res.status(200).json(req.responseData);\n } else if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.status(200).send();\n }\n ),\n\n /**\n * Creates a new user account using the userService\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(req.body, queryOptions as any);\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 * Marks user account as self-deleted by setting deletedSelfAccountAt timestamp\n */\n deleteMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userService = baseServices[\"user\"];\n const userId = req.user!.id; // Assuming the authenticated user's ID is available in req.user\n\n const updatedUser = await userService.updateOne(\n { id: userId },\n {\n deletedSelfAccountAt: new Date().toISOString(),\n }\n );\n\n if (middlewares?.afterDeleteMe) {\n req.responseData = { data: updatedUser };\n req.responseStatus = 200;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete updatedUser[key as keyof User];\n });\n\n res.status(200).json({\n message: \"Account deleted successfully\",\n });\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 (!user || user?.isActive === false || user?.deletedSelfAccountAt)\n return next(new AppError(\"User not found!\", 404));\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 const configs = getArkosConfig();\n const initAuthConfigs = configs?.authentication;\n // const modules = getModelModules(\"auth\");\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (\n !authService.isPasswordStrong(String(newPassword)) &&\n !configs?.validation\n ) {\n return next(\n new AppError(\n initAuthConfigs?.passwordValidation?.message ||\n \"The new password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\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(Date.now()),\n },\n });\n\n if (middlewares?.afterUpdatePassword) {\n req.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 { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n MsDuration,\n toMs,\n} from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: 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 userService = getBaseServices()[\"user\"];\n let prismaQueryOptions: Record<string, any> = {};\n\n const userModules = await importPrismaModelModules(\"user\");\n if (userModules) prismaQueryOptions = userModules?.prismaQueryOptions || {};\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 userService.findOne(\n { id: req.user!.id },\n req.prismaQueryOptions || {}\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400,\n {},\n \"invalid_field_password\"\n );\n\n const user = await userService.updateOne(\n { id: req.user!.id },\n req.body,\n req.prismaQueryOptions || {}\n );\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (middlewares?.afterGetMe) {\n req.responseData = { data: user };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data: 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 * Supports nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n */\n login: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n // For the error message, we only care about the top-level field name\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(`Please provide both ${lastField} and password`, 400)\n );\n\n // Create appropriate where clause for the query\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\n // For nested paths, we need to extract the actual value to search for\n const valueToFind = getNestedValue(req.body, usernameField);\n if (valueToFind === undefined) {\n return next(new AppError(`Invalid ${usernameField} provided`, 400));\n }\n whereClause = createPrismaWhereClause(usernameField, valueToFind);\n } else {\n // Simple field case\n whereClause = { [usernameField]: usernameValue };\n }\n\n // Use findFirst instead of findUnique for complex queries\n const user = await userService.findOne(\n whereClause,\n req.prismaQueryOptions || {}\n );\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(new AppError(`Incorrect ${lastField} or password`, 401));\n }\n\n const token = authService.signJwtToken(user.id!);\n\n const cookieOptions: CookieOptions = {\n expires: new Date(\n Date.now() +\n Number(\n toMs(\n authConfigs?.jwt?.expiresIn ||\n (process.env.JWT_EXPIRES_IN as MsDuration) ||\n (arkosEnv.JWT_EXPIRES_IN as MsDuration)\n )\n )\n ),\n httpOnly:\n authConfigs?.jwt?.cookie?.httpOnly ||\n process.env.JWT_COOKIE_HTTP_ONLY === \"true\" ||\n true,\n secure:\n authConfigs?.jwt?.cookie?.secure ||\n process.env.JWT_COOKIE_SECURE === \"true\" ||\n req.secure ||\n req.headers[\"x-forwarded-proto\"] === \"https\",\n sameSite:\n authConfigs?.jwt?.cookie?.sameSite ||\n process.env.JWT_COOKIE_SAME_SITE ||\n process.env.NODE_ENV === \"production\"\n ? \"none\"\n : \"lax\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n req.responseData = { accessToken: token };\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.cookie(\"arkos_access_token\", token, cookieOptions);\n\n if (middlewares?.afterLogin) {\n req.additionalData = { user };\n req.responseStatus = 200;\n return next();\n }\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n res.status(200).json(req.responseData);\n } else if (\n authConfigs?.login?.sendAccessTokenThrough === \"cookie-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n )\n res.status(200).send();\n }\n ),\n\n /**\n * Creates a new user account using the userService\n */\n signup: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const user = await userService.createOne(\n req.body,\n req.prismaQueryOptions || {}\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 * Marks user account as self-deleted by setting deletedSelfAccountAt timestamp\n */\n deleteMe: catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const userId = req.user!.id; // Assuming the authenticated user's ID is available in req.user\n\n const updatedUser = await userService.updateOne(\n { id: userId },\n {\n deletedSelfAccountAt: new Date().toISOString(),\n },\n req.prismaQueryOptions || {}\n );\n\n if (middlewares?.afterDeleteMe) {\n req.responseData = { data: updatedUser };\n req.responseStatus = 200;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete updatedUser[key as keyof User];\n });\n\n res.status(200).json({\n message: \"Account deleted successfully\",\n });\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 (!user || user?.isActive === false || user?.deletedSelfAccountAt)\n return next(new AppError(\"User not found!\", 404));\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 const configs = getArkosConfig();\n const initAuthConfigs = configs?.authentication;\n // const modules = getModelModules(\"auth\");\n\n if (!isPasswordCorrect)\n return next(new AppError(\"Current password is incorrect.\", 400));\n\n // Check password strength (optional but recommended)\n if (\n !authService.isPasswordStrong(String(newPassword)) &&\n !configs?.validation\n ) {\n return next(\n new AppError(\n initAuthConfigs?.passwordValidation?.message ||\n \"The new password must contain at least one uppercase letter, one lowercase letter, and one number\",\n 400\n )\n );\n }\n\n // Update the password\n await userService.updateOne(\n { id: user.id },\n {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(Date.now()),\n }\n );\n\n if (middlewares?.afterUpdatePassword) {\n req.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"]}
@@ -3,11 +3,11 @@ import { authControllerFactory } from "./auth.controller";
3
3
  import authService from "./auth.service";
4
4
  import rateLimit from "express-rate-limit";
5
5
  import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
6
- import { handleRequestBodyValidationAndTransformation, sendResponse, } from "../base/base.middlewares";
6
+ import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../base/base.middlewares";
7
7
  import deepmerge from "../../utils/helpers/deepmerge.helper";
8
8
  const router = Router();
9
9
  export async function getAuthRouter(arkosConfigs) {
10
- const { middlewares, dtos, schemas } = await importPrismaModelModules("auth");
10
+ const { middlewares, dtos, schemas, prismaQueryOptions } = await importPrismaModelModules("auth");
11
11
  const authController = await authControllerFactory(middlewares);
12
12
  const getValidationSchemaOrDto = (key) => {
13
13
  const validationConfigs = arkosConfigs?.validation;
@@ -20,17 +20,17 @@ export async function getAuthRouter(arkosConfigs) {
20
20
  return undefined;
21
21
  };
22
22
  router
23
- .get("/users/me", authService.authenticate, middlewares?.beforeGetMe || authController.getMe, middlewares?.beforeGetMe
23
+ .get("/users/me", authService.authenticate, addPrismaQueryOptionsToRequest(prismaQueryOptions, "getMe"), middlewares?.beforeGetMe || authController.getMe, middlewares?.beforeGetMe
24
24
  ? authController.getMe
25
25
  : middlewares?.afterGetMe || sendResponse, middlewares?.beforeGetMe && middlewares?.afterGetMe
26
26
  ? middlewares?.afterGetMe
27
27
  : sendResponse, sendResponse)
28
- .patch("/users/me", authService.authenticate, handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("updateMe")), middlewares?.beforeUpdateMe || authController.updateMe, middlewares?.beforeUpdateMe
28
+ .patch("/users/me", authService.authenticate, handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("updateMe")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updateMe"), middlewares?.beforeUpdateMe || authController.updateMe, middlewares?.beforeUpdateMe
29
29
  ? authController.updateMe
30
30
  : middlewares?.afterUpdateMe || sendResponse, middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe
31
31
  ? middlewares?.afterUpdateMe
32
32
  : sendResponse, sendResponse)
33
- .delete("/users/me", authService.authenticate, middlewares?.beforeDeleteMe || authController.deleteMe, middlewares?.beforeDeleteMe
33
+ .delete("/users/me", authService.authenticate, addPrismaQueryOptionsToRequest(prismaQueryOptions, "deleteMe"), middlewares?.beforeDeleteMe || authController.deleteMe, middlewares?.beforeDeleteMe
34
34
  ? authController.deleteMe
35
35
  : middlewares?.afterDeleteMe || sendResponse, middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe
36
36
  ? middlewares?.afterDeleteMe
@@ -41,7 +41,7 @@ export async function getAuthRouter(arkosConfigs) {
41
41
  standardHeaders: "draft-7",
42
42
  legacyHeaders: false,
43
43
  }, arkosConfigs?.authentication?.requestRateLimitOptions || {})));
44
- router.post("/auth/login", handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("login")), middlewares?.beforeLogin || authController.login, middlewares?.beforeLogin
44
+ router.post("/auth/login", handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("login")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "login"), middlewares?.beforeLogin || authController.login, middlewares?.beforeLogin
45
45
  ? authController.login
46
46
  : middlewares?.afterLogin || sendResponse, middlewares?.beforeLogin && middlewares?.afterLogin
47
47
  ? middlewares?.afterLogin
@@ -51,12 +51,12 @@ export async function getAuthRouter(arkosConfigs) {
51
51
  : middlewares?.afterLogout || sendResponse, middlewares?.beforeLogout && middlewares?.afterLogout
52
52
  ? middlewares?.afterLogout
53
53
  : sendResponse, sendResponse);
54
- router.post("/auth/signup", handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("signup")), middlewares?.beforeSignup || authController.signup, middlewares?.beforeSignup
54
+ router.post("/auth/signup", handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("signup")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "signup"), middlewares?.beforeSignup || authController.signup, middlewares?.beforeSignup
55
55
  ? authController.signup
56
56
  : middlewares?.afterSignup || sendResponse, middlewares?.beforeSignup && middlewares?.afterSignup
57
57
  ? middlewares?.afterSignup
58
58
  : sendResponse, sendResponse);
59
- router.post("/auth/update-password", authService.authenticate, handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("updatePassword")), middlewares?.beforeUpdatePassword || authController.updatePassword, middlewares?.beforeUpdatePassword
59
+ router.post("/auth/update-password", authService.authenticate, handleRequestBodyValidationAndTransformation(getValidationSchemaOrDto("updatePassword")), addPrismaQueryOptionsToRequest(prismaQueryOptions, "updatePassword"), middlewares?.beforeUpdatePassword || authController.updatePassword, middlewares?.beforeUpdatePassword
60
60
  ? authController.updatePassword
61
61
  : middlewares?.afterUpdatePassword || sendResponse, middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword
62
62
  ? middlewares?.afterUpdatePassword
@@ -1 +1 @@
1
- {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,4CAA4C,EAC5C,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,SAAS,MAAM,sCAAsC,CAAC;AAE7D,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAyB;IAC3D,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAGhE,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/C,MAAM,iBAAiB,GAAG,YAAY,EAAE,UAAU,CAAC;QACnD,IAAI,iBAAiB,EAAE,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACtD,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,iBAAiB,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAC;YACjD,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM;SACH,GAAG,CACF,WAAW,EACX,WAAW,CAAC,YAAY,EACxB,WAAW,EAAE,WAAW,IAAI,cAAc,CAAC,KAAK,EAChD,WAAW,EAAE,WAAW;QACtB,CAAC,CAAC,cAAc,CAAC,KAAK;QACtB,CAAC,CAAC,WAAW,EAAE,UAAU,IAAI,YAAY,EAC3C,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,UAAU;QACjD,CAAC,CAAC,WAAW,EAAE,UAAU;QACzB,CAAC,CAAC,YAAY,EAChB,YAAY,CACb;SACA,KAAK,CACJ,WAAW,EACX,WAAW,CAAC,YAAY,EACxB,4CAA4C,CAC1C,wBAAwB,CAAC,UAAU,CAAC,CACrC,EACD,WAAW,EAAE,cAAc,IAAI,cAAc,CAAC,QAAQ,EACtD,WAAW,EAAE,cAAc;QACzB,CAAC,CAAC,cAAc,CAAC,QAAQ;QACzB,CAAC,CAAC,WAAW,EAAE,aAAa,IAAI,YAAY,EAC9C,WAAW,EAAE,cAAc,IAAI,WAAW,EAAE,aAAa;QACvD,CAAC,CAAC,WAAW,EAAE,aAAa;QAC5B,CAAC,CAAC,YAAY,EAChB,YAAY,CACb;SACA,MAAM,CACL,WAAW,EACX,WAAW,CAAC,YAAY,EACxB,WAAW,EAAE,cAAc,IAAI,cAAc,CAAC,QAAQ,EACtD,WAAW,EAAE,cAAc;QACzB,CAAC,CAAC,cAAc,CAAC,QAAQ;QACzB,CAAC,CAAC,WAAW,EAAE,aAAa,IAAI,YAAY,EAC9C,WAAW,EAAE,cAAc,IAAI,WAAW,EAAE,aAAa;QACvD,CAAC,CAAC,WAAW,EAAE,aAAa;QAC5B,CAAC,CAAC,YAAY,EAChB,YAAY,CACb,CAAC;IAEJ,MAAM,CAAC,GAAG,CACR,SAAS,CACP,SAAS,CACP;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,SAAS;QAC1B,aAAa,EAAE,KAAK;KACrB,EACD,YAAY,EAAE,cAAc,EAAE,uBAAuB,IAAI,EAAE,CAC5D,CACF,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4CAA4C,CAC1C,wBAAwB,CAAC,OAAO,CAAC,CAClC,EACD,WAAW,EAAE,WAAW,IAAI,cAAc,CAAC,KAAK,EAChD,WAAW,EAAE,WAAW;QACtB,CAAC,CAAC,cAAc,CAAC,KAAK;QACtB,CAAC,CAAC,WAAW,EAAE,UAAU,IAAI,YAAY,EAC3C,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,UAAU;QACjD,CAAC,CAAC,WAAW,EAAE,UAAU;QACzB,CAAC,CAAC,YAAY,EAChB,YAAY,CACb,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,cAAc,EACd,WAAW,CAAC,YAAY,EACxB,WAAW,EAAE,YAAY,IAAI,cAAc,CAAC,MAAM,EAClD,WAAW,EAAE,YAAY;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM;QACvB,CAAC,CAAC,WAAW,EAAE,WAAW,IAAI,YAAY,EAC5C,WAAW,EAAE,YAAY,IAAI,WAAW,EAAE,WAAW;QACnD,CAAC,CAAC,WAAW,EAAE,WAAW;QAC1B,CAAC,CAAC,YAAY,EAChB,YAAY,CACb,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,4CAA4C,CAC1C,wBAAwB,CAAC,QAAQ,CAAC,CACnC,EACD,WAAW,EAAE,YAAY,IAAI,cAAc,CAAC,MAAM,EAClD,WAAW,EAAE,YAAY;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM;QACvB,CAAC,CAAC,WAAW,EAAE,WAAW,IAAI,YAAY,EAC5C,WAAW,EAAE,YAAY,IAAI,WAAW,EAAE,WAAW;QACnD,CAAC,CAAC,WAAW,EAAE,WAAW;QAC1B,CAAC,CAAC,YAAY,EAChB,YAAY,CACb,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,WAAW,CAAC,YAAY,EACxB,4CAA4C,CAC1C,wBAAwB,CAAC,gBAAgB,CAAC,CAC3C,EACD,WAAW,EAAE,oBAAoB,IAAI,cAAc,CAAC,cAAc,EAClE,WAAW,EAAE,oBAAoB;QAC/B,CAAC,CAAC,cAAc,CAAC,cAAc;QAC/B,CAAC,CAAC,WAAW,EAAE,mBAAmB,IAAI,YAAY,EACpD,WAAW,EAAE,oBAAoB,IAAI,WAAW,EAAE,mBAAmB;QACnE,CAAC,CAAC,WAAW,EAAE,mBAAmB;QAClC,CAAC,CAAC,YAAY,EAChB,YAAY,CACb,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas } = await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeGetMe || authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe || sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n middlewares?.beforeUpdateMe || authController.updateMe,\n middlewares?.beforeUpdateMe\n ? authController.updateMe\n : middlewares?.afterUpdateMe || sendResponse,\n middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe\n ? middlewares?.afterUpdateMe\n : sendResponse,\n sendResponse\n )\n .delete(\n \"/users/me\",\n authService.authenticate,\n middlewares?.beforeDeleteMe || authController.deleteMe,\n middlewares?.beforeDeleteMe\n ? authController.deleteMe\n : middlewares?.afterDeleteMe || sendResponse,\n middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe\n ? middlewares?.afterDeleteMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n middlewares?.beforeLogin || authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin || sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n middlewares?.beforeLogout || authController.logout,\n middlewares?.beforeLogout\n ? authController.logout\n : middlewares?.afterLogout || sendResponse,\n middlewares?.beforeLogout && middlewares?.afterLogout\n ? middlewares?.afterLogout\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n middlewares?.beforeSignup || authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup || sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n middlewares?.beforeUpdatePassword || authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword || sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
1
+ {"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { authControllerFactory } from \"./auth.controller\";\nimport authService from \"./auth.service\";\nimport rateLimit from \"express-rate-limit\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\n\nconst router: Router = Router();\n\nexport async function getAuthRouter(arkosConfigs: ArkosConfig) {\n const { middlewares, dtos, schemas, prismaQueryOptions } =\n await importPrismaModelModules(\"auth\");\n const authController = await authControllerFactory(middlewares);\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n router\n .get(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n middlewares?.beforeGetMe || authController.getMe,\n middlewares?.beforeGetMe\n ? authController.getMe\n : middlewares?.afterGetMe || sendResponse,\n middlewares?.beforeGetMe && middlewares?.afterGetMe\n ? middlewares?.afterGetMe\n : sendResponse,\n sendResponse\n )\n .patch(\n \"/users/me\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMe\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n middlewares?.beforeUpdateMe || authController.updateMe,\n middlewares?.beforeUpdateMe\n ? authController.updateMe\n : middlewares?.afterUpdateMe || sendResponse,\n middlewares?.beforeUpdateMe && middlewares?.afterUpdateMe\n ? middlewares?.afterUpdateMe\n : sendResponse,\n sendResponse\n )\n .delete(\n \"/users/me\",\n authService.authenticate,\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n middlewares?.beforeDeleteMe || authController.deleteMe,\n middlewares?.beforeDeleteMe\n ? authController.deleteMe\n : middlewares?.afterDeleteMe || sendResponse,\n middlewares?.beforeDeleteMe && middlewares?.afterDeleteMe\n ? middlewares?.afterDeleteMe\n : sendResponse,\n sendResponse\n );\n\n router.use(\n rateLimit(\n deepmerge(\n {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n },\n arkosConfigs?.authentication?.requestRateLimitOptions || {}\n )\n )\n );\n\n router.post(\n \"/auth/login\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"login\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n middlewares?.beforeLogin || authController.login,\n middlewares?.beforeLogin\n ? authController.login\n : middlewares?.afterLogin || sendResponse,\n middlewares?.beforeLogin && middlewares?.afterLogin\n ? middlewares?.afterLogin\n : sendResponse,\n sendResponse\n );\n\n router.delete(\n \"/auth/logout\",\n authService.authenticate,\n middlewares?.beforeLogout || authController.logout,\n middlewares?.beforeLogout\n ? authController.logout\n : middlewares?.afterLogout || sendResponse,\n middlewares?.beforeLogout && middlewares?.afterLogout\n ? middlewares?.afterLogout\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/signup\",\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"signup\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n middlewares?.beforeSignup || authController.signup,\n middlewares?.beforeSignup\n ? authController.signup\n : middlewares?.afterSignup || sendResponse,\n middlewares?.beforeSignup && middlewares?.afterSignup\n ? middlewares?.afterSignup\n : sendResponse,\n sendResponse\n );\n\n router.post(\n \"/auth/update-password\",\n authService.authenticate,\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updatePassword\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n middlewares?.beforeUpdatePassword || authController.updatePassword,\n middlewares?.beforeUpdatePassword\n ? authController.updatePassword\n : middlewares?.afterUpdatePassword || sendResponse,\n middlewares?.beforeUpdatePassword && middlewares?.afterUpdatePassword\n ? middlewares?.afterUpdatePassword\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
@@ -22,10 +22,17 @@ export function addRouteMiddlwaresAndConfigs() { }
22
22
  export function addPrismaQueryOptionsToRequest(prismaQueryOptions, action) {
23
23
  return (req, res, next) => {
24
24
  const configs = getArkosConfig();
25
- const firstMerge = deepmerge(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions?.[action] || {});
26
- req.prismaQueryOptions = deepmerge(firstMerge, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
27
- ? req.query?.prismaQueryOptions
28
- : "{}"));
25
+ if (prismaQueryOptions && action in prismaQueryOptions) {
26
+ const firstMerge = deepmerge(prismaQueryOptions?.queryOptions || {}, prismaQueryOptions[action] || {});
27
+ req.prismaQueryOptions = deepmerge(firstMerge, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
28
+ ? req.query?.prismaQueryOptions || "{}"
29
+ : "{}"));
30
+ }
31
+ else {
32
+ req.prismaQueryOptions = deepmerge(prismaQueryOptions?.queryOptions || {}, JSON.parse(configs?.request?.parameters?.allowDangerousPrismaQueryOptions
33
+ ? req.query?.prismaQueryOptions || "{}"
34
+ : "{}"));
35
+ }
29
36
  next();
30
37
  };
31
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\n\nexport function callNext(req: Request, res: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(\n req: ArkosRequest,\n res: ArkosResponse,\n next: NextFunction\n) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T>,\n action: keyof PrismaQueryOptions<T>\n) {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const firstMerge = deepmerge(\n prismaQueryOptions?.queryOptions || {},\n prismaQueryOptions?.[action] || {}\n ) as Record<string, any>;\n\n req.prismaQueryOptions = deepmerge(\n firstMerge,\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string)\n : \"{}\"\n )\n );\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n // if (process.env.NODE_ENV === \"production\") return next()\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const dayName = dayNames[now.getDay()];\n const dayOfMonth = now.getDate();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mINFO\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n // Keep the commented-out example as it is\n // console.info(\n // `[\\x1b[36mINFO\\x1b[0m] ${dayName} ${dayOfMonth} ${time} ${methodColor}${req.method}\\x1b[0m ${req.originalUrl} \\x1b[32m${res.statusCode}\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n // );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
1
+ {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\n\nexport function callNext(req: Request, res: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(\n req: ArkosRequest,\n res: ArkosResponse,\n next: NextFunction\n) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n // Check if the action exists in the provided options object\n if (prismaQueryOptions && action in prismaQueryOptions) {\n const firstMerge = deepmerge(\n (prismaQueryOptions as any)?.queryOptions || {},\n (prismaQueryOptions as any)[action] || {}\n ) as Record<string, any>;\n\n req.prismaQueryOptions = deepmerge(\n firstMerge,\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string) || \"{}\"\n : \"{}\"\n )\n );\n } else {\n // If no specific options for this action, just use the general queryOptions\n req.prismaQueryOptions = deepmerge(\n (prismaQueryOptions as any)?.queryOptions || {},\n JSON.parse(\n configs?.request?.parameters?.allowDangerousPrismaQueryOptions\n ? (req.query?.prismaQueryOptions as string) || \"{}\"\n : \"{}\"\n )\n );\n }\n\n next();\n };\n}\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n // if (process.env.NODE_ENV === \"production\") return next()\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const dayName = dayNames[now.getDay()];\n const dayOfMonth = now.getDate();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mINFO\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n // Keep the commented-out example as it is\n // console.info(\n // `[\\x1b[36mINFO\\x1b[0m] ${dayName} ${dayOfMonth} ${time} ${methodColor}${req.method}\\x1b[0m ${req.originalUrl} \\x1b[32m${res.statusCode}\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n // );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAiEA,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,yCAAiB,CAAA;AACnB,CAAC,EALW,oBAAoB,KAApB,oBAAoB,QAK/B","sourcesContent":["import { NextFunction, Request, RequestHandler, Response } from \"express\";\n\nexport type PrismaOperations = \"findMany\";\n\nexport type PrismaQueryOptions<T extends Record<string, any>> = {\n queryOptions?: Partial<Parameters<T[\"findMany\"]>[0]>;\n findOne?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n findMany?: Partial<Parameters<T[\"findMany\"]>[0]>;\n deleteMany?: Partial<Parameters<T[\"deleteMany\"]>[0]>;\n updateMany?: Partial<Parameters<T[\"updateMany\"]>[0]>;\n createMany?: Partial<Parameters<T[\"createMany\"]>[0]>;\n createOne?: Partial<Parameters<T[\"create\"]>[0]>;\n updateOne?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteOne?: Partial<Parameters<T[\"delete\"]>[0]>;\n};\n\n/**\n * Interface defining the minimum structure required for Prisma model delegates\n * This allows us to constraint TModel without requiring Prisma imports\n */\nexport type PrismaModelDelegate = Record<\n string,\n (args: Record<string, never>) => any\n>;\n\ntype a = {\n create: (args: { data: never; [key: string]: never }) => Promise<any>;\n createMany: (args: { data: never; [key: string]: never }) => Promise<any>;\n findMany: (args: { [key: string]: never }) => Promise<any[]>;\n findFirst: (args: { where: never; [key: string]: never }) => Promise<any>;\n findUnique: (args: { where: never; [key: string]: never }) => Promise<any>;\n update: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n updateMany: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n delete: (args: { where: never; [key: string]: never }) => Promise<any>;\n deleteMany: (args: { where: never; [key: string]: never }) => Promise<any>;\n count: (args: { where: never; [key: string]: never }) => Promise<number>;\n};\n\nexport interface UserRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n roleId: string;\n role: AuthRole;\n user: User;\n userId: string;\n}\n\nexport interface AuthRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n name: string;\n permissions: AuthPermission[];\n userRoles: UserRole[];\n}\n\nexport enum AuthPermissionAction {\n Create = \"Create\",\n View = \"View\",\n Update = \"Update\",\n Delete = \"Delete\",\n}\n\nexport interface AuthPermission {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n resource: string;\n action: AuthPermissionAction;\n roleId: string;\n role: AuthRole;\n}\n\nexport interface User {\n id: string;\n isStaff: boolean;\n isSuperUser: boolean;\n password: string;\n passwordChangedAt?: Date;\n deletedSelfAccountAt: Date;\n isActive: boolean;\n roles?: UserRole[] | any[];\n role?: UserRole | any;\n}\n\nexport interface ArkosRequest<Body = any, Query = any> extends Request {\n user?: User & Record<string, any>;\n relationFields?: Record<string, boolean>;\n include?: Record<string, any>;\n responseData?: Record<string, any> | null | undefined;\n additionalData?: Record<string, any> | null | undefined;\n responseStatus?: number | string | null | undefined;\n body: Body;\n prismaQueryOptions?: Record<string, any>;\n // query: Query extends Request['ParsedQs'];\n}\n\nexport interface ArkosResponse extends Response {}\nexport interface ArkosNextFunction extends NextFunction {}\nexport interface ArkosRequestHandler extends RequestHandler {}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AA6EA,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,yCAAiB,CAAA;AACnB,CAAC,EALW,oBAAoB,KAApB,oBAAoB,QAK/B","sourcesContent":["import { NextFunction, Request, RequestHandler, Response } from \"express\";\n\nexport type PrismaOperations = \"findMany\";\n\nexport type PrismaQueryOptions<T extends Record<string, any>> = {\n queryOptions?: Partial<Parameters<T[\"findMany\"]>[0]>;\n findOne?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n findMany?: Partial<Parameters<T[\"findMany\"]>[0]>;\n deleteMany?: Partial<Parameters<T[\"deleteMany\"]>[0]>;\n updateMany?: Partial<Parameters<T[\"updateMany\"]>[0]>;\n createMany?: Partial<Parameters<T[\"createMany\"]>[0]>;\n createOne?: Partial<Parameters<T[\"create\"]>[0]>;\n updateOne?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteOne?: Partial<Parameters<T[\"delete\"]>[0]>;\n};\n\nexport type AuthPrismaQueryOptions<T extends Record<string, any>> = {\n // User profile endpoints\n getMe?: Partial<Parameters<T[\"findUnique\"]>[0]>;\n updateMe?: Partial<Parameters<T[\"update\"]>[0]>;\n deleteMe?: Partial<Parameters<T[\"update\"]>[0]>;\n\n // Authentication endpoints\n login?: Partial<Parameters<T[\"findFirst\"]>[0]>;\n signup?: Partial<Parameters<T[\"create\"]>[0]>;\n updatePassword?: Partial<Parameters<T[\"update\"]>[0]>;\n};\n\n/**\n * Interface defining the minimum structure required for Prisma model delegates\n * This allows us to constraint TModel without requiring Prisma imports\n */\nexport type PrismaModelDelegate = Record<\n string,\n (args: Record<string, never>) => any\n>;\n\ntype a = {\n create: (args: { data: never; [key: string]: never }) => Promise<any>;\n createMany: (args: { data: never; [key: string]: never }) => Promise<any>;\n findMany: (args: { [key: string]: never }) => Promise<any[]>;\n findFirst: (args: { where: never; [key: string]: never }) => Promise<any>;\n findUnique: (args: { where: never; [key: string]: never }) => Promise<any>;\n update: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n updateMany: (args: {\n where: never;\n data: never;\n [key: string]: never;\n }) => Promise<any>;\n delete: (args: { where: never; [key: string]: never }) => Promise<any>;\n deleteMany: (args: { where: never; [key: string]: never }) => Promise<any>;\n count: (args: { where: never; [key: string]: never }) => Promise<number>;\n};\n\nexport interface UserRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n roleId: string;\n role: AuthRole;\n user: User;\n userId: string;\n}\n\nexport interface AuthRole {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n name: string;\n permissions: AuthPermission[];\n userRoles: UserRole[];\n}\n\nexport enum AuthPermissionAction {\n Create = \"Create\",\n View = \"View\",\n Update = \"Update\",\n Delete = \"Delete\",\n}\n\nexport interface AuthPermission {\n id: string;\n createdAt: Date;\n deletedAt?: Date;\n resource: string;\n action: AuthPermissionAction;\n roleId: string;\n role: AuthRole;\n}\n\nexport interface User {\n id: string;\n isStaff: boolean;\n isSuperUser: boolean;\n password: string;\n passwordChangedAt?: Date;\n deletedSelfAccountAt: Date;\n isActive: boolean;\n roles?: UserRole[] | any[];\n role?: UserRole | any;\n}\n\nexport interface ArkosRequest<Body = any, Query = any> extends Request {\n user?: User & Record<string, any>;\n relationFields?: Record<string, boolean>;\n include?: Record<string, any>;\n responseData?: Record<string, any> | null | undefined;\n additionalData?: Record<string, any> | null | undefined;\n responseStatus?: number | string | null | undefined;\n body: Body;\n prismaQueryOptions?: Record<string, any>;\n // query: Query extends Request['ParsedQs'];\n}\n\nexport interface ArkosResponse extends Response {}\nexport interface ArkosNextFunction extends NextFunction {}\nexport interface ArkosRequestHandler extends RequestHandler {}\n"]}
@@ -1,3 +1,3 @@
1
- import { PrismaQueryOptions } from "../../types";
1
+ import { PrismaQueryOptions, AuthPrismaQueryOptions } from "../../types";
2
2
  import { getModels } from "../../utils/helpers/models.helpers";
3
- export { PrismaQueryOptions, getModels as getPrismaModels };
3
+ export { PrismaQueryOptions, getModels as getPrismaModels, AuthPrismaQueryOptions, };
@@ -1,12 +1,13 @@
1
1
  import { NextFunction, Request, Response } from "express";
2
- import { PrismaQueryOptions, ArkosRequest, ArkosRequestHandler, ArkosResponse } from "../../types";
2
+ import { PrismaQueryOptions, ArkosRequest, ArkosRequestHandler, ArkosResponse, AuthPrismaQueryOptions } from "../../types";
3
3
  import { ZodSchema } from "zod";
4
4
  import { ClassConstructor } from "class-transformer";
5
5
  import { ValidatorOptions } from "class-validator";
6
6
  export declare function callNext(req: Request, res: Response, next: NextFunction): void;
7
7
  export declare function sendResponse(req: ArkosRequest, res: ArkosResponse, next: NextFunction): void;
8
8
  export declare function addRouteMiddlwaresAndConfigs(): void;
9
- export declare function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(prismaQueryOptions: PrismaQueryOptions<T>, action: keyof PrismaQueryOptions<T>): (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => void;
9
+ export type ControllerActions = keyof PrismaQueryOptions<any> | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;
10
+ export declare function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>, action: ControllerActions): (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => void;
10
11
  export declare function handleRequestLogs(req: Request, res: Response, next: NextFunction): void;
11
12
  export declare function handleRequestBodyValidationAndTransformation<T extends object>(schemaOrDtoClass?: ClassConstructor<T>, classValidatorValidationOptions?: ValidatorOptions): ArkosRequestHandler;
12
13
  export declare function handleRequestBodyValidationAndTransformation<T extends object>(schemaOrDtoClass?: ZodSchema<T>): ArkosRequestHandler;
@@ -11,6 +11,14 @@ export type PrismaQueryOptions<T extends Record<string, any>> = {
11
11
  updateOne?: Partial<Parameters<T["update"]>[0]>;
12
12
  deleteOne?: Partial<Parameters<T["delete"]>[0]>;
13
13
  };
14
+ export type AuthPrismaQueryOptions<T extends Record<string, any>> = {
15
+ getMe?: Partial<Parameters<T["findUnique"]>[0]>;
16
+ updateMe?: Partial<Parameters<T["update"]>[0]>;
17
+ deleteMe?: Partial<Parameters<T["update"]>[0]>;
18
+ login?: Partial<Parameters<T["findFirst"]>[0]>;
19
+ signup?: Partial<Parameters<T["create"]>[0]>;
20
+ updatePassword?: Partial<Parameters<T["update"]>[0]>;
21
+ };
14
22
  export type PrismaModelDelegate = Record<string, (args: Record<string, never>) => any>;
15
23
  export interface UserRole {
16
24
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.1.47-test",
3
+ "version": "1.1.48-test",
4
4
  "description": "The Express & Prisma Framework For RESTful API",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/es2020/exports/index.js",