@intlayer/backend 3.1.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/controllers/dictionary.controller.cjs +41 -0
- package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
- package/dist/cjs/controllers/organization.controller.cjs +73 -4
- package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
- package/dist/cjs/controllers/project.controller.cjs +71 -7
- package/dist/cjs/controllers/project.controller.cjs.map +1 -1
- package/dist/cjs/controllers/projectAccessKey.controller.cjs +31 -0
- package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
- package/dist/cjs/controllers/sessionAuth.controller.cjs +277 -57
- 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 +40 -3
- 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 +15 -5
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/middlewares/sessionAuth.middleware.cjs +4 -6
- 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/{models/plan.moddel.cjs → routes/stripe.routes.cjs} +20 -9
- 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/schemas/plans.schema.cjs +2 -8
- package/dist/cjs/schemas/plans.schema.cjs.map +1 -1
- package/dist/cjs/schemas/user.schema.cjs +1 -1
- package/dist/cjs/schemas/user.schema.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/organization.service.cjs +55 -8
- package/dist/cjs/services/organization.service.cjs.map +1 -1
- package/dist/cjs/services/project.service.cjs +1 -3
- package/dist/cjs/services/project.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 +134 -51
- package/dist/cjs/services/subscription.service.cjs.map +1 -1
- package/dist/cjs/services/user.service.cjs +1 -3
- package/dist/cjs/services/user.service.cjs.map +1 -1
- package/dist/cjs/types/organization.types.cjs.map +1 -1
- package/dist/cjs/types/plan.types.cjs.map +1 -1
- package/dist/cjs/types/session.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 +99 -8
- package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
- package/dist/cjs/utils/mapper/project.cjs +1 -1
- package/dist/cjs/utils/mapper/project.cjs.map +1 -1
- package/dist/cjs/utils/plan.cjs +7 -2
- package/dist/cjs/utils/plan.cjs.map +1 -1
- 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 +41 -0
- package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
- package/dist/esm/controllers/organization.controller.mjs +73 -4
- package/dist/esm/controllers/organization.controller.mjs.map +1 -1
- package/dist/esm/controllers/project.controller.mjs +71 -7
- package/dist/esm/controllers/project.controller.mjs.map +1 -1
- package/dist/esm/controllers/projectAccessKey.controller.mjs +31 -0
- package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
- package/dist/esm/controllers/sessionAuth.controller.mjs +273 -56
- 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 +40 -3
- 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 +15 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/middlewares/sessionAuth.middleware.mjs +4 -6
- 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 +2 -8
- package/dist/esm/schemas/plans.schema.mjs.map +1 -1
- package/dist/esm/schemas/user.schema.mjs +1 -1
- package/dist/esm/schemas/user.schema.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/organization.service.mjs +51 -7
- package/dist/esm/services/organization.service.mjs.map +1 -1
- package/dist/esm/services/project.service.mjs +1 -3
- package/dist/esm/services/project.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 +136 -53
- package/dist/esm/services/subscription.service.mjs.map +1 -1
- package/dist/esm/services/user.service.mjs +1 -3
- package/dist/esm/services/user.service.mjs.map +1 -1
- 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 +99 -8
- package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
- package/dist/esm/utils/mapper/project.mjs +1 -1
- package/dist/esm/utils/mapper/project.mjs.map +1 -1
- package/dist/esm/utils/plan.mjs +7 -2
- package/dist/esm/utils/plan.mjs.map +1 -1
- 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.map +1 -1
- package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
- package/dist/types/controllers/sessionAuth.controller.d.ts +24 -5
- 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 +1 -0
- package/dist/types/export.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
- package/dist/types/models/organization.model.d.ts +1 -0
- package/dist/types/models/organization.model.d.ts.map +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/organization.schema.d.ts +1 -0
- package/dist/types/schemas/organization.schema.d.ts.map +1 -1
- package/dist/types/schemas/plans.schema.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/organization.service.d.ts +15 -0
- package/dist/types/services/organization.service.d.ts.map +1 -1
- package/dist/types/services/project.service.d.ts.map +1 -1
- package/dist/types/services/sessionAuth.service.d.ts +1 -8
- package/dist/types/services/sessionAuth.service.d.ts.map +1 -1
- package/dist/types/services/subscription.service.d.ts +20 -5
- package/dist/types/services/subscription.service.d.ts.map +1 -1
- package/dist/types/services/user.service.d.ts.map +1 -1
- package/dist/types/types/organization.types.d.ts +2 -0
- package/dist/types/types/organization.types.d.ts.map +1 -1
- package/dist/types/types/plan.types.d.ts +2 -3
- package/dist/types/types/plan.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/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 +92 -1
- package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
- package/dist/types/utils/mapper/project.d.ts +1 -1
- package/dist/types/utils/mapper/project.d.ts.map +1 -1
- package/dist/types/utils/plan.d.ts +1 -1
- package/dist/types/utils/plan.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/types/webhooks/stripe.webhook.d.ts +3 -0
- package/dist/types/webhooks/stripe.webhook.d.ts.map +1 -0
- package/package.json +6 -5
- package/dist/cjs/models/plan.moddel.cjs.map +0 -1
- package/dist/cjs/services/plans.service.cjs +0 -72
- package/dist/cjs/services/plans.service.cjs.map +0 -1
- package/dist/cjs/webhooks/stripe.cjs +0 -94
- package/dist/cjs/webhooks/stripe.cjs.map +0 -1
- package/dist/esm/models/plan.moddel.mjs +0 -7
- package/dist/esm/models/plan.moddel.mjs.map +0 -1
- package/dist/esm/services/plans.service.mjs +0 -44
- package/dist/esm/services/plans.service.mjs.map +0 -1
- package/dist/esm/webhooks/stripe.mjs +0 -70
- package/dist/esm/webhooks/stripe.mjs.map +0 -1
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var sessionAuth_controller_exports = {};
|
|
30
30
|
__export(sessionAuth_controller_exports, {
|
|
31
31
|
askResetPassword: () => askResetPassword,
|
|
32
|
+
checkIfUserHasPassword: () => checkIfUserHasPassword,
|
|
32
33
|
getSessionInformation: () => getSessionInformation,
|
|
33
34
|
githubCallback: () => githubCallback,
|
|
34
35
|
githubLoginQuery: () => githubLoginQuery,
|
|
@@ -38,11 +39,14 @@ __export(sessionAuth_controller_exports, {
|
|
|
38
39
|
loginEmailPassword: () => loginEmailPassword,
|
|
39
40
|
registerEmailPassword: () => registerEmailPassword,
|
|
40
41
|
resetPassword: () => resetPassword,
|
|
42
|
+
sendVerificationUpdate: () => sendVerificationUpdate,
|
|
41
43
|
setCSRFToken: () => setCSRFToken,
|
|
42
44
|
updatePassword: () => updatePassword,
|
|
43
|
-
validEmail: () => validEmail
|
|
45
|
+
validEmail: () => validEmail,
|
|
46
|
+
verifyEmailStatusSSE: () => verifyEmailStatusSSE
|
|
44
47
|
});
|
|
45
48
|
module.exports = __toCommonJS(sessionAuth_controller_exports);
|
|
49
|
+
var import_crypto = __toESM(require("crypto"), 1);
|
|
46
50
|
var import_logger = require('./../logger/index.cjs');
|
|
47
51
|
var import_sessionAuth = require('./../routes/sessionAuth.routes.cjs');
|
|
48
52
|
var import_email = require('./../services/email.service.cjs');
|
|
@@ -55,6 +59,7 @@ var import_organization = require('./../utils/mapper/organization.cjs');
|
|
|
55
59
|
var import_project = require('./../utils/mapper/project.cjs');
|
|
56
60
|
var import_user = require('./../utils/mapper/user.cjs');
|
|
57
61
|
var import_responseData = require('./../utils/responseData.cjs');
|
|
62
|
+
var import_express_intlayer = require("express-intlayer");
|
|
58
63
|
var import_mongoose = require("mongoose");
|
|
59
64
|
var import_uuid = require("uuid");
|
|
60
65
|
const setCSRFToken = (req, res, _next) => {
|
|
@@ -67,10 +72,15 @@ const setCSRFToken = (req, res, _next) => {
|
|
|
67
72
|
};
|
|
68
73
|
const registerEmailPassword = async (req, res, _next) => {
|
|
69
74
|
const { user } = res.locals;
|
|
75
|
+
const { callBack_url } = req.query;
|
|
70
76
|
if (user) {
|
|
71
77
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
|
|
72
78
|
return;
|
|
73
79
|
}
|
|
80
|
+
if (callBack_url && !callBack_url.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
81
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
74
84
|
const userData = req.body;
|
|
75
85
|
try {
|
|
76
86
|
let user2 = await userService.getUserByEmail(userData.email);
|
|
@@ -78,22 +88,18 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
78
88
|
const emailProvider = user2.provider?.find(
|
|
79
89
|
(provider) => provider.provider === "email"
|
|
80
90
|
);
|
|
81
|
-
if (emailProvider) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
secret: (0, import_uuid.v4)()
|
|
94
|
-
}
|
|
95
|
-
);
|
|
96
|
-
}
|
|
91
|
+
if (emailProvider?.emailValidated) {
|
|
92
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(
|
|
93
|
+
res,
|
|
94
|
+
"EMAIL_ALREADY_REGISTERED"
|
|
95
|
+
);
|
|
96
|
+
return;
|
|
97
|
+
} else if (emailProvider) {
|
|
98
|
+
user2 = await sessionAuthService.updateUserProvider(user2._id, "email", {
|
|
99
|
+
provider: "email",
|
|
100
|
+
emailValidated: void 0,
|
|
101
|
+
secret: (0, import_uuid.v4)()
|
|
102
|
+
});
|
|
97
103
|
} else {
|
|
98
104
|
user2 = await sessionAuthService.addUserProvider(user2._id, {
|
|
99
105
|
provider: "email",
|
|
@@ -102,7 +108,16 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
102
108
|
});
|
|
103
109
|
}
|
|
104
110
|
} else {
|
|
105
|
-
user2 = await userService.createUser(
|
|
111
|
+
user2 = await userService.createUser({
|
|
112
|
+
...userData,
|
|
113
|
+
provider: [
|
|
114
|
+
{
|
|
115
|
+
provider: "email",
|
|
116
|
+
emailValidated: void 0,
|
|
117
|
+
secret: (0, import_uuid.v4)()
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
});
|
|
106
121
|
import_logger.logger.info(`New registration: ${user2.name} - ${user2.email}`);
|
|
107
122
|
}
|
|
108
123
|
if (!user2) {
|
|
@@ -111,9 +126,30 @@ const registerEmailPassword = async (req, res, _next) => {
|
|
|
111
126
|
});
|
|
112
127
|
return;
|
|
113
128
|
}
|
|
114
|
-
await
|
|
129
|
+
await (0, import_email.sendEmail)({
|
|
130
|
+
type: "validate",
|
|
131
|
+
to: user2.email,
|
|
132
|
+
username: user2.name ?? user2.email.split("@")[0],
|
|
133
|
+
validationLink: import_sessionAuth.sessionAuthRoutes.validEmail.url({
|
|
134
|
+
userId: String(user2._id),
|
|
135
|
+
secret: user2.provider?.find((provider) => provider.provider === "email")?.secret ?? "",
|
|
136
|
+
callBack_url
|
|
137
|
+
})
|
|
138
|
+
});
|
|
115
139
|
const formattedUser = (0, import_user.mapUserToAPI)(user2);
|
|
116
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
140
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
141
|
+
message: (0, import_express_intlayer.t)({
|
|
142
|
+
en: "User registered successfully",
|
|
143
|
+
fr: "Utilisateur enregistr\xE9 avec succ\xE8s",
|
|
144
|
+
es: "Usuario registrado con \xE9xito"
|
|
145
|
+
}),
|
|
146
|
+
description: (0, import_express_intlayer.t)({
|
|
147
|
+
en: "Your user has been registered successfully. Please check your email to validate your account.",
|
|
148
|
+
fr: "Votre utilisateur a \xE9t\xE9 enregistr\xE9 avec succ\xE8s. Veuillez v\xE9rifier votre e-mail pour valider votre compte.",
|
|
149
|
+
es: "Su usuario ha sido registrado con \xE9xito. Por favor, revise su correo electr\xF3nico para validar su cuenta."
|
|
150
|
+
}),
|
|
151
|
+
data: formattedUser
|
|
152
|
+
});
|
|
117
153
|
res.json(responseData);
|
|
118
154
|
return;
|
|
119
155
|
} catch (error) {
|
|
@@ -142,7 +178,19 @@ const loginEmailPassword = async (req, res, _next) => {
|
|
|
142
178
|
}
|
|
143
179
|
await sessionAuthService.setUserAuth(res, loggedInUser);
|
|
144
180
|
const formattedUser = (0, import_user.mapUserToAPI)(loggedInUser);
|
|
145
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
181
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
182
|
+
message: (0, import_express_intlayer.t)({
|
|
183
|
+
en: "User logged in successfully",
|
|
184
|
+
fr: "Utilisateur connect\xE9 avec succ\xE8s",
|
|
185
|
+
es: "Usuario conectado con \xE9xito"
|
|
186
|
+
}),
|
|
187
|
+
description: (0, import_express_intlayer.t)({
|
|
188
|
+
en: "Your user has been logged in successfully",
|
|
189
|
+
fr: "Votre utilisateur a \xE9t\xE9 connect\xE9 avec succ\xE8s",
|
|
190
|
+
es: "Su usuario ha sido conectado con \xE9xito"
|
|
191
|
+
}),
|
|
192
|
+
data: formattedUser
|
|
193
|
+
});
|
|
146
194
|
import_logger.logger.info(`Login: ${loggedInUser.email}`);
|
|
147
195
|
res.json(responseData);
|
|
148
196
|
return;
|
|
@@ -161,7 +209,19 @@ const logOut = async (_req, res, _next) => {
|
|
|
161
209
|
sessionAuthService.clearOrganizationAuth(res);
|
|
162
210
|
sessionAuthService.clearProjectAuth(res);
|
|
163
211
|
import_logger.logger.info(`Logout: ${user.name} - ${user.email}`);
|
|
164
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
212
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
213
|
+
message: (0, import_express_intlayer.t)({
|
|
214
|
+
en: "User logged out successfully",
|
|
215
|
+
fr: "Utilisateur d\xE9connect\xE9 avec succ\xE8s",
|
|
216
|
+
es: "Usuario desconectado con \xE9xito"
|
|
217
|
+
}),
|
|
218
|
+
description: (0, import_express_intlayer.t)({
|
|
219
|
+
en: "Your user has been logged out successfully",
|
|
220
|
+
fr: "Votre utilisateur a \xE9t\xE9 d\xE9connect\xE9 avec succ\xE8s",
|
|
221
|
+
es: "Su usuario ha sido desconectado con \xE9xito"
|
|
222
|
+
}),
|
|
223
|
+
data: void 0
|
|
224
|
+
});
|
|
165
225
|
res.json(responseData);
|
|
166
226
|
};
|
|
167
227
|
const updatePassword = async (req, res, _next) => {
|
|
@@ -171,20 +231,34 @@ const updatePassword = async (req, res, _next) => {
|
|
|
171
231
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
172
232
|
return;
|
|
173
233
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
234
|
+
const userEmailProvider = user.provider?.find(
|
|
235
|
+
(provider) => provider.provider === "email"
|
|
236
|
+
);
|
|
237
|
+
if (!userEmailProvider) {
|
|
238
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_PROVIDER_NOT_FOUND", {
|
|
239
|
+
provider: "email"
|
|
240
|
+
});
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (userEmailProvider.passwordHash && !oldPassword) {
|
|
244
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(
|
|
245
|
+
res,
|
|
246
|
+
"USER_PREVIOUS_PASSWORD_NOT_PROVIDED"
|
|
178
247
|
);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
if (oldPassword) {
|
|
252
|
+
const { error } = await sessionAuthService.testUserPassword(
|
|
253
|
+
user.email,
|
|
254
|
+
oldPassword
|
|
255
|
+
);
|
|
256
|
+
if (error) {
|
|
257
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "LOGIN_FAILED");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
182
260
|
}
|
|
183
|
-
user = await sessionAuthService.changeUserPassword(
|
|
184
|
-
user._id,
|
|
185
|
-
oldPassword,
|
|
186
|
-
newPassword
|
|
187
|
-
);
|
|
261
|
+
user = await sessionAuthService.changeUserPassword(user._id, newPassword);
|
|
188
262
|
if (!user || typeof user !== "object") {
|
|
189
263
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
190
264
|
return;
|
|
@@ -193,7 +267,65 @@ const updatePassword = async (req, res, _next) => {
|
|
|
193
267
|
`Password changed - User : Name : ${user.name}, id : ${String(user._id)}`
|
|
194
268
|
);
|
|
195
269
|
const formattedUser = (0, import_user.mapUserToAPI)(user);
|
|
196
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
270
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
271
|
+
message: (0, import_express_intlayer.t)({
|
|
272
|
+
en: "Password changed successfully",
|
|
273
|
+
fr: "Mot de passe modifi\xE9 avec succ\xE8s",
|
|
274
|
+
es: "Contrase\xF1a cambiada con \xE9xito"
|
|
275
|
+
}),
|
|
276
|
+
description: (0, import_express_intlayer.t)({
|
|
277
|
+
en: "Your password has been changed successfully",
|
|
278
|
+
fr: "Votre mot de passe a \xE9t\xE9 modifi\xE9 avec succ\xE8s",
|
|
279
|
+
es: "Su contrase\xF1a ha sido cambiada con \xE9xito"
|
|
280
|
+
}),
|
|
281
|
+
data: formattedUser
|
|
282
|
+
});
|
|
283
|
+
res.json(responseData);
|
|
284
|
+
return;
|
|
285
|
+
} catch (error) {
|
|
286
|
+
import_errors.ErrorHandler.handleAppErrorResponse(res, error);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
let clients = [];
|
|
291
|
+
const sendVerificationUpdate = (user) => {
|
|
292
|
+
const filteredClients = clients.filter(
|
|
293
|
+
(client) => String(client.userId) === String(user._id)
|
|
294
|
+
);
|
|
295
|
+
for (const client of filteredClients) {
|
|
296
|
+
const provider = user.provider?.find(
|
|
297
|
+
(provider2) => provider2.provider === "email"
|
|
298
|
+
);
|
|
299
|
+
if (provider?.emailValidated) {
|
|
300
|
+
client.res.write(
|
|
301
|
+
`data: ${JSON.stringify({ userId: user._id, status: "verified" })}
|
|
302
|
+
|
|
303
|
+
`
|
|
304
|
+
);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
client.res.write(
|
|
308
|
+
`data: ${JSON.stringify({ userId: user._id, status: "waiting" })}
|
|
309
|
+
|
|
310
|
+
`
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const checkIfUserHasPassword = async (_req, res, _next) => {
|
|
315
|
+
const { user } = res.locals;
|
|
316
|
+
if (!user) {
|
|
317
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
const userProvider = user.provider?.find(
|
|
322
|
+
(provider) => provider.provider === "email"
|
|
323
|
+
);
|
|
324
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
325
|
+
data: {
|
|
326
|
+
hasPassword: Boolean(userProvider?.passwordHash)
|
|
327
|
+
}
|
|
328
|
+
});
|
|
197
329
|
res.json(responseData);
|
|
198
330
|
return;
|
|
199
331
|
} catch (error) {
|
|
@@ -203,15 +335,11 @@ const updatePassword = async (req, res, _next) => {
|
|
|
203
335
|
};
|
|
204
336
|
const validEmail = async (req, res, _next) => {
|
|
205
337
|
const { userId, secret } = req.params;
|
|
206
|
-
const
|
|
338
|
+
const callBack_url = `${req.query.callBack_url ?? `${process.env.CLIENT_URL}/auth/login`}?userId=${userId}`;
|
|
207
339
|
if (!import_mongoose.Types.ObjectId.isValid(userId.toString())) {
|
|
208
340
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "INVALID_USER_ID");
|
|
209
341
|
return;
|
|
210
342
|
}
|
|
211
|
-
if (!organization) {
|
|
212
|
-
import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
343
|
const user = await userService.getUserById(userId);
|
|
216
344
|
if (!user) {
|
|
217
345
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED", {
|
|
@@ -219,19 +347,63 @@ const validEmail = async (req, res, _next) => {
|
|
|
219
347
|
});
|
|
220
348
|
return;
|
|
221
349
|
}
|
|
222
|
-
|
|
350
|
+
if (callBack_url && !callBack_url.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
351
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
const provider = user.provider?.find(
|
|
355
|
+
(provider2) => provider2.provider === "email"
|
|
356
|
+
);
|
|
357
|
+
if (provider?.emailValidated) {
|
|
358
|
+
res.redirect(callBack_url);
|
|
359
|
+
}
|
|
360
|
+
if (!provider?.secret) {
|
|
361
|
+
throw new import_errors.GenericError("USER_PROVIDER_SECRET_NOT_DEFINED", { userId });
|
|
362
|
+
}
|
|
363
|
+
if (!import_crypto.default.timingSafeEqual(Buffer.from(provider.secret), Buffer.from(secret))) {
|
|
364
|
+
throw new import_errors.GenericError("USER_PROVIDER_SECRET_NOT_VALID", { userId });
|
|
365
|
+
}
|
|
366
|
+
await sessionAuthService.updateUserProvider(userId, "email", {
|
|
367
|
+
secret: void 0,
|
|
368
|
+
emailValidated: /* @__PURE__ */ new Date()
|
|
369
|
+
});
|
|
223
370
|
import_logger.logger.info(
|
|
224
371
|
`User activated - User: Name: ${user.name}, id: ${String(user._id)}`
|
|
225
372
|
);
|
|
373
|
+
sendVerificationUpdate(user);
|
|
374
|
+
await sessionAuthService.setUserAuth(res, user);
|
|
226
375
|
await (0, import_email.sendEmail)({
|
|
227
376
|
type: "welcome",
|
|
228
377
|
to: user.email,
|
|
229
378
|
username: user.name,
|
|
230
|
-
loginLink:
|
|
379
|
+
loginLink: callBack_url
|
|
380
|
+
});
|
|
381
|
+
res.redirect(callBack_url);
|
|
382
|
+
};
|
|
383
|
+
const verifyEmailStatusSSE = async (req, res) => {
|
|
384
|
+
res.setHeader("Content-Type", "text/event-stream;charset=utf-8");
|
|
385
|
+
res.setHeader("Cache-Control", "no-cache, no-transform");
|
|
386
|
+
res.setHeader("Connection", "keep-alive");
|
|
387
|
+
res.setHeader("X-Accel-Buffering", "no");
|
|
388
|
+
res.write(":\n\n");
|
|
389
|
+
res.flushHeaders();
|
|
390
|
+
const { userId } = req.params;
|
|
391
|
+
const clientId = Date.now();
|
|
392
|
+
const user = await userService.getUserById(userId);
|
|
393
|
+
if (!user) {
|
|
394
|
+
import_logger.logger.error(`User not found - User ID: ${userId}`);
|
|
395
|
+
res.write(`data: ${JSON.stringify({ userId, status: "error" })}
|
|
396
|
+
|
|
397
|
+
`);
|
|
398
|
+
res.end();
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
const newClient = { id: clientId, userId, res };
|
|
402
|
+
clients.push(newClient);
|
|
403
|
+
sendVerificationUpdate(user);
|
|
404
|
+
req.on("close", () => {
|
|
405
|
+
clients = clients.filter((client) => client.id !== clientId);
|
|
231
406
|
});
|
|
232
|
-
const formattedUser = (0, import_user.mapUserToAPI)(user);
|
|
233
|
-
const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
|
|
234
|
-
res.json(responseData);
|
|
235
407
|
};
|
|
236
408
|
const askResetPassword = async (req, res, _next) => {
|
|
237
409
|
const { email } = req.body;
|
|
@@ -259,7 +431,19 @@ const askResetPassword = async (req, res, _next) => {
|
|
|
259
431
|
)?.secret ?? ""
|
|
260
432
|
})
|
|
261
433
|
});
|
|
262
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
434
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
435
|
+
message: (0, import_express_intlayer.t)({
|
|
436
|
+
en: "Password reset request sent successfully",
|
|
437
|
+
fr: "Demande de r\xE9initialisation de mot de passe envoy\xE9e avec succ\xE8s",
|
|
438
|
+
es: "Solicitud de restablecimiento de contrase\xF1a enviada con \xE9xito"
|
|
439
|
+
}),
|
|
440
|
+
description: (0, import_express_intlayer.t)({
|
|
441
|
+
en: "Your password reset request has been sent successfully. Please check your email to reset your password.",
|
|
442
|
+
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.",
|
|
443
|
+
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."
|
|
444
|
+
}),
|
|
445
|
+
data: void 0
|
|
446
|
+
});
|
|
263
447
|
res.json(responseData);
|
|
264
448
|
return;
|
|
265
449
|
} catch (error) {
|
|
@@ -294,7 +478,19 @@ const resetPassword = async (req, res, _next) => {
|
|
|
294
478
|
username: updatedUser.name
|
|
295
479
|
});
|
|
296
480
|
const formattedUser = (0, import_user.mapUserToAPI)(updatedUser);
|
|
297
|
-
const responseData = (0, import_responseData.formatResponse)({
|
|
481
|
+
const responseData = (0, import_responseData.formatResponse)({
|
|
482
|
+
message: (0, import_express_intlayer.t)({
|
|
483
|
+
en: "Password reset successfully",
|
|
484
|
+
fr: "R\xE9initialisation du mot de passe r\xE9ussie",
|
|
485
|
+
es: "Restablecimiento de contrase\xF1a exitoso"
|
|
486
|
+
}),
|
|
487
|
+
description: (0, import_express_intlayer.t)({
|
|
488
|
+
en: "Your password has been reset successfully. You can now log in with your new password",
|
|
489
|
+
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",
|
|
490
|
+
es: "Su contrase\xF1a ha sido restablecida con \xE9xito. Ahora puede iniciar sesi\xF3n con su nueva contrase\xF1a"
|
|
491
|
+
}),
|
|
492
|
+
data: formattedUser
|
|
493
|
+
});
|
|
298
494
|
res.json(responseData);
|
|
299
495
|
return;
|
|
300
496
|
} catch (error) {
|
|
@@ -310,15 +506,19 @@ const getSessionInformation = async (req, res, _next) => {
|
|
|
310
506
|
if (sessionToken) {
|
|
311
507
|
user = await userService.getUserBySession(sessionToken);
|
|
312
508
|
}
|
|
313
|
-
if (!user) {
|
|
314
|
-
|
|
509
|
+
if (!user || !user?.session) {
|
|
510
|
+
const responseData2 = (0, import_responseData.formatResponse)({
|
|
511
|
+
data: {
|
|
512
|
+
session: null,
|
|
513
|
+
user: null,
|
|
514
|
+
organization: organization?._id ? (0, import_organization.mapOrganizationToAPI)(organization, isOrganizationAdmin) : null,
|
|
515
|
+
project: project?._id ? (0, import_project.mapProjectToAPI)(project, user, isProjectAdmin) : null
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
res.json(responseData2);
|
|
315
519
|
return;
|
|
316
520
|
}
|
|
317
521
|
const session = user.session;
|
|
318
|
-
if (!session) {
|
|
319
|
-
import_errors.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_FOUND");
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
522
|
const formattedUser = {
|
|
323
523
|
...(0, import_user.mapUserToAPI)(user),
|
|
324
524
|
role: "user"
|
|
@@ -345,11 +545,15 @@ const githubLoginQuery = (req, res, _next) => {
|
|
|
345
545
|
import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
|
|
346
546
|
return;
|
|
347
547
|
}
|
|
548
|
+
if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
549
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
348
552
|
const encodedOrigin = encodeURIComponent(origin);
|
|
349
553
|
const redirectURI = `${process.env.BACKEND_URL}/api/auth/callback/github?redirect_uri=${encodedOrigin}`;
|
|
350
554
|
const encodedRedirectURI = encodeURIComponent(redirectURI);
|
|
351
555
|
res.redirect(
|
|
352
|
-
`https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_CLIENT_ID}&redirect_uri=${encodedRedirectURI}`
|
|
556
|
+
`https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_CLIENT_ID}&redirect_uri=${encodedRedirectURI}&scope=user:email`
|
|
353
557
|
);
|
|
354
558
|
};
|
|
355
559
|
const githubCallback = async (req, res, _next) => {
|
|
@@ -366,6 +570,10 @@ const githubCallback = async (req, res, _next) => {
|
|
|
366
570
|
res.redirect(redirect_uri);
|
|
367
571
|
return;
|
|
368
572
|
}
|
|
573
|
+
if (redirect_uri && !redirect_uri.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
574
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
369
577
|
try {
|
|
370
578
|
const tokenResponse = await fetch(
|
|
371
579
|
"https://github.com/login/oauth/access_token",
|
|
@@ -463,7 +671,7 @@ const githubCallback = async (req, res, _next) => {
|
|
|
463
671
|
type: "welcome",
|
|
464
672
|
to: user.email,
|
|
465
673
|
username: user.name,
|
|
466
|
-
loginLink:
|
|
674
|
+
loginLink: `${process.env.CLIENT_URL}/auth/login`
|
|
467
675
|
});
|
|
468
676
|
res.redirect(redirect_uri);
|
|
469
677
|
} catch (error) {
|
|
@@ -480,6 +688,10 @@ const googleLoginQuery = (req, res, _next) => {
|
|
|
480
688
|
res.redirect(origin);
|
|
481
689
|
return;
|
|
482
690
|
}
|
|
691
|
+
if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
692
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
483
695
|
const responseType = "code";
|
|
484
696
|
const scope = [
|
|
485
697
|
"https%3A//www.googleapis.com/auth/userinfo.email",
|
|
@@ -511,6 +723,10 @@ const googleCallback = async (req, res, _next) => {
|
|
|
511
723
|
res.redirect(responseCode, redirect_uri);
|
|
512
724
|
return;
|
|
513
725
|
}
|
|
726
|
+
if (redirect_uri && !redirect_uri.startsWith(process.env.CLIENT_URL ?? "")) {
|
|
727
|
+
import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
514
730
|
try {
|
|
515
731
|
const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
|
|
516
732
|
method: "POST",
|
|
@@ -599,8 +815,9 @@ const googleCallback = async (req, res, _next) => {
|
|
|
599
815
|
type: "welcome",
|
|
600
816
|
to: user.email,
|
|
601
817
|
username: user.name,
|
|
602
|
-
loginLink:
|
|
818
|
+
loginLink: `${process.env.CLIENT_URL}/auth/login`
|
|
603
819
|
});
|
|
820
|
+
res.redirect(redirect_uri);
|
|
604
821
|
} catch (error) {
|
|
605
822
|
import_errors.ErrorHandler.handleAppErrorResponse(res, error);
|
|
606
823
|
return;
|
|
@@ -609,6 +826,7 @@ const googleCallback = async (req, res, _next) => {
|
|
|
609
826
|
// Annotate the CommonJS export names for ESM import in node:
|
|
610
827
|
0 && (module.exports = {
|
|
611
828
|
askResetPassword,
|
|
829
|
+
checkIfUserHasPassword,
|
|
612
830
|
getSessionInformation,
|
|
613
831
|
githubCallback,
|
|
614
832
|
githubLoginQuery,
|
|
@@ -618,8 +836,10 @@ const googleCallback = async (req, res, _next) => {
|
|
|
618
836
|
loginEmailPassword,
|
|
619
837
|
registerEmailPassword,
|
|
620
838
|
resetPassword,
|
|
839
|
+
sendVerificationUpdate,
|
|
621
840
|
setCSRFToken,
|
|
622
841
|
updatePassword,
|
|
623
|
-
validEmail
|
|
842
|
+
validEmail,
|
|
843
|
+
verifyEmailStatusSSE
|
|
624
844
|
});
|
|
625
845
|
//# sourceMappingURL=sessionAuth.controller.cjs.map
|