arkos 2.0.0-next.29 → 2.0.0-next.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/app.js +2 -0
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/components/arkos-gateway/arkos-gateway.js +22 -5
- package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -1
- package/dist/esm/components/arkos-gateway/types.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/index.js +9 -3
- package/dist/esm/components/arkos-route-hook/index.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
- package/dist/esm/exports/file-upload.js +2 -0
- package/dist/esm/exports/file-upload.js.map +1 -0
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/exports/websockets.js.map +1 -1
- package/dist/esm/generated.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +84 -141
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +1 -1
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +93 -15
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/auth.types.js +2 -0
- package/dist/esm/modules/auth/auth.types.js.map +1 -0
- package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -0
- package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
- package/dist/esm/modules/auth/utils/token-extraction.js +57 -0
- package/dist/esm/modules/auth/utils/token-extraction.js.map +1 -0
- package/dist/esm/modules/base/base.controller.js +5 -0
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +4 -4
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/utils/error-prettifier.js +64 -0
- package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +52 -8
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/get-handled-error.js +5 -0
- package/dist/esm/modules/error-handler/utils/get-handled-error.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.controller.js +25 -7
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +21 -5
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +28 -18
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js +37 -12
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +73 -35
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/helpers/serve-upload-dir.js +206 -0
- package/dist/esm/modules/file-upload/utils/helpers/serve-upload-dir.js.map +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-path.helper.js +103 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-path.helper.js.map +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-serving-validation.js +212 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-serving-validation.js.map +1 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-serving.registry.js +30 -0
- package/dist/esm/modules/file-upload/utils/helpers/upload-serving.registry.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +7 -8
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/internal.js +2 -0
- package/dist/esm/types/internal.js.map +1 -0
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/types/upload.js.map +1 -1
- package/dist/esm/types/validation/validation-manager.js +18 -10
- package/dist/esm/types/validation/validation-manager.js.map +1 -1
- package/dist/esm/types/validation/validator.js.map +1 -1
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +2 -11
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/route-config-validator.js +11 -10
- package/dist/esm/utils/arkos-router/route-config-validator.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +1 -0
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +326 -37
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +15 -2
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +8 -3
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +21 -20
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/prisma-generate.js +24 -5
- package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
- package/dist/esm/utils/cli/start.js +2 -0
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/dependency-version-check.js +39 -0
- package/dist/esm/utils/cli/utils/dependency-version-check.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/esm/utils/define-config.js +1 -0
- package/dist/esm/utils/define-config.js.map +1 -1
- package/dist/esm/utils/initialize-app.js +2 -0
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/types/app.d.ts +5 -2
- package/dist/types/components/arkos-gateway/arkos-gateway.d.ts +19 -7
- package/dist/types/components/arkos-gateway/types.d.ts +19 -2
- package/dist/types/components/arkos-route-hook/index.d.ts +4 -3
- package/dist/types/components/arkos-route-hook/reader.d.ts +1 -1
- package/dist/types/components/arkos-route-hook/types.d.ts +4 -1
- package/dist/types/exports/file-upload.d.ts +1 -0
- package/dist/types/exports/index.d.ts +1 -2
- package/dist/types/exports/websockets.d.ts +1 -1
- package/dist/types/modules/auth/auth.controller.d.ts +10 -3
- package/dist/types/modules/auth/auth.service.d.ts +90 -0
- package/dist/types/modules/auth/auth.types.d.ts +72 -0
- package/dist/types/modules/auth/utils/helpers/auth.controller.helpers.d.ts +1 -0
- package/dist/types/modules/auth/utils/token-extraction.d.ts +53 -0
- package/dist/types/modules/base/base.controller.d.ts +1 -0
- package/dist/types/modules/base/utils/error-prettifier.d.ts +8 -0
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -0
- package/dist/types/modules/file-upload/file-upload.service.d.ts +2 -6
- package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +21 -1
- package/dist/types/modules/file-upload/utils/helpers/serve-upload-dir.d.ts +43 -0
- package/dist/types/modules/file-upload/utils/helpers/upload-path.helper.d.ts +14 -0
- package/dist/types/modules/file-upload/utils/helpers/upload-serving-validation.d.ts +5 -0
- package/dist/types/modules/file-upload/utils/helpers/upload-serving.registry.d.ts +31 -0
- package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +1 -1
- package/dist/types/types/index.d.ts +5 -0
- package/dist/types/types/internal.d.ts +25 -0
- package/dist/types/types/new-arkos-config.d.ts +24 -2
- package/dist/types/types/upload.d.ts +35 -0
- package/dist/types/types/validation/validation-manager.d.ts +6 -8
- package/dist/types/types/validation/validator.d.ts +2 -2
- package/dist/types/utils/arkos-router/types/index.d.ts +3 -2
- package/dist/types/utils/arkos-router/types/upload-config.d.ts +102 -11
- package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +20 -0
- package/dist/types/utils/cli/utils/dependency-version-check.d.ts +15 -0
- package/dist/types/utils/define-config.d.ts +56 -2
- package/dist/types/utils/helpers/prisma.helpers.d.ts +1 -1
- package/package.json +15 -38
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/generated.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/generated.ts"],"names":[],"mappings":"AA2IA,MAAM,OAAO,YAAY;CAExB","sourcesContent":["/**\n * @maintainers THIS FILE IS A STUB — DO NOT PUT REAL LOGIC HERE.\n *\n * This file exists only so the Arkos source compiles during development.\n * It is completely overwritten at build time by `scripts/generate-post-build-types.ts`,\n * which replaces it with re-exports from `@arkosjs/types` — a folder generated\n * in the user's `node_modules` by `npx arkos generate`.\n *\n * This is the single gateway for all Prisma-dependent types and values.\n * DO NOT import from `@prisma/client` or any user-project-specific module\n * anywhere else in the codebase — add it here instead.\n *\n * To add a new generated type or value:\n * 1. Add a stub export here\n * 2. Add the real export to the `npx arkos generate` output in\n * `src/utils/cli/commands/prisma-generate.command.ts`\n * 3. Add it to the overwrite in `scripts/generate-post-build-types.ts`\n */\n\n/**\n * A map of all Prisma models in the user's project.\n * Each key is a kebab-case model name, each value contains the full\n * Prisma delegate, payload, and args types for that model.\n *\n * Stub during Arkos development — replaced with real generated types\n * after `npx arkos generate`.\n *\n * @example\n * ```ts\n * class ArkosPrismaService<TModelName extends keyof PrismaModels<any>> {}\n * ```\n */\n\nimport type { ArkosConfig } from \"./types/new-arkos-config\";\n\ninterface StubWhereArgs {\n where?: { id?: any; [key: string]: any };\n [key: string]: any;\n}\n\ninterface StubWhereUniqueArgs {\n where: { id?: any; [key: string]: any };\n [key: string]: any;\n}\n\ninterface StubDataArgs {\n data: Record<string, any>;\n [key: string]: any;\n}\n\ninterface StubWhereDataArgs {\n where: { id?: any; [key: string]: any };\n data: Record<string, any>;\n [key: string]: any;\n}\n\ninterface StubPaginationArgs extends StubWhereArgs {\n orderBy?: Record<string, any>;\n select?: Record<string, any>;\n include?: Record<string, any>;\n skip?: number;\n take?: number;\n cursor?: Record<string, any>;\n}\n\ninterface StubCountArgs extends StubWhereArgs {\n select?: Record<string, any>;\n orderBy?: Record<string, any>;\n skip?: number;\n take?: number;\n cursor?: Record<string, any>;\n}\n\n/**\n * Extracts the `where` filter type from a Prisma args type.\n * @example ExtractPrismaFilters<PrismaModels<any>['user']['FindManyArgs']>\n */\nexport type ExtractPrismaFilters<T> = T extends {\n where?: infer W;\n [key: string]: any;\n}\n ? W\n : any;\n\n/**\n * Extracts the `data` type from a Prisma args type.\n * @example ExtractPrismaData<PrismaModels<any>['user']['CreateArgs']>\n */\nexport type ExtractPrismaData<T> = T extends {\n data: infer D;\n [key: string]: any;\n}\n ? D\n : any;\n\n/**\n * Extracts query options from a Prisma args type by omitting the specified keys.\n * @example ExtractPrismaQueryOptions<PrismaModels<any>['user']['CreateArgs'], 'data'>\n */\nexport type ExtractPrismaQueryOptions<T, K extends keyof T = never> = Omit<\n T,\n K\n>;\n\n/**\n * A map of all Prisma models in the user's project.\n * Each key is a kebab-case model name, each value contains the full\n * Prisma delegate, payload, and args types for that model.\n *\n * Stub during Arkos development — replaced with real generated types\n * after `npx arkos generate`.\n *\n * @example\n * ```ts\n * class ArkosPrismaService<TModelName extends keyof PrismaModels<any>> {}\n * ```\n */\nexport type PrismaModels<T extends Record<string, any>> = Record<\n string,\n {\n Delegate: Record<string, (...args: any[]) => any>;\n GetPayload: Record<string, any>;\n FindManyArgs: StubPaginationArgs;\n FindFirstArgs: StubPaginationArgs;\n CreateArgs: StubDataArgs;\n CreateManyArgs: StubDataArgs;\n UpdateArgs: StubWhereDataArgs;\n UpdateManyArgs: StubWhereDataArgs;\n DeleteArgs: StubWhereUniqueArgs;\n DeleteManyArgs: StubWhereArgs;\n CountArgs: StubCountArgs;\n }\n>;\n\n/**\n * Stub PrismaClient for Arkos development.\n * Replaced with the real `PrismaClient` from `@prisma/client` after\n * `npx arkos generate`.\n */\nexport class PrismaClient {\n [key: string]: any;\n}\n\n/**\n * A literal-typed view of the user's `arkos.config`, generated by\n * `arkos generate` into `.arkos/config.d.ts` and re-exported here at build time.\n *\n * Stub during Arkos development — replaced with the real generated type\n * after `npx arkos generate`.\n */\nexport type RuntimeArkosConfig = ArkosConfig;\n"]}
|
|
@@ -1,111 +1,100 @@
|
|
|
1
1
|
import catchAsync from "../error-handler/utils/catch-async.js";
|
|
2
2
|
import AppError from "../error-handler/utils/app-error.js";
|
|
3
|
-
import authService from "./auth.service.js";
|
|
4
|
-
import { ArkosPrismaService } from "../base/base.service.js";
|
|
3
|
+
import authService, { AuthService } from "./auth.service.js";
|
|
5
4
|
import { getArkosConfig } from "../../server.js";
|
|
6
|
-
import {
|
|
5
|
+
import { determineUsernameField } from "./utils/helpers/auth.controller.helpers.js";
|
|
7
6
|
import authActionService from "./utils/services/auth-action.service.js";
|
|
8
|
-
import { routeHookReader } from "../../components/arkos-route-hook/reader.js";
|
|
7
|
+
import { routeHookReader, } from "../../components/arkos-route-hook/reader.js";
|
|
8
|
+
import loadableRegistry from "../../components/arkos-loadable-registry/index.js";
|
|
9
9
|
export const defaultExcludedUserFields = {
|
|
10
10
|
password: false,
|
|
11
11
|
};
|
|
12
|
+
const hasRequiredData = {
|
|
13
|
+
getMe: (result) => !!result,
|
|
14
|
+
updateMe: (result) => !!result,
|
|
15
|
+
signup: (result) => !!result,
|
|
16
|
+
deleteMe: (result) => !!result,
|
|
17
|
+
login: (result) => !!result?.user && !!result?.accessToken,
|
|
18
|
+
updatePassword: (result) => !!result?.accessToken,
|
|
19
|
+
logout: () => true,
|
|
20
|
+
};
|
|
21
|
+
const resolveTokenDelivery = () => {
|
|
22
|
+
const sendAccessTokenThrough = getArkosConfig()?.authentication?.login?.sendAccessTokenThrough;
|
|
23
|
+
return {
|
|
24
|
+
inResponse: !sendAccessTokenThrough ||
|
|
25
|
+
sendAccessTokenThrough === "both" ||
|
|
26
|
+
sendAccessTokenThrough === "response-only",
|
|
27
|
+
inCookie: !sendAccessTokenThrough ||
|
|
28
|
+
sendAccessTokenThrough === "both" ||
|
|
29
|
+
sendAccessTokenThrough === "cookie-only",
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const setHookState = (req, res, data, status) => {
|
|
33
|
+
res.originalData = data;
|
|
34
|
+
req.responseData = data;
|
|
35
|
+
res.locals.data = data;
|
|
36
|
+
res.originalStatus = status;
|
|
37
|
+
req.responseStatus = status;
|
|
38
|
+
res.locals.status = status;
|
|
39
|
+
};
|
|
40
|
+
const hasAfterHook = (operation) => !!routeHookReader.getHooks("auth", operation)?.after;
|
|
12
41
|
export class AuthController {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
42
|
+
getAuthService() {
|
|
43
|
+
const routeHook = loadableRegistry.getItem("ArkosRouteHook", "auth");
|
|
44
|
+
const service = routeHook?._configs?.service;
|
|
45
|
+
if (service && !(service instanceof AuthService))
|
|
46
|
+
throw new Error("ValidationError: The `service` passed to ArkosRouteHook(\"auth\") must be an instance of a class that extends AuthService.");
|
|
47
|
+
return service ?? authService;
|
|
48
|
+
}
|
|
49
|
+
async callService(method, ...args) {
|
|
50
|
+
const auth = this.getAuthService();
|
|
51
|
+
const result = await auth[method].apply(auth, args);
|
|
52
|
+
if (auth !== authService && !hasRequiredData[method](result))
|
|
53
|
+
throw new Error(`Custom auth service method ${method} didn't return the required data`);
|
|
54
|
+
return result;
|
|
18
55
|
}
|
|
19
56
|
getMe = catchAsync(async (req, res, next) => {
|
|
20
|
-
const user =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
delete user[key];
|
|
24
|
-
});
|
|
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;
|
|
57
|
+
const user = await this.callService("getMe", req.user.id, req.prismaQueryOptions);
|
|
58
|
+
if (hasAfterHook("getMe")) {
|
|
59
|
+
setHookState(req, res, { data: user }, 200);
|
|
32
60
|
return next();
|
|
33
61
|
}
|
|
34
62
|
res.status(200).json({ data: user });
|
|
35
63
|
});
|
|
36
64
|
updateMe = catchAsync(async (req, res, next) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
41
|
-
if (user)
|
|
42
|
-
delete user[key];
|
|
43
|
-
});
|
|
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;
|
|
65
|
+
const user = await this.callService("updateMe", req.user.id, req.body, req.prismaQueryOptions);
|
|
66
|
+
if (hasAfterHook("updateMe")) {
|
|
67
|
+
setHookState(req, res, { data: user }, 200);
|
|
51
68
|
return next();
|
|
52
69
|
}
|
|
53
70
|
res.status(200).json({ data: user });
|
|
54
71
|
});
|
|
55
72
|
logout = catchAsync(async (req, res, next) => {
|
|
73
|
+
if (!req.user?.id || !req.accessToken)
|
|
74
|
+
throw new AppError("Logout requires an authenticated user and an access token", 401, "UnauthenticatedLogout");
|
|
75
|
+
await this.callService("logout", req.user.id, req.accessToken);
|
|
56
76
|
res.cookie("arkos_access_token", "no-token", {
|
|
57
77
|
expires: new Date(Date.now() + 10 * 1000),
|
|
58
78
|
httpOnly: true,
|
|
59
79
|
});
|
|
60
|
-
if (
|
|
61
|
-
res
|
|
62
|
-
req.responseData = null;
|
|
63
|
-
res.locals.data = null;
|
|
64
|
-
res.originalStatus = 204;
|
|
65
|
-
req.responseStatus = 204;
|
|
66
|
-
res.locals.status = 204;
|
|
80
|
+
if (hasAfterHook("logout")) {
|
|
81
|
+
setHookState(req, res, null, 204);
|
|
67
82
|
return next();
|
|
68
83
|
}
|
|
69
84
|
res.status(204).json();
|
|
70
85
|
});
|
|
71
86
|
login = catchAsync(async (req, res, next) => {
|
|
72
|
-
const authConfigs = getArkosConfig()?.authentication;
|
|
73
87
|
const usernameField = determineUsernameField(req);
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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));
|
|
84
|
-
}
|
|
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`));
|
|
88
|
+
const { user, accessToken } = await this.callService("login", { ...req.body, usernameField }, req.prismaQueryOptions);
|
|
89
|
+
const delivery = resolveTokenDelivery();
|
|
90
|
+
if (delivery.inResponse) {
|
|
91
|
+
req.responseData = { accessToken };
|
|
92
|
+
res.locals.data = { accessToken };
|
|
94
93
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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) {
|
|
94
|
+
if (delivery.inCookie)
|
|
95
|
+
res.cookie("arkos_access_token", accessToken, authService.getJwtCookieOptions(req));
|
|
96
|
+
req.accessToken = accessToken;
|
|
97
|
+
if (hasAfterHook("login")) {
|
|
109
98
|
res.originalData = req.responseData;
|
|
110
99
|
req.additionalData = { user };
|
|
111
100
|
res.locals.additional = { user };
|
|
@@ -114,88 +103,42 @@ export class AuthController {
|
|
|
114
103
|
res.locals.status = 200;
|
|
115
104
|
return next();
|
|
116
105
|
}
|
|
117
|
-
if (
|
|
118
|
-
authConfigs?.login?.sendAccessTokenThrough === "both" ||
|
|
119
|
-
!authConfigs?.login?.sendAccessTokenThrough) {
|
|
106
|
+
if (delivery.inResponse)
|
|
120
107
|
res.status(200).json(req.responseData);
|
|
121
|
-
|
|
122
|
-
else if (authConfigs?.login?.sendAccessTokenThrough === "cookie-only" ||
|
|
123
|
-
authConfigs?.login?.sendAccessTokenThrough === "both" ||
|
|
124
|
-
!authConfigs?.login?.sendAccessTokenThrough)
|
|
108
|
+
else
|
|
125
109
|
res.status(200).send();
|
|
126
110
|
});
|
|
127
111
|
signup = catchAsync(async (req, res, next) => {
|
|
128
|
-
const user =
|
|
129
|
-
if (
|
|
130
|
-
res
|
|
131
|
-
req.responseData = { data: user };
|
|
132
|
-
res.locals.data = { data: user };
|
|
133
|
-
res.originalStatus = 201;
|
|
134
|
-
req.responseStatus = 201;
|
|
135
|
-
res.locals.status = 201;
|
|
112
|
+
const user = await this.callService("signup", req.body, req.prismaQueryOptions);
|
|
113
|
+
if (hasAfterHook("signup")) {
|
|
114
|
+
setHookState(req, res, { data: user }, 201);
|
|
136
115
|
return next();
|
|
137
116
|
}
|
|
138
|
-
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
139
|
-
delete user[key];
|
|
140
|
-
});
|
|
141
117
|
res.status(201).json({ data: user });
|
|
142
118
|
});
|
|
143
119
|
deleteMe = catchAsync(async (req, res, next) => {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
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;
|
|
120
|
+
const user = await this.callService("deleteMe", req.user.id, req.prismaQueryOptions);
|
|
121
|
+
if (hasAfterHook("deleteMe")) {
|
|
122
|
+
setHookState(req, res, { data: user }, 200);
|
|
153
123
|
return next();
|
|
154
124
|
}
|
|
155
|
-
Object.keys(defaultExcludedUserFields).forEach((key) => {
|
|
156
|
-
delete updatedUser[key];
|
|
157
|
-
});
|
|
158
125
|
res.status(200).json({ message: "Account deleted successfully" });
|
|
159
126
|
});
|
|
160
127
|
updatePassword = catchAsync(async (req, res, next) => {
|
|
161
|
-
const {
|
|
162
|
-
|
|
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(),
|
|
173
|
-
});
|
|
174
|
-
const token = authService.signJwtToken(user.id);
|
|
175
|
-
const cookieOptions = authService.getJwtCookieOptions(req);
|
|
176
|
-
const authConfigs = getArkosConfig()?.authentication;
|
|
128
|
+
const { accessToken } = await this.callService("updatePassword", req.user.id, req.body);
|
|
129
|
+
const delivery = resolveTokenDelivery();
|
|
177
130
|
const responseData = {
|
|
178
131
|
status: "success",
|
|
179
132
|
message: "Password updated successfully!",
|
|
180
133
|
};
|
|
181
|
-
if (
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
|
|
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;
|
|
134
|
+
if (delivery.inResponse)
|
|
135
|
+
responseData.accessToken = accessToken;
|
|
136
|
+
if (delivery.inCookie)
|
|
137
|
+
res.cookie("arkos_access_token", accessToken, authService.getJwtCookieOptions(req));
|
|
138
|
+
req.accessToken = accessToken;
|
|
139
|
+
if (hasAfterHook("updatePassword")) {
|
|
140
|
+
req.additionalData = { user: req.user };
|
|
141
|
+
setHookState(req, res, responseData, 200);
|
|
199
142
|
return next();
|
|
200
143
|
}
|
|
201
144
|
res.status(200).json(responseData);
|
|
@@ -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 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"]}
|
|
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, { AuthService } from \"./auth.service\";\nimport { getArkosConfig } from \"../../server\";\nimport { determineUsernameField } from \"./utils/helpers/auth.controller.helpers\";\nimport authActionService from \"./utils/services/auth-action.service\";\nimport {\n OperationByModule,\n routeHookReader,\n} from \"../../components/arkos-route-hook/reader\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n LoginInput,\n LoginUsernameField,\n OverridableAuthMethod,\n} from \"./auth.types\";\n\n/**\n * Default fields to exclude from user object when returning to client\n */\nexport const defaultExcludedUserFields = {\n password: false,\n};\n\nconst hasRequiredData: Record<OverridableAuthMethod, (result: any) => boolean> =\n {\n getMe: (result) => !!result,\n updateMe: (result) => !!result,\n signup: (result) => !!result,\n deleteMe: (result) => !!result,\n login: (result) => !!result?.user && !!result?.accessToken,\n updatePassword: (result) => !!result?.accessToken,\n logout: () => true,\n };\n\nconst resolveTokenDelivery = () => {\n const sendAccessTokenThrough =\n getArkosConfig()?.authentication?.login?.sendAccessTokenThrough;\n\n return {\n inResponse:\n !sendAccessTokenThrough ||\n sendAccessTokenThrough === \"both\" ||\n sendAccessTokenThrough === \"response-only\",\n inCookie:\n !sendAccessTokenThrough ||\n sendAccessTokenThrough === \"both\" ||\n sendAccessTokenThrough === \"cookie-only\",\n };\n};\n\nconst setHookState = (\n req: ArkosRequest,\n res: ArkosResponse,\n data: any,\n status: number\n) => {\n (res as any).originalData = data;\n req.responseData = data;\n res.locals.data = data;\n (res as any).originalStatus = status;\n req.responseStatus = status;\n res.locals.status = status;\n};\n\nconst hasAfterHook = (operation: OperationByModule<\"auth\">) =>\n !!routeHookReader.getHooks(\"auth\", operation)?.after;\n\n/**\n * Authentication controller class handling all auth-related operations\n */\nexport class AuthController {\n /**\n * Resolves the `AuthService` to use, an instance passed as `service` through\n * `ArkosRouteHook(\"auth\", { service })` takes precedence over the default one.\n */\n private getAuthService(): AuthService {\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\") as any;\n const service = routeHook?._configs?.service as AuthService | undefined;\n\n if (service && !(service instanceof AuthService))\n throw new Error(\n \"ValidationError: The `service` passed to ArkosRouteHook(\\\"auth\\\") must be an instance of a class that extends AuthService.\"\n );\n\n return service ?? authService;\n }\n\n private async callService<M extends OverridableAuthMethod>(\n method: M,\n ...args: Parameters<AuthService[M]>\n ): Promise<Awaited<ReturnType<AuthService[M]>>> {\n const auth = this.getAuthService();\n const result = await (auth[method] as (...params: any[]) => any).apply(\n auth,\n args\n );\n\n if (auth !== authService && !hasRequiredData[method](result))\n throw new Error(\n `Custom auth service method ${method} didn't return the required data`\n );\n\n return result;\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.callService(\n \"getMe\",\n req.user!.id,\n req.prismaQueryOptions\n );\n\n if (hasAfterHook(\"getMe\")) {\n setHookState(req, res, { data: user }, 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 const user = await this.callService(\n \"updateMe\",\n req.user!.id,\n req.body,\n req.prismaQueryOptions\n );\n\n if (hasAfterHook(\"updateMe\")) {\n setHookState(req, res, { data: user }, 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 if (!req.user?.id || !req.accessToken)\n throw new AppError(\n \"Logout requires an authenticated user and an access token\",\n 401,\n \"UnauthenticatedLogout\"\n );\n\n await this.callService(\"logout\", req.user.id, req.accessToken);\n\n res.cookie(\"arkos_access_token\", \"no-token\", {\n expires: new Date(Date.now() + 10 * 1000),\n httpOnly: true,\n });\n\n if (hasAfterHook(\"logout\")) {\n setHookState(req, res, null, 204);\n return next();\n }\n\n res.status(204).json();\n }\n );\n\n /**\n * Authenticates a user using configurable username field and password\n * Username field can be specified in query parameter or config\n *\n * Supports nested fields and array queries (e.g., \"profile.nickname\", \"phones.some.number\")\n */\n login = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const usernameField = determineUsernameField(req) as LoginUsernameField;\n\n const { user, accessToken } = await this.callService(\n \"login\",\n { ...req.body, usernameField } as LoginInput,\n req.prismaQueryOptions\n );\n\n const delivery = resolveTokenDelivery();\n\n if (delivery.inResponse) {\n req.responseData = { accessToken };\n res.locals.data = { accessToken };\n }\n\n if (delivery.inCookie)\n res.cookie(\n \"arkos_access_token\",\n accessToken,\n authService.getJwtCookieOptions(req)\n );\n\n req.accessToken = accessToken;\n\n if (hasAfterHook(\"login\")) {\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 (delivery.inResponse) res.status(200).json(req.responseData);\n else 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.callService(\n \"signup\",\n req.body,\n req.prismaQueryOptions\n );\n\n if (hasAfterHook(\"signup\")) {\n setHookState(req, res, { data: user }, 201);\n return next();\n }\n\n res.status(201).json({ data: user });\n }\n );\n\n /**\n * Marks user account as self-deleted by setting deletedSelfAccountAt timestamp\n */\n deleteMe = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const user = await this.callService(\n \"deleteMe\",\n req.user!.id,\n req.prismaQueryOptions\n );\n\n if (hasAfterHook(\"deleteMe\")) {\n setHookState(req, res, { data: user }, 200);\n return next();\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 { accessToken } = await this.callService(\n \"updatePassword\",\n req.user!.id,\n req.body\n );\n\n const delivery = resolveTokenDelivery();\n\n const responseData: Record<string, string> = {\n status: \"success\",\n message: \"Password updated successfully!\",\n };\n\n if (delivery.inResponse) responseData.accessToken = accessToken;\n\n if (delivery.inCookie)\n res.cookie(\n \"arkos_access_token\",\n accessToken,\n authService.getJwtCookieOptions(req)\n );\n\n req.accessToken = accessToken;\n\n if (hasAfterHook(\"updatePassword\")) {\n req.additionalData = { user: req.user };\n setHookState(req, res, responseData, 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"]}
|
|
@@ -2,7 +2,7 @@ import { addPrismaQueryOptionsToRequest, sendResponse, } from "../base/base.midd
|
|
|
2
2
|
import { processMiddleware } from "../../utils/helpers/routers.helpers.js";
|
|
3
3
|
import ArkosRouter from "../../utils/arkos-router/index.js";
|
|
4
4
|
import loadableRegistry from "../../components/arkos-loadable-registry/index.js";
|
|
5
|
-
import { routeHookReader } from "../../components/arkos-route-hook/reader.js";
|
|
5
|
+
import { routeHookReader, } from "../../components/arkos-route-hook/reader.js";
|
|
6
6
|
import authController from "./auth.controller.js";
|
|
7
7
|
import authOpenAPIGenerator from "./utils/auth-openapi-generator.js";
|
|
8
8
|
import { getPrismaInstance } from "../../utils/helpers/prisma.helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\nimport { ArkosAuthRouteHookInstance } from \"../../components/arkos-route-hook/types\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n if (!getPrismaInstance()) return router;\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (\n operation: keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\">\n ) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n authentication: true,\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n OperationByModule,\n routeHookReader,\n} from \"../../components/arkos-route-hook/reader\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n if (!getPrismaInstance()) return router;\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (operation: OperationByModule<\"auth\">) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n authentication: true,\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
@@ -4,15 +4,24 @@ import catchAsync from '../error-handler/utils/catch-async.js';
|
|
|
4
4
|
import AppError from '../error-handler/utils/app-error.js';
|
|
5
5
|
import arkosEnv from '../../utils/arkos-env.js';
|
|
6
6
|
import { getPrismaInstance } from '../../utils/helpers/prisma.helpers.js';
|
|
7
|
-
import { toMs } from './utils/helpers/auth.controller.helpers.js';
|
|
7
|
+
import { toMs, createPrismaWhereClause, getDefaultUsernameField, } from './utils/helpers/auth.controller.helpers.js';
|
|
8
|
+
import { ArkosPrismaService } from '../base/base.service.js';
|
|
8
9
|
import { invaliAuthTokenError, loginRequiredError, } from './utils/auth-error-objects.js';
|
|
9
10
|
import authActionService from './utils/services/auth-action.service.js';
|
|
10
11
|
import { getArkosConfig, isAuthenticationEnabled, isUsingAuthentication, } from '../../utils/helpers/arkos-config.helpers.js';
|
|
11
12
|
import { getUserFileExtension } from '../../utils/helpers/fs.helpers.js';
|
|
12
13
|
import { authenticationDocsLinks } from './utils/docs-links.js';
|
|
13
14
|
import authHookManager from './utils/auth-hooks-manager.js';
|
|
15
|
+
import { resolveRequestToken, resolveSocketToken, } from './utils/token-extraction.js';
|
|
16
|
+
import { BadRequestError, UnauthorizedError, } from '../error-handler/utils/errors.js';
|
|
14
17
|
export class AuthService {
|
|
15
18
|
actionsPerResource = {};
|
|
19
|
+
_userService;
|
|
20
|
+
get userService() {
|
|
21
|
+
if (!this._userService)
|
|
22
|
+
this._userService = new ArkosPrismaService('user');
|
|
23
|
+
return this._userService;
|
|
24
|
+
}
|
|
16
25
|
signJwtToken(id, expiresIn, secret) {
|
|
17
26
|
const { authentication: configs } = getArkosConfig();
|
|
18
27
|
if (process.env.ARKOS_BUILD === 'true' &&
|
|
@@ -167,21 +176,90 @@ export class AuthService {
|
|
|
167
176
|
return userPermission.effect === 'Allow';
|
|
168
177
|
return !!hasRolePermission;
|
|
169
178
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
sanitizeUser(user) {
|
|
180
|
+
const { password: _password, ...sanitized } = user;
|
|
181
|
+
return sanitized;
|
|
182
|
+
}
|
|
183
|
+
withPasswordIncluded(queryOptions) {
|
|
184
|
+
const options = { ...(queryOptions || {}) };
|
|
185
|
+
if (options.select)
|
|
186
|
+
options.select = { ...options.select, password: true };
|
|
187
|
+
if (options.omit) {
|
|
188
|
+
const { password: _password, ...omit } = options.omit;
|
|
189
|
+
options.omit = omit;
|
|
190
|
+
}
|
|
191
|
+
return options;
|
|
192
|
+
}
|
|
193
|
+
async getMe(userId, queryOptions) {
|
|
194
|
+
const user = await this.userService.findOne({ id: userId }, queryOptions || {});
|
|
195
|
+
return user ? this.sanitizeUser(user) : null;
|
|
196
|
+
}
|
|
197
|
+
async updateMe(userId, data, queryOptions) {
|
|
198
|
+
if ("password" in data)
|
|
199
|
+
throw new BadRequestError("In order to update password use the update-password endpoint.", "InvalidFieldPassword");
|
|
200
|
+
const user = await this.userService.updateOne({ id: userId }, data, queryOptions || {});
|
|
201
|
+
return this.sanitizeUser(user);
|
|
202
|
+
}
|
|
203
|
+
async signup(data, queryOptions) {
|
|
204
|
+
const user = await this.userService.createOne(data, queryOptions || {});
|
|
205
|
+
return this.sanitizeUser(user);
|
|
206
|
+
}
|
|
207
|
+
async deleteMe(userId, queryOptions) {
|
|
208
|
+
const user = await this.userService.updateOne({ id: userId }, { deletedSelfAccountAt: new Date().toISOString() }, queryOptions || {});
|
|
209
|
+
return this.sanitizeUser(user);
|
|
181
210
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
211
|
+
async login(input, queryOptions) {
|
|
212
|
+
const { password } = input;
|
|
213
|
+
const usernameField = input.usernameField ||
|
|
214
|
+
Object.keys(input).find((key) => key !== "password" && key !== "usernameField") ||
|
|
215
|
+
getDefaultUsernameField();
|
|
216
|
+
const allowedUsernames = getArkosConfig()?.authentication?.login?.allowedUsernames;
|
|
217
|
+
if (allowedUsernames?.length && !allowedUsernames.includes(usernameField))
|
|
218
|
+
throw new BadRequestError(`Invalid username field, expected one of: ${allowedUsernames.join(", ")}`, "InvalidUsernameField");
|
|
219
|
+
const lastField = usernameField.split(".").pop();
|
|
220
|
+
const username = input[lastField];
|
|
221
|
+
if (!username || !password)
|
|
222
|
+
throw new BadRequestError(`Please provide both ${lastField} and password`, `MissingCredentialFields`);
|
|
223
|
+
const user = (await this.userService.findOne(createPrismaWhereClause(usernameField, username), this.withPasswordIncluded(queryOptions)));
|
|
224
|
+
if (!user || !(await this.isCorrectPassword(password, user.password)))
|
|
225
|
+
throw new UnauthorizedError(`Incorrect ${lastField} or password`, `IncorrectCredentials`);
|
|
226
|
+
return {
|
|
227
|
+
user: this.sanitizeUser(user),
|
|
228
|
+
accessToken: this.signJwtToken(user.id),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async updatePassword(userId, input) {
|
|
232
|
+
const { currentPassword, newPassword } = input;
|
|
233
|
+
if (!currentPassword || !newPassword)
|
|
234
|
+
throw new AppError("currentPassword and newPassword are required", 400, "SameCurrentAndNewPassword");
|
|
235
|
+
const user = (await this.userService.findOne({ id: userId }, this.withPasswordIncluded()));
|
|
236
|
+
if (!user || user.isActive === false || user.deletedSelfAccountAt)
|
|
237
|
+
throw new AppError("User not found!", 404);
|
|
238
|
+
if (!(await this.isCorrectPassword(String(currentPassword), String(user.password))))
|
|
239
|
+
throw new AppError("Current password is incorrect", 400, "IncorrentCurrentPassword");
|
|
240
|
+
await this.userService.updateOne({ id: userId }, {
|
|
241
|
+
password: await this.hashPassword(String(newPassword)),
|
|
242
|
+
passwordChangedAt: new Date(Date.now()).toISOString(),
|
|
243
|
+
});
|
|
244
|
+
return { accessToken: this.signJwtToken(userId) };
|
|
245
|
+
}
|
|
246
|
+
async logout(_userId, _accessToken) { }
|
|
247
|
+
extractRequestToken(req, cookie = "arkos_access_token") {
|
|
248
|
+
return resolveRequestToken({
|
|
249
|
+
authorization: req?.headers?.authorization,
|
|
250
|
+
cookies: req?.cookies,
|
|
251
|
+
cookieName: cookie,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
extractSocketToken(socket, key = "token") {
|
|
255
|
+
const requestCookie = socket.request?.headers?.cookie;
|
|
256
|
+
return resolveSocketToken({
|
|
257
|
+
auth: socket.handshake?.auth,
|
|
258
|
+
key,
|
|
259
|
+
headers: socket.handshake?.headers,
|
|
260
|
+
cookies: socket.handshake?.cookies,
|
|
261
|
+
cookieHeader: requestCookie,
|
|
262
|
+
});
|
|
185
263
|
}
|
|
186
264
|
async validateDecodedUser(decoded, action = 'default') {
|
|
187
265
|
const prisma = getPrismaInstance();
|