arkos 2.0.0-next.18 → 2.0.0-next.19

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.
Files changed (112) hide show
  1. package/cli.js +8 -1
  2. package/dist/esm/app.js +1 -1
  3. package/dist/esm/app.js.map +1 -1
  4. package/dist/esm/components/arkos-gateway/arkos-gateway.js +5 -4
  5. package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -1
  6. package/dist/esm/components/arkos-gateway/socket-extensions.js +7 -0
  7. package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -1
  8. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +2 -4
  9. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -1
  10. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +1 -0
  11. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -1
  12. package/dist/esm/components/arkos-loadable-registry/index.js +1 -3
  13. package/dist/esm/components/arkos-loadable-registry/index.js.map +1 -1
  14. package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
  15. package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
  16. package/dist/esm/exports/index.js +1 -1
  17. package/dist/esm/exports/index.js.map +1 -1
  18. package/dist/esm/exports/middlewares/index.js +1 -1
  19. package/dist/esm/exports/middlewares/index.js.map +1 -1
  20. package/dist/esm/modules/auth/auth.controller.js +213 -221
  21. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  22. package/dist/esm/modules/auth/auth.service.js +11 -58
  23. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  24. package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js +1 -0
  25. package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js.map +1 -1
  26. package/dist/esm/modules/auth/utils/services/auth-action.service.js +10 -12
  27. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  28. package/dist/esm/modules/base/base.controller.js +179 -177
  29. package/dist/esm/modules/base/base.controller.js.map +1 -1
  30. package/dist/esm/modules/base/base.middlewares.js +6 -21
  31. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  32. package/dist/esm/modules/base/base.service.js +28 -25
  33. package/dist/esm/modules/base/base.service.js.map +1 -1
  34. package/dist/esm/modules/base/utils/error-prettifier.js +26 -30
  35. package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -1
  36. package/dist/esm/modules/email/email.service.js +2 -2
  37. package/dist/esm/modules/email/email.service.js.map +1 -1
  38. package/dist/esm/modules/error-handler/utils/app-error.js +5 -1
  39. package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
  40. package/dist/esm/modules/file-upload/file-upload.controller.js +203 -205
  41. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  42. package/dist/esm/modules/file-upload/file-upload.router.js +3 -3
  43. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  44. package/dist/esm/modules/file-upload/file-upload.service.js +12 -7
  45. package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
  46. package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js +1 -1
  47. package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js.map +1 -1
  48. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  49. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -0
  50. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  51. package/dist/esm/types/index.js.map +1 -1
  52. package/dist/esm/types/new-arkos-config.js.map +1 -1
  53. package/dist/esm/types/router-config.js.map +1 -1
  54. package/dist/esm/types/validation/validation-manager.js +21 -22
  55. package/dist/esm/types/validation/validation-manager.js.map +1 -1
  56. package/dist/esm/utils/arkos-router/index.js +1 -6
  57. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  58. package/dist/esm/utils/arkos-router/route-config-registry.js +2 -3
  59. package/dist/esm/utils/arkos-router/route-config-registry.js.map +1 -1
  60. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  61. package/dist/esm/utils/arkos-router/utils/helpers/index.js +86 -43
  62. package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
  63. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +12 -14
  64. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
  65. package/dist/esm/utils/bundler.js +6 -6
  66. package/dist/esm/utils/bundler.js.map +1 -1
  67. package/dist/esm/utils/cli/dev.js +4 -17
  68. package/dist/esm/utils/cli/dev.js.map +1 -1
  69. package/dist/esm/utils/cli/prisma-generate.js +8 -37
  70. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  71. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  72. package/dist/esm/utils/cli/utils/smart-fs-watcher.js +3 -0
  73. package/dist/esm/utils/cli/utils/smart-fs-watcher.js.map +1 -1
  74. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +1 -1
  75. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  76. package/dist/esm/utils/dynamic-loader.js +2 -1
  77. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  78. package/dist/esm/utils/features/api.features.js +24 -20
  79. package/dist/esm/utils/features/api.features.js.map +1 -1
  80. package/dist/esm/utils/features/port-and-host-allocator.js +4 -3
  81. package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
  82. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  83. package/dist/esm/utils/helpers/query-parser.helpers.js +7 -22
  84. package/dist/esm/utils/helpers/query-parser.helpers.js.map +1 -1
  85. package/dist/esm/utils/initialize-app.js +1 -1
  86. package/dist/esm/utils/initialize-app.js.map +1 -1
  87. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +1 -3
  88. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  89. package/dist/esm/utils/prisma/prisma-schema-parser.js +14 -8
  90. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  91. package/dist/esm/utils/validate-schema.js +23 -21
  92. package/dist/esm/utils/validate-schema.js.map +1 -1
  93. package/dist/types/app.d.ts +1 -1
  94. package/dist/types/components/arkos-route-hook/reader.d.ts +2 -5
  95. package/dist/types/components/arkos-route-hook/types.d.ts +4 -4
  96. package/dist/types/exports/index.d.ts +3 -4
  97. package/dist/types/exports/middlewares/index.d.ts +1 -1
  98. package/dist/types/modules/auth/auth.service.d.ts +1 -40
  99. package/dist/types/modules/base/base.middlewares.d.ts +1 -10
  100. package/dist/types/modules/swagger/swagger.router.d.ts +1 -2
  101. package/dist/types/types/index.d.ts +3 -3
  102. package/dist/types/types/new-arkos-config.d.ts +0 -14
  103. package/dist/types/types/router-config.d.ts +0 -111
  104. package/dist/types/utils/arkos-router/types/index.d.ts +3 -3
  105. package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +2 -6
  106. package/dist/types/utils/dynamic-loader.d.ts +2 -2
  107. package/dist/types/utils/helpers/query-parser.helpers.d.ts +1 -1
  108. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
  109. package/package.json +41 -41
  110. package/dist/esm/components/arkos-loadable-translator/index.js +0 -138
  111. package/dist/esm/components/arkos-loadable-translator/index.js.map +0 -1
  112. package/dist/types/components/arkos-loadable-translator/index.d.ts +0 -53
@@ -10,237 +10,229 @@ export const defaultExcludedUserFields = {
10
10
  password: false,
11
11
  };
12
12
  export class AuthController {
13
- constructor() {
14
- this.getMe = catchAsync(async (req, res, next) => {
15
- const user = (await this.getUserService().findOne({ id: req.user.id }, req.prismaQueryOptions || {}));
16
- Object.keys(defaultExcludedUserFields).forEach((key) => {
17
- if (user)
18
- delete user[key];
19
- });
20
- if (routeHookReader.getHooks("auth", "getMe")?.after) {
21
- res.originalData = { data: user };
22
- req.responseData = { data: user };
23
- res.locals.data = { data: user };
24
- res.originalStatus = 200;
25
- req.responseStatus = 200;
26
- res.locals.status = 200;
27
- return next();
28
- }
29
- res.status(200).json({ data: user });
13
+ userService;
14
+ getUserService() {
15
+ if (!this.userService)
16
+ this.userService = new ArkosPrismaService("user");
17
+ return this.userService;
18
+ }
19
+ getMe = catchAsync(async (req, res, next) => {
20
+ const user = (await this.getUserService().findOne({ id: req.user.id }, req.prismaQueryOptions || {}));
21
+ Object.keys(defaultExcludedUserFields).forEach((key) => {
22
+ if (user)
23
+ delete user[key];
30
24
  });
31
- this.updateMe = catchAsync(async (req, res, next) => {
32
- if ("password" in req.body)
33
- throw new AppError("In order to update password use the update-password endpoint.", 400, "InvalidFieldPassword");
34
- const user = (await this.getUserService().updateOne({ id: req.user.id }, req.body, req.prismaQueryOptions || {}));
35
- Object.keys(defaultExcludedUserFields).forEach((key) => {
36
- if (user)
37
- delete user[key];
38
- });
39
- if (routeHookReader.getHooks("auth", "updateMe")?.after) {
40
- res.originalData = { data: user };
41
- req.responseData = { data: user };
42
- res.locals.data = { data: user };
43
- res.originalStatus = 200;
44
- req.responseStatus = 200;
45
- res.locals.status = 200;
46
- return next();
47
- }
48
- res.status(200).json({ data: user });
25
+ if (routeHookReader.getHooks("auth", "getMe")?.after) {
26
+ res.originalData = { data: user };
27
+ req.responseData = { data: user };
28
+ res.locals.data = { data: user };
29
+ res.originalStatus = 200;
30
+ req.responseStatus = 200;
31
+ res.locals.status = 200;
32
+ return next();
33
+ }
34
+ res.status(200).json({ data: user });
35
+ });
36
+ updateMe = catchAsync(async (req, res, next) => {
37
+ if ("password" in req.body)
38
+ throw new AppError("In order to update password use the update-password endpoint.", 400, "InvalidFieldPassword");
39
+ const user = (await this.getUserService().updateOne({ id: req.user.id }, req.body, req.prismaQueryOptions || {}));
40
+ Object.keys(defaultExcludedUserFields).forEach((key) => {
41
+ if (user)
42
+ delete user[key];
49
43
  });
50
- this.logout = catchAsync(async (req, res, next) => {
51
- res.cookie("arkos_access_token", "no-token", {
52
- expires: new Date(Date.now() + 10 * 1000),
53
- httpOnly: true,
54
- });
55
- if (routeHookReader.getHooks("auth", "logout")?.after) {
56
- res.originalData = null;
57
- req.responseData = null;
58
- res.locals.data = null;
59
- res.originalStatus = 204;
60
- req.responseStatus = 204;
61
- res.locals.status = 204;
62
- return next();
63
- }
64
- res.status(204).json();
44
+ if (routeHookReader.getHooks("auth", "updateMe")?.after) {
45
+ res.originalData = { data: user };
46
+ req.responseData = { data: user };
47
+ res.locals.data = { data: user };
48
+ res.originalStatus = 200;
49
+ req.responseStatus = 200;
50
+ res.locals.status = 200;
51
+ return next();
52
+ }
53
+ res.status(200).json({ data: user });
54
+ });
55
+ logout = catchAsync(async (req, res, next) => {
56
+ res.cookie("arkos_access_token", "no-token", {
57
+ expires: new Date(Date.now() + 10 * 1000),
58
+ httpOnly: true,
65
59
  });
66
- this.login = catchAsync(async (req, res, next) => {
67
- const authConfigs = getArkosConfig()?.authentication;
68
- const usernameField = determineUsernameField(req);
69
- const lastField = usernameField.split(".")[usernameField.split(".").length - 1];
70
- const usernameValue = req.body[lastField];
71
- const { password } = req.body;
72
- if (!usernameValue || !password)
73
- return next(new AppError(`Please provide both ${lastField} and password`, 400, `MissingCredentialFields`));
74
- let whereClause;
75
- if (usernameField?.includes?.(".")) {
76
- const valueToFind = getNestedValue(req.body, usernameField);
77
- if (valueToFind === undefined) {
78
- return next(new AppError(`Invalid ${usernameField} provided`, 400));
79
- }
80
- whereClause = createPrismaWhereClause(usernameField, valueToFind);
81
- }
82
- else {
83
- whereClause = { [usernameField]: usernameValue };
84
- }
85
- const user = (await this.getUserService().findOne(whereClause, req.prismaQueryOptions || {}));
86
- if (!user ||
87
- !(await authService.isCorrectPassword(password, user.password))) {
88
- return next(new AppError(`Incorrect ${lastField} or password`, 401, `IncorrectCredentials`));
89
- }
90
- const token = authService.signJwtToken(user.id);
91
- const cookieOptions = authService.getJwtCookieOptions(req);
92
- if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
93
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
94
- !authConfigs?.login?.sendAccessTokenThrough) {
95
- req.responseData = { accessToken: token };
96
- res.locals.data = { accessToken: token };
97
- }
98
- if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
99
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
100
- !authConfigs?.login?.sendAccessTokenThrough)
101
- res.cookie("arkos_access_token", token, cookieOptions);
102
- req.accessToken = token;
103
- if (routeHookReader.getHooks("auth", "login")?.after) {
104
- res.originalData = req.responseData;
105
- req.additionalData = { user };
106
- res.locals.additional = { user };
107
- res.originalStatus = 200;
108
- req.responseStatus = 200;
109
- res.locals.status = 200;
110
- return next();
60
+ if (routeHookReader.getHooks("auth", "logout")?.after) {
61
+ res.originalData = null;
62
+ req.responseData = null;
63
+ res.locals.data = null;
64
+ res.originalStatus = 204;
65
+ req.responseStatus = 204;
66
+ res.locals.status = 204;
67
+ return next();
68
+ }
69
+ res.status(204).json();
70
+ });
71
+ login = catchAsync(async (req, res, next) => {
72
+ const authConfigs = getArkosConfig()?.authentication;
73
+ const usernameField = determineUsernameField(req);
74
+ const lastField = usernameField.split(".")[usernameField.split(".").length - 1];
75
+ const usernameValue = req.body[lastField];
76
+ const { password } = req.body;
77
+ if (!usernameValue || !password)
78
+ return next(new AppError(`Please provide both ${lastField} and password`, 400, `MissingCredentialFields`));
79
+ let whereClause;
80
+ if (usernameField?.includes?.(".")) {
81
+ const valueToFind = getNestedValue(req.body, usernameField);
82
+ if (valueToFind === undefined) {
83
+ return next(new AppError(`Invalid ${usernameField} provided`, 400));
111
84
  }
112
- if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
113
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
114
- !authConfigs?.login?.sendAccessTokenThrough) {
115
- res.status(200).json(req.responseData);
116
- }
117
- else if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
118
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
119
- !authConfigs?.login?.sendAccessTokenThrough)
120
- res.status(200).send();
85
+ whereClause = createPrismaWhereClause(usernameField, valueToFind);
86
+ }
87
+ else {
88
+ whereClause = { [usernameField]: usernameValue };
89
+ }
90
+ const user = (await this.getUserService().findOne(whereClause, req.prismaQueryOptions || {}));
91
+ if (!user ||
92
+ !(await authService.isCorrectPassword(password, user.password))) {
93
+ return next(new AppError(`Incorrect ${lastField} or password`, 401, `IncorrectCredentials`));
94
+ }
95
+ const token = authService.signJwtToken(user.id);
96
+ const cookieOptions = authService.getJwtCookieOptions(req);
97
+ if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
98
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
99
+ !authConfigs?.login?.sendAccessTokenThrough) {
100
+ req.responseData = { accessToken: token };
101
+ res.locals.data = { accessToken: token };
102
+ }
103
+ if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
104
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
105
+ !authConfigs?.login?.sendAccessTokenThrough)
106
+ res.cookie("arkos_access_token", token, cookieOptions);
107
+ req.accessToken = token;
108
+ if (routeHookReader.getHooks("auth", "login")?.after) {
109
+ res.originalData = req.responseData;
110
+ req.additionalData = { user };
111
+ res.locals.additional = { user };
112
+ res.originalStatus = 200;
113
+ req.responseStatus = 200;
114
+ res.locals.status = 200;
115
+ return next();
116
+ }
117
+ if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
118
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
119
+ !authConfigs?.login?.sendAccessTokenThrough) {
120
+ res.status(200).json(req.responseData);
121
+ }
122
+ else if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
123
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
124
+ !authConfigs?.login?.sendAccessTokenThrough)
125
+ res.status(200).send();
126
+ });
127
+ signup = catchAsync(async (req, res, next) => {
128
+ const user = (await this.getUserService().createOne(req.body, req.prismaQueryOptions || {}));
129
+ if (routeHookReader.getHooks("auth", "signup")?.after) {
130
+ res.originalData = { data: user };
131
+ req.responseData = { data: user };
132
+ res.locals.data = { data: user };
133
+ res.originalStatus = 201;
134
+ req.responseStatus = 201;
135
+ res.locals.status = 201;
136
+ return next();
137
+ }
138
+ Object.keys(defaultExcludedUserFields).forEach((key) => {
139
+ delete user[key];
121
140
  });
122
- this.signup = catchAsync(async (req, res, next) => {
123
- const user = (await this.getUserService().createOne(req.body, req.prismaQueryOptions || {}));
124
- if (routeHookReader.getHooks("auth", "signup")?.after) {
125
- res.originalData = { data: user };
126
- req.responseData = { data: user };
127
- res.locals.data = { data: user };
128
- res.originalStatus = 201;
129
- req.responseStatus = 201;
130
- res.locals.status = 201;
131
- return next();
132
- }
133
- Object.keys(defaultExcludedUserFields).forEach((key) => {
134
- delete user[key];
135
- });
136
- res.status(201).json({ data: user });
141
+ res.status(201).json({ data: user });
142
+ });
143
+ deleteMe = catchAsync(async (req, res, next) => {
144
+ const userId = req.user.id;
145
+ const updatedUser = (await this.getUserService().updateOne({ id: userId }, { deletedSelfAccountAt: new Date().toISOString() }, req.prismaQueryOptions || {}));
146
+ if (routeHookReader.getHooks("auth", "deleteMe")?.after) {
147
+ res.originalData = { data: updatedUser };
148
+ req.responseData = { data: updatedUser };
149
+ res.locals.data = { data: updatedUser };
150
+ res.originalStatus = 200;
151
+ req.responseStatus = 200;
152
+ res.locals.status = 200;
153
+ return next();
154
+ }
155
+ Object.keys(defaultExcludedUserFields).forEach((key) => {
156
+ delete updatedUser[key];
137
157
  });
138
- this.deleteMe = catchAsync(async (req, res, next) => {
139
- const userId = req.user.id;
140
- const updatedUser = (await this.getUserService().updateOne({ id: userId }, { deletedSelfAccountAt: new Date().toISOString() }, req.prismaQueryOptions || {}));
141
- if (routeHookReader.getHooks("auth", "deleteMe")?.after) {
142
- res.originalData = { data: updatedUser };
143
- req.responseData = { data: updatedUser };
144
- res.locals.data = { data: updatedUser };
145
- res.originalStatus = 200;
146
- req.responseStatus = 200;
147
- res.locals.status = 200;
148
- return next();
149
- }
150
- Object.keys(defaultExcludedUserFields).forEach((key) => {
151
- delete updatedUser[key];
152
- });
153
- res.status(200).json({ message: "Account deleted successfully" });
158
+ res.status(200).json({ message: "Account deleted successfully" });
159
+ });
160
+ updatePassword = catchAsync(async (req, res, next) => {
161
+ const { currentPassword, newPassword } = req.body;
162
+ if (!currentPassword || !newPassword)
163
+ return next(new AppError("currentPassword and newPassword are required", 400, "SameCurrentAndNewPassword"));
164
+ const user = req.user;
165
+ if (!user || user?.isActive === false || user?.deletedSelfAccountAt)
166
+ return next(new AppError("User not found!", 404));
167
+ const isPasswordCorrect = await authService.isCorrectPassword(String(currentPassword), String(user.password));
168
+ if (!isPasswordCorrect)
169
+ return next(new AppError("Current password is incorrect", 400, "IncorrentCurrentPassword"));
170
+ await this.getUserService().updateOne({ id: user.id }, {
171
+ password: await authService.hashPassword(newPassword),
172
+ passwordChangedAt: new Date(Date.now()).toISOString(),
154
173
  });
155
- this.updatePassword = catchAsync(async (req, res, next) => {
156
- const { currentPassword, newPassword } = req.body;
157
- if (!currentPassword || !newPassword)
158
- return next(new AppError("currentPassword and newPassword are required", 400, "SameCurrentAndNewPassword"));
159
- const user = req.user;
160
- if (!user || user?.isActive === false || user?.deletedSelfAccountAt)
161
- return next(new AppError("User not found!", 404));
162
- const isPasswordCorrect = await authService.isCorrectPassword(String(currentPassword), String(user.password));
163
- const configs = getArkosConfig();
164
- const initAuthConfigs = configs?.authentication;
165
- if (!isPasswordCorrect)
166
- return next(new AppError("Current password is incorrect", 400, "IncorrentCurrentPassword"));
167
- if (!authService.isPasswordStrong(String(newPassword)) &&
168
- !configs?.validation) {
169
- return next(new AppError(initAuthConfigs?.passwordValidation?.message ||
170
- "The new password must contain at least one uppercase letter, one lowercase letter, and one number", 400, "PasswordDoesNotMeetRequirements"));
171
- }
172
- await this.getUserService().updateOne({ id: user.id }, {
173
- password: await authService.hashPassword(newPassword),
174
- passwordChangedAt: new Date(Date.now()).toISOString(),
175
- });
176
- const token = authService.signJwtToken(user.id);
177
- const cookieOptions = authService.getJwtCookieOptions(req);
178
- const authConfigs = getArkosConfig()?.authentication;
179
- const responseData = {
180
- status: "success",
181
- message: "Password updated successfully!",
182
- };
183
- if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
184
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
185
- !authConfigs?.login?.sendAccessTokenThrough) {
186
- responseData.accessToken = token;
187
- }
188
- if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
189
- authConfigs?.login?.sendAccessTokenThrough === "both" ||
190
- !authConfigs?.login?.sendAccessTokenThrough)
191
- res.cookie("arkos_access_token", token, cookieOptions);
192
- req.accessToken = token;
193
- if (routeHookReader.getHooks("auth", "updatePassword")?.after) {
194
- res.originalData = responseData;
195
- req.additionalData = { user };
196
- req.responseData = responseData;
197
- res.locals.data = responseData;
198
- res.originalStatus = 200;
199
- req.responseStatus = 200;
200
- res.locals.status = 200;
201
- return next();
202
- }
203
- res.status(200).json(responseData);
174
+ const token = authService.signJwtToken(user.id);
175
+ const cookieOptions = authService.getJwtCookieOptions(req);
176
+ const authConfigs = getArkosConfig()?.authentication;
177
+ const responseData = {
178
+ status: "success",
179
+ message: "Password updated successfully!",
180
+ };
181
+ if (authConfigs?.login?.sendAccessTokenThrough === "response-only" ||
182
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
183
+ !authConfigs?.login?.sendAccessTokenThrough) {
184
+ responseData.accessToken = token;
185
+ }
186
+ if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
187
+ authConfigs?.login?.sendAccessTokenThrough === "both" ||
188
+ !authConfigs?.login?.sendAccessTokenThrough)
189
+ res.cookie("arkos_access_token", token, cookieOptions);
190
+ req.accessToken = token;
191
+ if (routeHookReader.getHooks("auth", "updatePassword")?.after) {
192
+ res.originalData = responseData;
193
+ req.additionalData = { user };
194
+ req.responseData = responseData;
195
+ res.locals.data = responseData;
196
+ res.originalStatus = 200;
197
+ req.responseStatus = 200;
198
+ res.locals.status = 200;
199
+ return next();
200
+ }
201
+ res.status(200).json(responseData);
202
+ });
203
+ findManyAuthAction = catchAsync(async (_, res) => {
204
+ const arkosConfig = getArkosConfig();
205
+ const authActions = authActionService.getAll()?.map((authAction) => {
206
+ if (arkosConfig?.authentication?.mode === "dynamic")
207
+ delete authAction?.roles;
208
+ return authAction;
204
209
  });
205
- this.findManyAuthAction = catchAsync(async (_, res) => {
206
- const arkosConfig = getArkosConfig();
207
- const authActions = authActionService.getAll()?.map((authAction) => {
208
- if (arkosConfig?.authentication?.mode === "dynamic")
209
- delete authAction?.roles;
210
- return authAction;
211
- });
212
- res.json({
213
- total: authActions.length,
214
- results: authActions.length,
215
- data: authActions,
216
- });
210
+ res.json({
211
+ total: authActions.length,
212
+ results: authActions.length,
213
+ data: authActions,
217
214
  });
218
- this.findOneAuthAction = catchAsync(async (req, res) => {
219
- const arkosConfig = getArkosConfig();
220
- const resourceName = req.params?.resourceName;
221
- if (!resourceName)
222
- throw new AppError(`Please provide a resoureName`, 400, "MissiongResourseName");
223
- const authActions = authActionService
224
- .getByResource(req.params?.resourceName)
225
- ?.map((authAction) => {
226
- if (arkosConfig?.authentication?.mode === "dynamic")
227
- delete authAction?.roles;
228
- return authAction;
229
- });
230
- if (!authActions)
231
- throw new AppError(`No auth action with resource name ${resourceName}`, 404, "AuthActionNotFound");
232
- res.json({
233
- total: authActions.length,
234
- results: authActions.length,
235
- data: authActions,
236
- });
215
+ });
216
+ findOneAuthAction = catchAsync(async (req, res) => {
217
+ const arkosConfig = getArkosConfig();
218
+ const resourceName = req.params?.resourceName;
219
+ if (!resourceName)
220
+ throw new AppError(`Please provide a resoureName`, 400, "MissiongResourseName");
221
+ const authActions = authActionService
222
+ .getByResource(req.params?.resourceName)
223
+ ?.map((authAction) => {
224
+ if (arkosConfig?.authentication?.mode === "dynamic")
225
+ delete authAction?.roles;
226
+ return authAction;
237
227
  });
238
- }
239
- getUserService() {
240
- if (!this.userService)
241
- this.userService = new ArkosPrismaService("user");
242
- return this.userService;
243
- }
228
+ if (!authActions)
229
+ throw new AppError(`No auth action with resource name ${resourceName}`, 404, "AuthActionNotFound");
230
+ res.json({
231
+ total: authActions.length,
232
+ results: authActions.length,
233
+ data: authActions,
234
+ });
235
+ });
244
236
  }
245
237
  export const authController = new AuthController();
246
238
  export default authController;
@@ -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 { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport authService from \"./auth.service\";\nimport { ArkosPrismaService } from \"../base/base.service\";\nimport { User } from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n} from \"./utils/helpers/auth.controller.helpers\";\nimport authActionService from \"./utils/services/auth-action.service\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\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 * Authentication controller class handling all auth-related operations\n */\nexport class AuthController {\n private userService?: ArkosPrismaService<\"user\">;\n\n private getUserService() {\n if (!this.userService) this.userService = new ArkosPrismaService(\"user\");\n return this.userService;\n }\n\n /**\n * Retrieves the current authenticated user's information\n */\n getMe = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const user = (await this.getUserService().findOne(\n { id: req.user!.id },\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (routeHookReader.getHooks(\"auth\", \"getMe\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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 (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400,\n \"InvalidFieldPassword\"\n );\n\n const user = (await this.getUserService().updateOne(\n { id: req.user!.id },\n req.body,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (routeHookReader.getHooks(\"auth\", \"updateMe\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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 (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (routeHookReader.getHooks(\"auth\", \"logout\")?.after) {\n (res as any).originalData = null;\n req.responseData = null;\n res.locals.data = null;\n (res as any).originalStatus = 204;\n req.responseStatus = 204;\n res.locals.status = 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 */\n login = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(\n `Please provide both ${lastField} and password`,\n 400,\n `MissingCredentialFields`\n )\n );\n\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\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 whereClause = { [usernameField]: usernameValue };\n }\n\n const user = (await this.getUserService().findOne(\n whereClause,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(\n new AppError(\n `Incorrect ${lastField} or password`,\n 401,\n `IncorrectCredentials`\n )\n );\n }\n\n const token = authService.signJwtToken(user.id!);\n const cookieOptions = authService.getJwtCookieOptions(req);\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 res.locals.data = { 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 req.accessToken = token;\n\n if (routeHookReader.getHooks(\"auth\", \"login\")?.after) {\n (res as any).originalData = req.responseData;\n req.additionalData = { user };\n res.locals.additional = { user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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\n */\n signup = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const user = (await this.getUserService().createOne(\n req.body,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (routeHookReader.getHooks(\"auth\", \"signup\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 201;\n req.responseStatus = 201;\n res.locals.status = 201;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete user[key as keyof User];\n });\n\n res.status(201).json({ data: user });\n }\n );\n\n /**\n * Marks user account as self-deleted\n */\n deleteMe = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const userId = req.user!.id;\n\n const updatedUser = (await this.getUserService().updateOne(\n { id: userId },\n { deletedSelfAccountAt: new Date().toISOString() },\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (routeHookReader.getHooks(\"auth\", \"deleteMe\")?.after) {\n (res as any).originalData = { data: updatedUser };\n req.responseData = { data: updatedUser };\n res.locals.data = { data: updatedUser };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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({ message: \"Account deleted successfully\" });\n }\n );\n\n /**\n * Updates the password of the authenticated user\n */\n updatePassword = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { currentPassword, newPassword } = req.body;\n\n if (!currentPassword || !newPassword)\n return next(\n new AppError(\n \"currentPassword and newPassword are required\",\n 400,\n \"SameCurrentAndNewPassword\"\n )\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 const isPasswordCorrect = await authService.isCorrectPassword(\n String(currentPassword),\n String(user.password)\n );\n\n const configs = getArkosConfig();\n const initAuthConfigs = configs?.authentication;\n\n if (!isPasswordCorrect)\n return next(\n new AppError(\n \"Current password is incorrect\",\n 400,\n \"IncorrentCurrentPassword\"\n )\n );\n\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 \"PasswordDoesNotMeetRequirements\"\n )\n );\n }\n\n await this.getUserService().updateOne(\n { id: user.id },\n {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(Date.now()).toISOString(),\n }\n );\n\n const token = authService.signJwtToken(user.id!);\n const cookieOptions = authService.getJwtCookieOptions(req);\n const authConfigs = getArkosConfig()?.authentication;\n\n const responseData: Record<string, string> = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n 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 req.accessToken = token;\n\n if (routeHookReader.getHooks(\"auth\", \"updatePassword\")?.after) {\n (res as any).originalData = responseData;\n req.additionalData = { user };\n req.responseData = responseData;\n res.locals.data = responseData;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(responseData);\n }\n );\n\n findManyAuthAction = catchAsync(\n async (_: ArkosRequest, res: ArkosResponse) => {\n const arkosConfig = getArkosConfig();\n const authActions = authActionService.getAll()?.map((authAction) => {\n if (arkosConfig?.authentication?.mode === \"dynamic\")\n delete (authAction as any)?.roles;\n return authAction;\n });\n\n res.json({\n total: authActions.length,\n results: authActions.length,\n data: authActions,\n });\n }\n );\n\n findOneAuthAction = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse) => {\n const arkosConfig = getArkosConfig();\n const resourceName = req.params?.resourceName;\n\n if (!resourceName)\n throw new AppError(\n `Please provide a resoureName`,\n 400,\n \"MissiongResourseName\"\n );\n\n const authActions = authActionService\n .getByResource(req.params?.resourceName)\n ?.map((authAction) => {\n if (arkosConfig?.authentication?.mode === \"dynamic\")\n delete (authAction as any)?.roles;\n return authAction;\n });\n\n if (!authActions)\n throw new AppError(\n `No auth action with resource name ${resourceName}`,\n 404,\n \"AuthActionNotFound\"\n );\n\n res.json({\n total: authActions.length,\n results: authActions.length,\n data: authActions,\n });\n }\n );\n}\n\nexport const authController = new AuthController();\n\nexport default authController;\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 { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport authService from \"./auth.service\";\nimport { ArkosPrismaService } from \"../base/base.service\";\nimport { User } from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport {\n createPrismaWhereClause,\n determineUsernameField,\n getNestedValue,\n} from \"./utils/helpers/auth.controller.helpers\";\nimport authActionService from \"./utils/services/auth-action.service\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\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 * Authentication controller class handling all auth-related operations\n */\nexport class AuthController {\n private userService?: ArkosPrismaService<\"user\">;\n\n private getUserService() {\n if (!this.userService) this.userService = new ArkosPrismaService(\"user\");\n return this.userService;\n }\n\n /**\n * Retrieves the current authenticated user's information\n */\n getMe = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const user = (await this.getUserService().findOne(\n { id: req.user!.id },\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (routeHookReader.getHooks(\"auth\", \"getMe\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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 (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (\"password\" in req.body)\n throw new AppError(\n \"In order to update password use the update-password endpoint.\",\n 400,\n \"InvalidFieldPassword\"\n );\n\n const user = (await this.getUserService().updateOne(\n { id: req.user!.id },\n req.body,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n if (user) delete user[key as keyof User];\n });\n\n if (routeHookReader.getHooks(\"auth\", \"updateMe\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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 (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (routeHookReader.getHooks(\"auth\", \"logout\")?.after) {\n (res as any).originalData = null;\n req.responseData = null;\n res.locals.data = null;\n (res as any).originalStatus = 204;\n req.responseStatus = 204;\n res.locals.status = 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 */\n login = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const authConfigs = getArkosConfig()?.authentication;\n\n const usernameField = determineUsernameField(req);\n\n const lastField =\n usernameField.split(\".\")[usernameField.split(\".\").length - 1];\n\n const usernameValue = req.body[lastField];\n const { password } = req.body;\n\n if (!usernameValue || !password)\n return next(\n new AppError(\n `Please provide both ${lastField} and password`,\n 400,\n `MissingCredentialFields`\n )\n );\n\n let whereClause: Record<string, any>;\n\n if (usernameField?.includes?.(\".\")) {\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 whereClause = { [usernameField]: usernameValue };\n }\n\n const user = (await this.getUserService().findOne(\n whereClause,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (\n !user ||\n !(await authService.isCorrectPassword(password, user.password))\n ) {\n return next(\n new AppError(\n `Incorrect ${lastField} or password`,\n 401,\n `IncorrectCredentials`\n )\n );\n }\n\n const token = authService.signJwtToken(user.id!);\n const cookieOptions = authService.getJwtCookieOptions(req);\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 res.locals.data = { 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 req.accessToken = token;\n\n if (routeHookReader.getHooks(\"auth\", \"login\")?.after) {\n (res as any).originalData = req.responseData;\n req.additionalData = { user };\n res.locals.additional = { user };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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\n */\n signup = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const user = (await this.getUserService().createOne(\n req.body,\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (routeHookReader.getHooks(\"auth\", \"signup\")?.after) {\n (res as any).originalData = { data: user };\n req.responseData = { data: user };\n res.locals.data = { data: user };\n (res as any).originalStatus = 201;\n req.responseStatus = 201;\n res.locals.status = 201;\n return next();\n }\n\n Object.keys(defaultExcludedUserFields).forEach((key) => {\n delete user[key as keyof User];\n });\n\n res.status(201).json({ data: user });\n }\n );\n\n /**\n * Marks user account as self-deleted\n */\n deleteMe = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const userId = req.user!.id;\n\n const updatedUser = (await this.getUserService().updateOne(\n { id: userId },\n { deletedSelfAccountAt: new Date().toISOString() },\n req.prismaQueryOptions || {}\n )) as Record<string, any>;\n\n if (routeHookReader.getHooks(\"auth\", \"deleteMe\")?.after) {\n (res as any).originalData = { data: updatedUser };\n req.responseData = { data: updatedUser };\n res.locals.data = { data: updatedUser };\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 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({ message: \"Account deleted successfully\" });\n }\n );\n\n /**\n * Updates the password of the authenticated user\n */\n updatePassword = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { currentPassword, newPassword } = req.body;\n\n if (!currentPassword || !newPassword)\n return next(\n new AppError(\n \"currentPassword and newPassword are required\",\n 400,\n \"SameCurrentAndNewPassword\"\n )\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 const isPasswordCorrect = await authService.isCorrectPassword(\n String(currentPassword),\n String(user.password)\n );\n\n if (!isPasswordCorrect)\n return next(\n new AppError(\n \"Current password is incorrect\",\n 400,\n \"IncorrentCurrentPassword\"\n )\n );\n\n\n await this.getUserService().updateOne(\n { id: user.id },\n {\n password: await authService.hashPassword(newPassword),\n passwordChangedAt: new Date(Date.now()).toISOString(),\n }\n );\n\n const token = authService.signJwtToken(user.id!);\n const cookieOptions = authService.getJwtCookieOptions(req);\n const authConfigs = getArkosConfig()?.authentication;\n\n const responseData: Record<string, string> = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n\n if (\n authConfigs?.login?.sendAccessTokenThrough === \"response-only\" ||\n authConfigs?.login?.sendAccessTokenThrough === \"both\" ||\n !authConfigs?.login?.sendAccessTokenThrough\n ) {\n 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 req.accessToken = token;\n\n if (routeHookReader.getHooks(\"auth\", \"updatePassword\")?.after) {\n (res as any).originalData = responseData;\n req.additionalData = { user };\n req.responseData = responseData;\n res.locals.data = responseData;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(responseData);\n }\n );\n\n findManyAuthAction = catchAsync(\n async (_: ArkosRequest, res: ArkosResponse) => {\n const arkosConfig = getArkosConfig();\n const authActions = authActionService.getAll()?.map((authAction) => {\n if (arkosConfig?.authentication?.mode === \"dynamic\")\n delete (authAction as any)?.roles;\n return authAction;\n });\n\n res.json({\n total: authActions.length,\n results: authActions.length,\n data: authActions,\n });\n }\n );\n\n findOneAuthAction = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse) => {\n const arkosConfig = getArkosConfig();\n const resourceName = req.params?.resourceName;\n\n if (!resourceName)\n throw new AppError(\n `Please provide a resoureName`,\n 400,\n \"MissiongResourseName\"\n );\n\n const authActions = authActionService\n .getByResource(req.params?.resourceName)\n ?.map((authAction) => {\n if (arkosConfig?.authentication?.mode === \"dynamic\")\n delete (authAction as any)?.roles;\n return authAction;\n });\n\n if (!authActions)\n throw new AppError(\n `No auth action with resource name ${resourceName}`,\n 404,\n \"AuthActionNotFound\"\n );\n\n res.json({\n total: authActions.length,\n results: authActions.length,\n data: authActions,\n });\n }\n );\n}\n\nexport const authController = new AuthController();\n\nexport default authController;\n"]}