@intlayer/backend 3.0.3 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/controllers/dictionary.controller.cjs +91 -18
- package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
- package/dist/cjs/controllers/organization.controller.cjs +140 -12
- package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
- package/dist/cjs/controllers/project.controller.cjs +181 -31
- package/dist/cjs/controllers/project.controller.cjs.map +1 -1
- package/dist/cjs/controllers/projectAccessKey.controller.cjs +61 -10
- package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
- package/dist/cjs/controllers/sessionAuth.controller.cjs +291 -62
- package/dist/cjs/controllers/sessionAuth.controller.cjs.map +1 -1
- package/dist/cjs/controllers/stripe.controller.cjs +84 -0
- package/dist/cjs/controllers/stripe.controller.cjs.map +1 -0
- package/dist/cjs/controllers/user.controller.cjs +49 -20
- package/dist/cjs/controllers/user.controller.cjs.map +1 -1
- package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +182 -0
- package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +1 -0
- package/dist/cjs/emails/SubscriptionPaymentError.cjs +182 -0
- package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +1 -0
- package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +188 -0
- package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +1 -0
- package/dist/cjs/export.cjs.map +1 -1
- package/dist/cjs/index.cjs +16 -5
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/middlewares/oAuth2.middleware.cjs +10 -0
- package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +1 -1
- package/dist/cjs/middlewares/sessionAuth.middleware.cjs +50 -10
- package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +1 -1
- package/dist/cjs/routes/dictionary.routes.cjs +2 -62
- package/dist/cjs/routes/dictionary.routes.cjs.map +1 -1
- package/dist/cjs/routes/organization.routes.cjs +1 -25
- package/dist/cjs/routes/organization.routes.cjs.map +1 -1
- package/dist/cjs/routes/project.routes.cjs +10 -85
- package/dist/cjs/routes/project.routes.cjs.map +1 -1
- package/dist/cjs/routes/sessionAuth.routes.cjs +26 -25
- package/dist/cjs/routes/sessionAuth.routes.cjs.map +1 -1
- package/dist/cjs/routes/stripe.routes.cjs +42 -0
- package/dist/cjs/routes/stripe.routes.cjs.map +1 -0
- package/dist/cjs/routes/user.routes.cjs +6 -27
- package/dist/cjs/routes/user.routes.cjs.map +1 -1
- package/dist/cjs/schemas/organization.schema.cjs +5 -0
- package/dist/cjs/schemas/organization.schema.cjs.map +1 -1
- package/dist/cjs/{middlewares/admin.middleware.cjs → schemas/plans.schema.cjs} +32 -20
- package/dist/cjs/schemas/plans.schema.cjs.map +1 -0
- package/dist/cjs/schemas/project.schema.cjs +14 -1
- package/dist/cjs/schemas/project.schema.cjs.map +1 -1
- package/dist/cjs/schemas/user.schema.cjs +5 -1
- package/dist/cjs/schemas/user.schema.cjs.map +1 -1
- package/dist/cjs/services/dictionary.service.cjs.map +1 -1
- package/dist/cjs/services/email.service.cjs +113 -43
- package/dist/cjs/services/email.service.cjs.map +1 -1
- package/dist/cjs/services/oAuth2.service.cjs +16 -8
- package/dist/cjs/services/oAuth2.service.cjs.map +1 -1
- package/dist/cjs/services/organization.service.cjs +63 -8
- package/dist/cjs/services/organization.service.cjs.map +1 -1
- package/dist/cjs/services/project.service.cjs +9 -5
- package/dist/cjs/services/project.service.cjs.map +1 -1
- package/dist/cjs/services/projectAccessKey.service.cjs +42 -10
- package/dist/cjs/services/projectAccessKey.service.cjs.map +1 -1
- package/dist/cjs/services/sessionAuth.service.cjs +9 -11
- package/dist/cjs/services/sessionAuth.service.cjs.map +1 -1
- package/dist/cjs/services/subscription.service.cjs +201 -0
- package/dist/cjs/services/subscription.service.cjs.map +1 -0
- package/dist/cjs/services/user.service.cjs +1 -3
- package/dist/cjs/services/user.service.cjs.map +1 -1
- package/dist/cjs/types/dictionary.types.cjs.map +1 -1
- package/dist/cjs/types/organization.types.cjs.map +1 -1
- package/dist/cjs/types/plan.types.cjs +17 -0
- package/dist/cjs/types/plan.types.cjs.map +1 -0
- package/dist/cjs/types/project.types.cjs.map +1 -1
- package/dist/cjs/types/session.types.cjs.map +1 -1
- package/dist/cjs/types/user.types.cjs.map +1 -1
- package/dist/cjs/utils/errors/ErrorHandler.cjs +29 -9
- package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -1
- package/dist/cjs/utils/errors/ErrorsClass.cjs +17 -3
- package/dist/cjs/utils/errors/ErrorsClass.cjs.map +1 -1
- package/dist/cjs/utils/errors/errorCodes.cjs +321 -9
- package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
- package/dist/cjs/utils/mapper/organization.cjs.map +1 -1
- package/dist/cjs/utils/mapper/project.cjs +19 -3
- package/dist/cjs/utils/mapper/project.cjs.map +1 -1
- package/dist/cjs/utils/mapper/user.cjs.map +1 -1
- package/dist/cjs/utils/plan.cjs +75 -0
- package/dist/cjs/utils/plan.cjs.map +1 -0
- package/dist/cjs/utils/responseData.cjs +8 -0
- package/dist/cjs/utils/responseData.cjs.map +1 -1
- package/dist/cjs/webhooks/stripe.webhook.cjs +133 -0
- package/dist/cjs/webhooks/stripe.webhook.cjs.map +1 -0
- package/dist/esm/controllers/dictionary.controller.mjs +91 -18
- package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
- package/dist/esm/controllers/organization.controller.mjs +140 -12
- package/dist/esm/controllers/organization.controller.mjs.map +1 -1
- package/dist/esm/controllers/project.controller.mjs +181 -31
- package/dist/esm/controllers/project.controller.mjs.map +1 -1
- package/dist/esm/controllers/projectAccessKey.controller.mjs +61 -10
- package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
- package/dist/esm/controllers/sessionAuth.controller.mjs +287 -61
- package/dist/esm/controllers/sessionAuth.controller.mjs.map +1 -1
- package/dist/esm/controllers/stripe.controller.mjs +60 -0
- package/dist/esm/controllers/stripe.controller.mjs.map +1 -0
- package/dist/esm/controllers/user.controller.mjs +49 -20
- package/dist/esm/controllers/user.controller.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentCancellation.mjs +168 -0
- package/dist/esm/emails/SubscriptionPaymentCancellation.mjs.map +1 -0
- package/dist/esm/emails/SubscriptionPaymentError.mjs +168 -0
- package/dist/esm/emails/SubscriptionPaymentError.mjs.map +1 -0
- package/dist/esm/emails/SubscriptionPaymentSuccess.mjs +174 -0
- package/dist/esm/emails/SubscriptionPaymentSuccess.mjs.map +1 -0
- package/dist/esm/export.mjs.map +1 -1
- package/dist/esm/index.mjs +19 -7
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/middlewares/oAuth2.middleware.mjs +10 -0
- package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -1
- package/dist/esm/middlewares/sessionAuth.middleware.mjs +49 -9
- package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -1
- package/dist/esm/routes/dictionary.routes.mjs +2 -62
- package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
- package/dist/esm/routes/organization.routes.mjs +1 -25
- package/dist/esm/routes/organization.routes.mjs.map +1 -1
- package/dist/esm/routes/project.routes.mjs +10 -85
- package/dist/esm/routes/project.routes.mjs.map +1 -1
- package/dist/esm/routes/sessionAuth.routes.mjs +29 -26
- package/dist/esm/routes/sessionAuth.routes.mjs.map +1 -1
- package/dist/esm/routes/stripe.routes.mjs +17 -0
- package/dist/esm/routes/stripe.routes.mjs.map +1 -0
- package/dist/esm/routes/user.routes.mjs +6 -27
- package/dist/esm/routes/user.routes.mjs.map +1 -1
- package/dist/esm/schemas/organization.schema.mjs +5 -0
- package/dist/esm/schemas/organization.schema.mjs.map +1 -1
- package/dist/esm/schemas/plans.schema.mjs +32 -0
- package/dist/esm/schemas/plans.schema.mjs.map +1 -0
- package/dist/esm/schemas/project.schema.mjs +13 -1
- package/dist/esm/schemas/project.schema.mjs.map +1 -1
- package/dist/esm/schemas/user.schema.mjs +5 -1
- package/dist/esm/schemas/user.schema.mjs.map +1 -1
- package/dist/esm/services/dictionary.service.mjs.map +1 -1
- package/dist/esm/services/email.service.mjs +125 -43
- package/dist/esm/services/email.service.mjs.map +1 -1
- package/dist/esm/services/oAuth2.service.mjs +16 -8
- package/dist/esm/services/oAuth2.service.mjs.map +1 -1
- package/dist/esm/services/organization.service.mjs +58 -7
- package/dist/esm/services/organization.service.mjs.map +1 -1
- package/dist/esm/services/project.service.mjs +9 -5
- package/dist/esm/services/project.service.mjs.map +1 -1
- package/dist/esm/services/projectAccessKey.service.mjs +42 -10
- package/dist/esm/services/projectAccessKey.service.mjs.map +1 -1
- package/dist/esm/services/sessionAuth.service.mjs +9 -10
- package/dist/esm/services/sessionAuth.service.mjs.map +1 -1
- package/dist/esm/services/subscription.service.mjs +178 -0
- package/dist/esm/services/subscription.service.mjs.map +1 -0
- package/dist/esm/services/user.service.mjs +1 -3
- package/dist/esm/services/user.service.mjs.map +1 -1
- package/dist/esm/types/plan.types.mjs +1 -0
- package/dist/esm/types/plan.types.mjs.map +1 -0
- package/dist/esm/utils/errors/ErrorHandler.mjs +29 -9
- package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
- package/dist/esm/utils/errors/ErrorsClass.mjs +17 -3
- package/dist/esm/utils/errors/ErrorsClass.mjs.map +1 -1
- package/dist/esm/utils/errors/errorCodes.mjs +321 -9
- package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
- package/dist/esm/utils/mapper/organization.mjs.map +1 -1
- package/dist/esm/utils/mapper/project.mjs +17 -2
- package/dist/esm/utils/mapper/project.mjs.map +1 -1
- package/dist/esm/utils/mapper/user.mjs.map +1 -1
- package/dist/esm/utils/plan.mjs +50 -0
- package/dist/esm/utils/plan.mjs.map +1 -0
- package/dist/esm/utils/responseData.mjs +8 -0
- package/dist/esm/utils/responseData.mjs.map +1 -1
- package/dist/esm/webhooks/stripe.webhook.mjs +113 -0
- package/dist/esm/webhooks/stripe.webhook.mjs.map +1 -0
- package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
- package/dist/types/controllers/organization.controller.d.ts.map +1 -1
- package/dist/types/controllers/project.controller.d.ts +9 -7
- package/dist/types/controllers/project.controller.d.ts.map +1 -1
- package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
- package/dist/types/controllers/sessionAuth.controller.d.ts +28 -9
- package/dist/types/controllers/sessionAuth.controller.d.ts.map +1 -1
- package/dist/types/controllers/stripe.controller.d.ts +17 -0
- package/dist/types/controllers/stripe.controller.d.ts.map +1 -0
- package/dist/types/controllers/user.controller.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +20 -0
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -0
- package/dist/types/emails/SubscriptionPaymentError.d.ts +20 -0
- package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -0
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +20 -0
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -0
- package/dist/types/export.d.ts +2 -0
- package/dist/types/export.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -1
- package/dist/types/middlewares/sessionAuth.middleware.d.ts +13 -7
- package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
- package/dist/types/models/dictionary.model.d.ts +1 -1
- package/dist/types/models/oAuth2.model.d.ts +1 -1
- package/dist/types/models/organization.model.d.ts +2 -1
- package/dist/types/models/organization.model.d.ts.map +1 -1
- package/dist/types/models/plan.moddel.d.ts +11 -0
- package/dist/types/models/plan.moddel.d.ts.map +1 -0
- package/dist/types/models/project.model.d.ts +1 -1
- package/dist/types/routes/dictionary.routes.d.ts.map +1 -1
- package/dist/types/routes/organization.routes.d.ts.map +1 -1
- package/dist/types/routes/project.routes.d.ts.map +1 -1
- package/dist/types/routes/sessionAuth.routes.d.ts +15 -2
- package/dist/types/routes/sessionAuth.routes.d.ts.map +1 -1
- package/dist/types/routes/stripe.routes.d.ts +10 -0
- package/dist/types/routes/stripe.routes.d.ts.map +1 -0
- package/dist/types/routes/user.routes.d.ts.map +1 -1
- package/dist/types/schemas/dictionary.schema.d.ts +2 -2
- package/dist/types/schemas/oAuth2.schema.d.ts +2 -2
- package/dist/types/schemas/organization.schema.d.ts +3 -2
- package/dist/types/schemas/organization.schema.d.ts.map +1 -1
- package/dist/types/schemas/plans.schema.d.ts +16 -0
- package/dist/types/schemas/plans.schema.d.ts.map +1 -0
- package/dist/types/schemas/project.schema.d.ts +12 -3
- package/dist/types/schemas/project.schema.d.ts.map +1 -1
- package/dist/types/schemas/user.schema.d.ts +2 -2
- package/dist/types/schemas/user.schema.d.ts.map +1 -1
- package/dist/types/services/dictionary.service.d.ts +9 -9
- package/dist/types/services/dictionary.service.d.ts.map +1 -1
- package/dist/types/services/email.service.d.ts +33 -4
- package/dist/types/services/email.service.d.ts.map +1 -1
- package/dist/types/services/oAuth2.service.d.ts +7 -5
- package/dist/types/services/oAuth2.service.d.ts.map +1 -1
- package/dist/types/services/organization.service.d.ts +27 -6
- package/dist/types/services/organization.service.d.ts.map +1 -1
- package/dist/types/services/plans.service.d.ts +35 -0
- package/dist/types/services/plans.service.d.ts.map +1 -0
- package/dist/types/services/project.service.d.ts +6 -6
- package/dist/types/services/project.service.d.ts.map +1 -1
- package/dist/types/services/projectAccessKey.service.d.ts +4 -4
- package/dist/types/services/projectAccessKey.service.d.ts.map +1 -1
- package/dist/types/services/sessionAuth.service.d.ts +9 -16
- package/dist/types/services/sessionAuth.service.d.ts.map +1 -1
- package/dist/types/services/subscription.service.d.ts +22 -0
- package/dist/types/services/subscription.service.d.ts.map +1 -0
- package/dist/types/services/user.service.d.ts +11 -19
- package/dist/types/services/user.service.d.ts.map +1 -1
- package/dist/types/types/dictionary.types.d.ts +2 -2
- package/dist/types/types/dictionary.types.d.ts.map +1 -1
- package/dist/types/types/organization.types.d.ts +4 -2
- package/dist/types/types/organization.types.d.ts.map +1 -1
- package/dist/types/types/plan.types.d.ts +18 -0
- package/dist/types/types/plan.types.d.ts.map +1 -0
- package/dist/types/types/project.types.d.ts +13 -2
- package/dist/types/types/project.types.d.ts.map +1 -1
- package/dist/types/types/session.types.d.ts +6 -6
- package/dist/types/types/session.types.d.ts.map +1 -1
- package/dist/types/types/user.types.d.ts +2 -1
- package/dist/types/types/user.types.d.ts.map +1 -1
- package/dist/types/utils/errors/ErrorHandler.d.ts +5 -3
- package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
- package/dist/types/utils/errors/ErrorsClass.d.ts +4 -1
- package/dist/types/utils/errors/ErrorsClass.d.ts.map +1 -1
- package/dist/types/utils/errors/errorCodes.d.ts +313 -1
- package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
- package/dist/types/utils/mapper/organization.d.ts +1 -1
- package/dist/types/utils/mapper/organization.d.ts.map +1 -1
- package/dist/types/utils/mapper/project.d.ts +10 -1
- package/dist/types/utils/mapper/project.d.ts.map +1 -1
- package/dist/types/utils/mapper/user.d.ts +1 -1
- package/dist/types/utils/mapper/user.d.ts.map +1 -1
- package/dist/types/utils/plan.d.ts +17 -0
- package/dist/types/utils/plan.d.ts.map +1 -0
- package/dist/types/utils/responseData.d.ts +13 -2
- package/dist/types/utils/responseData.d.ts.map +1 -1
- package/dist/types/webhooks/stripe.d.ts +3 -0
- package/dist/types/webhooks/stripe.d.ts.map +1 -0
- package/dist/types/webhooks/stripe.webhook.d.ts +3 -0
- package/dist/types/webhooks/stripe.webhook.d.ts.map +1 -0
- package/package.json +27 -24
- package/dist/cjs/middlewares/admin.middleware.cjs.map +0 -1
- package/dist/esm/middlewares/admin.middleware.mjs +0 -20
- package/dist/esm/middlewares/admin.middleware.mjs.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
1
2
|
import { logger } from './../logger/index.mjs';
|
|
2
3
|
import { sessionAuthRoutes } from './../routes/sessionAuth.routes.mjs';
|
|
3
4
|
import { sendEmail } from './../services/email.service.mjs';
|
|
@@ -6,8 +7,11 @@ import * as userService from './../services/user.service.mjs';
|
|
|
6
7
|
import { generateToken } from './../utils/CSRF.mjs';
|
|
7
8
|
import { ErrorHandler, GenericError } from './../utils/errors/index.mjs';
|
|
8
9
|
import { HttpStatusCodes } from './../utils/httpStatusCodes.mjs';
|
|
10
|
+
import { mapOrganizationToAPI } from './../utils/mapper/organization.mjs';
|
|
11
|
+
import { mapProjectToAPI } from './../utils/mapper/project.mjs';
|
|
9
12
|
import { mapUserToAPI } from './../utils/mapper/user.mjs';
|
|
10
13
|
import { formatResponse } from './../utils/responseData.mjs';
|
|
14
|
+
import { t } from "express-intlayer";
|
|
11
15
|
import { Types } from "mongoose";
|
|
12
16
|
import { v4 as uuidv4 } from "uuid";
|
|
13
17
|
const setCSRFToken = (req, res, _next) => {
|
|
@@ -20,10 +24,15 @@ const setCSRFToken = (req, res, _next) => {
|
|
|
20
24
|
};
|
|
21
25
|
const registerEmailPassword = async (req, res, _next) => {
|
|
22
26
|
const { user } = res.locals;
|
|
27
|
+
const { callBack_url } = req.query;
|
|
23
28
|
if (user) {
|
|
24
29
|
ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
|
|
25
30
|
return;
|
|
26
31
|
}
|
|
32
|
+
if (callBack_url && !callBack_url.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
33
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
27
36
|
const userData = req.body;
|
|
28
37
|
try {
|
|
29
38
|
let user2 = await userService.getUserByEmail(userData.email);
|
|
@@ -31,22 +40,18 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
31
40
|
const emailProvider = user2.provider?.find(
|
|
32
41
|
(provider) => provider.provider === "email"
|
|
33
42
|
);
|
|
34
|
-
if (emailProvider) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
secret: uuidv4()
|
|
47
|
-
}
|
|
48
|
-
);
|
|
49
|
-
}
|
|
43
|
+
if (emailProvider?.emailValidated) {
|
|
44
|
+
ErrorHandler.handleGenericErrorResponse(
|
|
45
|
+
res,
|
|
46
|
+
"EMAIL_ALREADY_REGISTERED"
|
|
47
|
+
);
|
|
48
|
+
return;
|
|
49
|
+
} else if (emailProvider) {
|
|
50
|
+
user2 = await sessionAuthService.updateUserProvider(user2._id, "email", {
|
|
51
|
+
provider: "email",
|
|
52
|
+
emailValidated: void 0,
|
|
53
|
+
secret: uuidv4()
|
|
54
|
+
});
|
|
50
55
|
} else {
|
|
51
56
|
user2 = await sessionAuthService.addUserProvider(user2._id, {
|
|
52
57
|
provider: "email",
|
|
@@ -55,7 +60,16 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
55
60
|
});
|
|
56
61
|
}
|
|
57
62
|
} else {
|
|
58
|
-
user2 = await userService.createUser(
|
|
63
|
+
user2 = await userService.createUser({
|
|
64
|
+
...userData,
|
|
65
|
+
provider: [
|
|
66
|
+
{
|
|
67
|
+
provider: "email",
|
|
68
|
+
emailValidated: void 0,
|
|
69
|
+
secret: uuidv4()
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
});
|
|
59
73
|
logger.info(`New registration: ${user2.name} - ${user2.email}`);
|
|
60
74
|
}
|
|
61
75
|
if (!user2) {
|
|
@@ -64,9 +78,30 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
64
78
|
});
|
|
65
79
|
return;
|
|
66
80
|
}
|
|
67
|
-
await
|
|
81
|
+
await sendEmail({
|
|
82
|
+
type: "validate",
|
|
83
|
+
to: user2.email,
|
|
84
|
+
username: user2.name ?? user2.email.split("@")[0],
|
|
85
|
+
validationLink: sessionAuthRoutes.validEmail.url({
|
|
86
|
+
userId: String(user2._id),
|
|
87
|
+
secret: user2.provider?.find((provider) => provider.provider === "email")?.secret ?? "",
|
|
88
|
+
callBack_url
|
|
89
|
+
})
|
|
90
|
+
});
|
|
68
91
|
const formattedUser = mapUserToAPI(user2);
|
|
69
|
-
const responseData = formatResponse({
|
|
92
|
+
const responseData = formatResponse({
|
|
93
|
+
message: t({
|
|
94
|
+
en: "User registered successfully",
|
|
95
|
+
fr: "Utilisateur enregistr\xE9 avec succ\xE8s",
|
|
96
|
+
es: "Usuario registrado con \xE9xito"
|
|
97
|
+
}),
|
|
98
|
+
description: t({
|
|
99
|
+
en: "Your user has been registered successfully. Please check your email to validate your account.",
|
|
100
|
+
fr: "Votre utilisateur a \xE9t\xE9 enregistr\xE9 avec succ\xE8s. Veuillez v\xE9rifier votre e-mail pour valider votre compte.",
|
|
101
|
+
es: "Su usuario ha sido registrado con \xE9xito. Por favor, revise su correo electr\xF3nico para validar su cuenta."
|
|
102
|
+
}),
|
|
103
|
+
data: formattedUser
|
|
104
|
+
});
|
|
70
105
|
res.json(responseData);
|
|
71
106
|
return;
|
|
72
107
|
} catch (error) {
|
|
@@ -95,7 +130,19 @@ const loginEmailPassword = async (req, res, _next) => {
|
|
|
95
130
|
}
|
|
96
131
|
await sessionAuthService.setUserAuth(res, loggedInUser);
|
|
97
132
|
const formattedUser = mapUserToAPI(loggedInUser);
|
|
98
|
-
const responseData = formatResponse({
|
|
133
|
+
const responseData = formatResponse({
|
|
134
|
+
message: t({
|
|
135
|
+
en: "User logged in successfully",
|
|
136
|
+
fr: "Utilisateur connect\xE9 avec succ\xE8s",
|
|
137
|
+
es: "Usuario conectado con \xE9xito"
|
|
138
|
+
}),
|
|
139
|
+
description: t({
|
|
140
|
+
en: "Your user has been logged in successfully",
|
|
141
|
+
fr: "Votre utilisateur a \xE9t\xE9 connect\xE9 avec succ\xE8s",
|
|
142
|
+
es: "Su usuario ha sido conectado con \xE9xito"
|
|
143
|
+
}),
|
|
144
|
+
data: formattedUser
|
|
145
|
+
});
|
|
99
146
|
logger.info(`Login: ${loggedInUser.email}`);
|
|
100
147
|
res.json(responseData);
|
|
101
148
|
return;
|
|
@@ -107,37 +154,63 @@ const loginEmailPassword = async (req, res, _next) => {
|
|
|
107
154
|
const logOut = async (_req, res, _next) => {
|
|
108
155
|
const { user } = res.locals;
|
|
109
156
|
if (!user) {
|
|
110
|
-
ErrorHandler.handleGenericErrorResponse(res, "
|
|
157
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
111
158
|
return;
|
|
112
159
|
}
|
|
113
160
|
await sessionAuthService.clearUserAuth(res);
|
|
114
161
|
sessionAuthService.clearOrganizationAuth(res);
|
|
115
162
|
sessionAuthService.clearProjectAuth(res);
|
|
116
163
|
logger.info(`Logout: ${user.name} - ${user.email}`);
|
|
117
|
-
const responseData = formatResponse({
|
|
164
|
+
const responseData = formatResponse({
|
|
165
|
+
message: t({
|
|
166
|
+
en: "User logged out successfully",
|
|
167
|
+
fr: "Utilisateur d\xE9connect\xE9 avec succ\xE8s",
|
|
168
|
+
es: "Usuario desconectado con \xE9xito"
|
|
169
|
+
}),
|
|
170
|
+
description: t({
|
|
171
|
+
en: "Your user has been logged out successfully",
|
|
172
|
+
fr: "Votre utilisateur a \xE9t\xE9 d\xE9connect\xE9 avec succ\xE8s",
|
|
173
|
+
es: "Su usuario ha sido desconectado con \xE9xito"
|
|
174
|
+
}),
|
|
175
|
+
data: void 0
|
|
176
|
+
});
|
|
118
177
|
res.json(responseData);
|
|
119
178
|
};
|
|
120
179
|
const updatePassword = async (req, res, _next) => {
|
|
121
180
|
const { oldPassword, newPassword } = req.body;
|
|
122
181
|
let { user } = res.locals;
|
|
123
182
|
if (!user) {
|
|
124
|
-
ErrorHandler.handleGenericErrorResponse(res, "
|
|
183
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
125
184
|
return;
|
|
126
185
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
186
|
+
const userEmailProvider = user.provider?.find(
|
|
187
|
+
(provider) => provider.provider === "email"
|
|
188
|
+
);
|
|
189
|
+
if (!userEmailProvider) {
|
|
190
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_PROVIDER_NOT_FOUND", {
|
|
191
|
+
provider: "email"
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (userEmailProvider.passwordHash && !oldPassword) {
|
|
196
|
+
ErrorHandler.handleGenericErrorResponse(
|
|
197
|
+
res,
|
|
198
|
+
"USER_PREVIOUS_PASSWORD_NOT_PROVIDED"
|
|
131
199
|
);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
if (oldPassword) {
|
|
204
|
+
const { error } = await sessionAuthService.testUserPassword(
|
|
205
|
+
user.email,
|
|
206
|
+
oldPassword
|
|
207
|
+
);
|
|
208
|
+
if (error) {
|
|
209
|
+
ErrorHandler.handleGenericErrorResponse(res, "LOGIN_FAILED");
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
135
212
|
}
|
|
136
|
-
user = await sessionAuthService.changeUserPassword(
|
|
137
|
-
user._id,
|
|
138
|
-
oldPassword,
|
|
139
|
-
newPassword
|
|
140
|
-
);
|
|
213
|
+
user = await sessionAuthService.changeUserPassword(user._id, newPassword);
|
|
141
214
|
if (!user || typeof user !== "object") {
|
|
142
215
|
ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
143
216
|
return;
|
|
@@ -146,7 +219,65 @@ const updatePassword = async (req, res, _next) => {
|
|
|
146
219
|
`Password changed - User : Name : ${user.name}, id : ${String(user._id)}`
|
|
147
220
|
);
|
|
148
221
|
const formattedUser = mapUserToAPI(user);
|
|
149
|
-
const responseData = formatResponse({
|
|
222
|
+
const responseData = formatResponse({
|
|
223
|
+
message: t({
|
|
224
|
+
en: "Password changed successfully",
|
|
225
|
+
fr: "Mot de passe modifi\xE9 avec succ\xE8s",
|
|
226
|
+
es: "Contrase\xF1a cambiada con \xE9xito"
|
|
227
|
+
}),
|
|
228
|
+
description: t({
|
|
229
|
+
en: "Your password has been changed successfully",
|
|
230
|
+
fr: "Votre mot de passe a \xE9t\xE9 modifi\xE9 avec succ\xE8s",
|
|
231
|
+
es: "Su contrase\xF1a ha sido cambiada con \xE9xito"
|
|
232
|
+
}),
|
|
233
|
+
data: formattedUser
|
|
234
|
+
});
|
|
235
|
+
res.json(responseData);
|
|
236
|
+
return;
|
|
237
|
+
} catch (error) {
|
|
238
|
+
ErrorHandler.handleAppErrorResponse(res, error);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
let clients = [];
|
|
243
|
+
const sendVerificationUpdate = (user) => {
|
|
244
|
+
const filteredClients = clients.filter(
|
|
245
|
+
(client) => String(client.userId) === String(user._id)
|
|
246
|
+
);
|
|
247
|
+
for (const client of filteredClients) {
|
|
248
|
+
const provider = user.provider?.find(
|
|
249
|
+
(provider2) => provider2.provider === "email"
|
|
250
|
+
);
|
|
251
|
+
if (provider?.emailValidated) {
|
|
252
|
+
client.res.write(
|
|
253
|
+
`data: ${JSON.stringify({ userId: user._id, status: "verified" })}
|
|
254
|
+
|
|
255
|
+
`
|
|
256
|
+
);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
client.res.write(
|
|
260
|
+
`data: ${JSON.stringify({ userId: user._id, status: "waiting" })}
|
|
261
|
+
|
|
262
|
+
`
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const checkIfUserHasPassword = async (_req, res, _next) => {
|
|
267
|
+
const { user } = res.locals;
|
|
268
|
+
if (!user) {
|
|
269
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
const userProvider = user.provider?.find(
|
|
274
|
+
(provider) => provider.provider === "email"
|
|
275
|
+
);
|
|
276
|
+
const responseData = formatResponse({
|
|
277
|
+
data: {
|
|
278
|
+
hasPassword: Boolean(userProvider?.passwordHash)
|
|
279
|
+
}
|
|
280
|
+
});
|
|
150
281
|
res.json(responseData);
|
|
151
282
|
return;
|
|
152
283
|
} catch (error) {
|
|
@@ -156,33 +287,75 @@ const updatePassword = async (req, res, _next) => {
|
|
|
156
287
|
};
|
|
157
288
|
const validEmail = async (req, res, _next) => {
|
|
158
289
|
const { userId, secret } = req.params;
|
|
159
|
-
const
|
|
290
|
+
const callBack_url = `${req.query.callBack_url ?? `${process.env.CLIENT_URL}/auth/login`}?userId=${userId}`;
|
|
160
291
|
if (!Types.ObjectId.isValid(userId.toString())) {
|
|
161
292
|
ErrorHandler.handleGenericErrorResponse(res, "INVALID_USER_ID");
|
|
162
293
|
return;
|
|
163
294
|
}
|
|
164
|
-
if (!organization) {
|
|
165
|
-
ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
295
|
const user = await userService.getUserById(userId);
|
|
169
296
|
if (!user) {
|
|
170
|
-
ErrorHandler.handleGenericErrorResponse(res, "
|
|
297
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED", {
|
|
298
|
+
userId
|
|
299
|
+
});
|
|
171
300
|
return;
|
|
172
301
|
}
|
|
173
|
-
|
|
302
|
+
if (callBack_url && !callBack_url.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
303
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const provider = user.provider?.find(
|
|
307
|
+
(provider2) => provider2.provider === "email"
|
|
308
|
+
);
|
|
309
|
+
if (provider?.emailValidated) {
|
|
310
|
+
res.redirect(callBack_url);
|
|
311
|
+
}
|
|
312
|
+
if (!provider?.secret) {
|
|
313
|
+
throw new GenericError("USER_PROVIDER_SECRET_NOT_DEFINED", { userId });
|
|
314
|
+
}
|
|
315
|
+
if (!crypto.timingSafeEqual(Buffer.from(provider.secret), Buffer.from(secret))) {
|
|
316
|
+
throw new GenericError("USER_PROVIDER_SECRET_NOT_VALID", { userId });
|
|
317
|
+
}
|
|
318
|
+
await sessionAuthService.updateUserProvider(userId, "email", {
|
|
319
|
+
secret: void 0,
|
|
320
|
+
emailValidated: /* @__PURE__ */ new Date()
|
|
321
|
+
});
|
|
174
322
|
logger.info(
|
|
175
323
|
`User activated - User: Name: ${user.name}, id: ${String(user._id)}`
|
|
176
324
|
);
|
|
325
|
+
sendVerificationUpdate(user);
|
|
326
|
+
await sessionAuthService.setUserAuth(res, user);
|
|
177
327
|
await sendEmail({
|
|
178
328
|
type: "welcome",
|
|
179
329
|
to: user.email,
|
|
180
330
|
username: user.name,
|
|
181
|
-
loginLink:
|
|
331
|
+
loginLink: callBack_url
|
|
332
|
+
});
|
|
333
|
+
res.redirect(callBack_url);
|
|
334
|
+
};
|
|
335
|
+
const verifyEmailStatusSSE = async (req, res) => {
|
|
336
|
+
res.setHeader("Content-Type", "text/event-stream;charset=utf-8");
|
|
337
|
+
res.setHeader("Cache-Control", "no-cache, no-transform");
|
|
338
|
+
res.setHeader("Connection", "keep-alive");
|
|
339
|
+
res.setHeader("X-Accel-Buffering", "no");
|
|
340
|
+
res.write(":\n\n");
|
|
341
|
+
res.flushHeaders();
|
|
342
|
+
const { userId } = req.params;
|
|
343
|
+
const clientId = Date.now();
|
|
344
|
+
const user = await userService.getUserById(userId);
|
|
345
|
+
if (!user) {
|
|
346
|
+
logger.error(`User not found - User ID: ${userId}`);
|
|
347
|
+
res.write(`data: ${JSON.stringify({ userId, status: "error" })}
|
|
348
|
+
|
|
349
|
+
`);
|
|
350
|
+
res.end();
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const newClient = { id: clientId, userId, res };
|
|
354
|
+
clients.push(newClient);
|
|
355
|
+
sendVerificationUpdate(user);
|
|
356
|
+
req.on("close", () => {
|
|
357
|
+
clients = clients.filter((client) => client.id !== clientId);
|
|
182
358
|
});
|
|
183
|
-
const formattedUser = mapUserToAPI(user);
|
|
184
|
-
const responseData = formatResponse({ data: formattedUser });
|
|
185
|
-
res.json(responseData);
|
|
186
359
|
};
|
|
187
360
|
const askResetPassword = async (req, res, _next) => {
|
|
188
361
|
const { email } = req.body;
|
|
@@ -210,7 +383,19 @@ const askResetPassword = async (req, res, _next) => {
|
|
|
210
383
|
)?.secret ?? ""
|
|
211
384
|
})
|
|
212
385
|
});
|
|
213
|
-
const responseData = formatResponse({
|
|
386
|
+
const responseData = formatResponse({
|
|
387
|
+
message: t({
|
|
388
|
+
en: "Password reset request sent successfully",
|
|
389
|
+
fr: "Demande de r\xE9initialisation de mot de passe envoy\xE9e avec succ\xE8s",
|
|
390
|
+
es: "Solicitud de restablecimiento de contrase\xF1a enviada con \xE9xito"
|
|
391
|
+
}),
|
|
392
|
+
description: t({
|
|
393
|
+
en: "Your password reset request has been sent successfully. Please check your email to reset your password.",
|
|
394
|
+
fr: "Votre demande de r\xE9initialisation de mot de passe a \xE9t\xE9 envoy\xE9e avec succ\xE8s. Veuillez v\xE9rifier votre e-mail pour r\xE9initialiser votre mot de passe.",
|
|
395
|
+
es: "Su solicitud de restablecimiento de contrase\xF1a ha sido enviada con \xE9xito. Por favor, revise su correo electr\xF3nico para restablecer su contrase\xF1a."
|
|
396
|
+
}),
|
|
397
|
+
data: void 0
|
|
398
|
+
});
|
|
214
399
|
res.json(responseData);
|
|
215
400
|
return;
|
|
216
401
|
} catch (error) {
|
|
@@ -245,7 +430,19 @@ const resetPassword = async (req, res, _next) => {
|
|
|
245
430
|
username: updatedUser.name
|
|
246
431
|
});
|
|
247
432
|
const formattedUser = mapUserToAPI(updatedUser);
|
|
248
|
-
const responseData = formatResponse({
|
|
433
|
+
const responseData = formatResponse({
|
|
434
|
+
message: t({
|
|
435
|
+
en: "Password reset successfully",
|
|
436
|
+
fr: "R\xE9initialisation du mot de passe r\xE9ussie",
|
|
437
|
+
es: "Restablecimiento de contrase\xF1a exitoso"
|
|
438
|
+
}),
|
|
439
|
+
description: t({
|
|
440
|
+
en: "Your password has been reset successfully. You can now log in with your new password",
|
|
441
|
+
fr: "Votre mot de passe a \xE9t\xE9 r\xE9initialis\xE9 avec succ\xE8s. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe",
|
|
442
|
+
es: "Su contrase\xF1a ha sido restablecida con \xE9xito. Ahora puede iniciar sesi\xF3n con su nueva contrase\xF1a"
|
|
443
|
+
}),
|
|
444
|
+
data: formattedUser
|
|
445
|
+
});
|
|
249
446
|
res.json(responseData);
|
|
250
447
|
return;
|
|
251
448
|
} catch (error) {
|
|
@@ -256,26 +453,35 @@ const resetPassword = async (req, res, _next) => {
|
|
|
256
453
|
const getSessionInformation = async (req, res, _next) => {
|
|
257
454
|
const { session_token: sessionToken } = req.query;
|
|
258
455
|
let { user } = res.locals;
|
|
259
|
-
const { organization, project } = res.locals;
|
|
456
|
+
const { organization, project, isOrganizationAdmin, isProjectAdmin } = res.locals;
|
|
260
457
|
try {
|
|
261
458
|
if (sessionToken) {
|
|
262
459
|
user = await userService.getUserBySession(sessionToken);
|
|
263
460
|
}
|
|
264
|
-
if (!user) {
|
|
265
|
-
|
|
461
|
+
if (!user || !user?.session) {
|
|
462
|
+
const responseData2 = formatResponse({
|
|
463
|
+
data: {
|
|
464
|
+
session: null,
|
|
465
|
+
user: null,
|
|
466
|
+
organization: organization?._id ? mapOrganizationToAPI(organization, isOrganizationAdmin) : null,
|
|
467
|
+
project: project?._id ? mapProjectToAPI(project, user, isProjectAdmin) : null
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
res.json(responseData2);
|
|
266
471
|
return;
|
|
267
472
|
}
|
|
268
473
|
const session = user.session;
|
|
269
|
-
if (!session) {
|
|
270
|
-
ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_FOUND");
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
474
|
const formattedUser = {
|
|
274
475
|
...mapUserToAPI(user),
|
|
275
476
|
role: "user"
|
|
276
477
|
};
|
|
277
478
|
const responseData = formatResponse({
|
|
278
|
-
data: {
|
|
479
|
+
data: {
|
|
480
|
+
session,
|
|
481
|
+
user: formattedUser,
|
|
482
|
+
organization: organization?._id ? mapOrganizationToAPI(organization, isOrganizationAdmin) : null,
|
|
483
|
+
project: project?._id ? mapProjectToAPI(project, user, isProjectAdmin) : null
|
|
484
|
+
}
|
|
279
485
|
});
|
|
280
486
|
res.json(responseData);
|
|
281
487
|
return;
|
|
@@ -291,11 +497,15 @@ const githubLoginQuery = (req, res, _next) => {
|
|
|
291
497
|
ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
|
|
292
498
|
return;
|
|
293
499
|
}
|
|
500
|
+
if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
501
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
294
504
|
const encodedOrigin = encodeURIComponent(origin);
|
|
295
505
|
const redirectURI = `${process.env.BACKEND_URL}/api/auth/callback/github?redirect_uri=${encodedOrigin}`;
|
|
296
506
|
const encodedRedirectURI = encodeURIComponent(redirectURI);
|
|
297
507
|
res.redirect(
|
|
298
|
-
`https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_CLIENT_ID}&redirect_uri=${encodedRedirectURI}`
|
|
508
|
+
`https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_CLIENT_ID}&redirect_uri=${encodedRedirectURI}&scope=user:email`
|
|
299
509
|
);
|
|
300
510
|
};
|
|
301
511
|
const githubCallback = async (req, res, _next) => {
|
|
@@ -312,6 +522,10 @@ const githubCallback = async (req, res, _next) => {
|
|
|
312
522
|
res.redirect(redirect_uri);
|
|
313
523
|
return;
|
|
314
524
|
}
|
|
525
|
+
if (redirect_uri && !redirect_uri.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
526
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
315
529
|
try {
|
|
316
530
|
const tokenResponse = await fetch(
|
|
317
531
|
"https://github.com/login/oauth/access_token",
|
|
@@ -409,7 +623,7 @@ const githubCallback = async (req, res, _next) => {
|
|
|
409
623
|
type: "welcome",
|
|
410
624
|
to: user.email,
|
|
411
625
|
username: user.name,
|
|
412
|
-
loginLink:
|
|
626
|
+
loginLink: `${process.env.CLIENT_URL}/auth/login`
|
|
413
627
|
});
|
|
414
628
|
res.redirect(redirect_uri);
|
|
415
629
|
} catch (error) {
|
|
@@ -426,6 +640,10 @@ const googleLoginQuery = (req, res, _next) => {
|
|
|
426
640
|
res.redirect(origin);
|
|
427
641
|
return;
|
|
428
642
|
}
|
|
643
|
+
if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
644
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
429
647
|
const responseType = "code";
|
|
430
648
|
const scope = [
|
|
431
649
|
"https%3A//www.googleapis.com/auth/userinfo.email",
|
|
@@ -457,6 +675,10 @@ const googleCallback = async (req, res, _next) => {
|
|
|
457
675
|
res.redirect(responseCode, redirect_uri);
|
|
458
676
|
return;
|
|
459
677
|
}
|
|
678
|
+
if (redirect_uri && !redirect_uri.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
679
|
+
ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
460
682
|
try {
|
|
461
683
|
const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
|
|
462
684
|
method: "POST",
|
|
@@ -545,8 +767,9 @@ const googleCallback = async (req, res, _next) => {
|
|
|
545
767
|
type: "welcome",
|
|
546
768
|
to: user.email,
|
|
547
769
|
username: user.name,
|
|
548
|
-
loginLink:
|
|
770
|
+
loginLink: `${process.env.CLIENT_URL}/auth/login`
|
|
549
771
|
});
|
|
772
|
+
res.redirect(redirect_uri);
|
|
550
773
|
} catch (error) {
|
|
551
774
|
ErrorHandler.handleAppErrorResponse(res, error);
|
|
552
775
|
return;
|
|
@@ -554,6 +777,7 @@ const googleCallback = async (req, res, _next) => {
|
|
|
554
777
|
};
|
|
555
778
|
export {
|
|
556
779
|
askResetPassword,
|
|
780
|
+
checkIfUserHasPassword,
|
|
557
781
|
getSessionInformation,
|
|
558
782
|
githubCallback,
|
|
559
783
|
githubLoginQuery,
|
|
@@ -563,8 +787,10 @@ export {
|
|
|
563
787
|
loginEmailPassword,
|
|
564
788
|
registerEmailPassword,
|
|
565
789
|
resetPassword,
|
|
790
|
+
sendVerificationUpdate,
|
|
566
791
|
setCSRFToken,
|
|
567
792
|
updatePassword,
|
|
568
|
-
validEmail
|
|
793
|
+
validEmail,
|
|
794
|
+
verifyEmailStatusSSE
|
|
569
795
|
};
|
|
570
796
|
//# sourceMappingURL=sessionAuth.controller.mjs.map
|