@intlayer/backend 3.1.0 → 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.
Files changed (216) hide show
  1. package/dist/cjs/controllers/dictionary.controller.cjs +41 -0
  2. package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
  3. package/dist/cjs/controllers/organization.controller.cjs +73 -4
  4. package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
  5. package/dist/cjs/controllers/project.controller.cjs +71 -7
  6. package/dist/cjs/controllers/project.controller.cjs.map +1 -1
  7. package/dist/cjs/controllers/projectAccessKey.controller.cjs +31 -0
  8. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
  9. package/dist/cjs/controllers/sessionAuth.controller.cjs +277 -57
  10. package/dist/cjs/controllers/sessionAuth.controller.cjs.map +1 -1
  11. package/dist/cjs/controllers/stripe.controller.cjs +84 -0
  12. package/dist/cjs/controllers/stripe.controller.cjs.map +1 -0
  13. package/dist/cjs/controllers/user.controller.cjs +40 -3
  14. package/dist/cjs/controllers/user.controller.cjs.map +1 -1
  15. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +182 -0
  16. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +1 -0
  17. package/dist/cjs/emails/SubscriptionPaymentError.cjs +182 -0
  18. package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +1 -0
  19. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +188 -0
  20. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +1 -0
  21. package/dist/cjs/export.cjs.map +1 -1
  22. package/dist/cjs/index.cjs +15 -5
  23. package/dist/cjs/index.cjs.map +1 -1
  24. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +4 -6
  25. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +1 -1
  26. package/dist/cjs/routes/dictionary.routes.cjs +2 -62
  27. package/dist/cjs/routes/dictionary.routes.cjs.map +1 -1
  28. package/dist/cjs/routes/organization.routes.cjs +1 -25
  29. package/dist/cjs/routes/organization.routes.cjs.map +1 -1
  30. package/dist/cjs/routes/project.routes.cjs +10 -85
  31. package/dist/cjs/routes/project.routes.cjs.map +1 -1
  32. package/dist/cjs/routes/sessionAuth.routes.cjs +26 -25
  33. package/dist/cjs/routes/sessionAuth.routes.cjs.map +1 -1
  34. package/dist/cjs/{models/plan.moddel.cjs → routes/stripe.routes.cjs} +20 -9
  35. package/dist/cjs/routes/stripe.routes.cjs.map +1 -0
  36. package/dist/cjs/routes/user.routes.cjs +6 -27
  37. package/dist/cjs/routes/user.routes.cjs.map +1 -1
  38. package/dist/cjs/schemas/organization.schema.cjs +5 -0
  39. package/dist/cjs/schemas/organization.schema.cjs.map +1 -1
  40. package/dist/cjs/schemas/plans.schema.cjs +2 -8
  41. package/dist/cjs/schemas/plans.schema.cjs.map +1 -1
  42. package/dist/cjs/schemas/user.schema.cjs +1 -1
  43. package/dist/cjs/schemas/user.schema.cjs.map +1 -1
  44. package/dist/cjs/services/email.service.cjs +113 -43
  45. package/dist/cjs/services/email.service.cjs.map +1 -1
  46. package/dist/cjs/services/organization.service.cjs +55 -8
  47. package/dist/cjs/services/organization.service.cjs.map +1 -1
  48. package/dist/cjs/services/project.service.cjs +1 -3
  49. package/dist/cjs/services/project.service.cjs.map +1 -1
  50. package/dist/cjs/services/sessionAuth.service.cjs +9 -11
  51. package/dist/cjs/services/sessionAuth.service.cjs.map +1 -1
  52. package/dist/cjs/services/subscription.service.cjs +134 -51
  53. package/dist/cjs/services/subscription.service.cjs.map +1 -1
  54. package/dist/cjs/services/user.service.cjs +1 -3
  55. package/dist/cjs/services/user.service.cjs.map +1 -1
  56. package/dist/cjs/types/organization.types.cjs.map +1 -1
  57. package/dist/cjs/types/plan.types.cjs.map +1 -1
  58. package/dist/cjs/types/session.types.cjs.map +1 -1
  59. package/dist/cjs/utils/errors/ErrorHandler.cjs +29 -9
  60. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -1
  61. package/dist/cjs/utils/errors/ErrorsClass.cjs +17 -3
  62. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +1 -1
  63. package/dist/cjs/utils/errors/errorCodes.cjs +99 -8
  64. package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
  65. package/dist/cjs/utils/mapper/project.cjs +1 -1
  66. package/dist/cjs/utils/mapper/project.cjs.map +1 -1
  67. package/dist/cjs/utils/plan.cjs +7 -2
  68. package/dist/cjs/utils/plan.cjs.map +1 -1
  69. package/dist/cjs/utils/responseData.cjs +8 -0
  70. package/dist/cjs/utils/responseData.cjs.map +1 -1
  71. package/dist/cjs/webhooks/stripe.webhook.cjs +133 -0
  72. package/dist/cjs/webhooks/stripe.webhook.cjs.map +1 -0
  73. package/dist/esm/controllers/dictionary.controller.mjs +41 -0
  74. package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
  75. package/dist/esm/controllers/organization.controller.mjs +73 -4
  76. package/dist/esm/controllers/organization.controller.mjs.map +1 -1
  77. package/dist/esm/controllers/project.controller.mjs +71 -7
  78. package/dist/esm/controllers/project.controller.mjs.map +1 -1
  79. package/dist/esm/controllers/projectAccessKey.controller.mjs +31 -0
  80. package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
  81. package/dist/esm/controllers/sessionAuth.controller.mjs +273 -56
  82. package/dist/esm/controllers/sessionAuth.controller.mjs.map +1 -1
  83. package/dist/esm/controllers/stripe.controller.mjs +60 -0
  84. package/dist/esm/controllers/stripe.controller.mjs.map +1 -0
  85. package/dist/esm/controllers/user.controller.mjs +40 -3
  86. package/dist/esm/controllers/user.controller.mjs.map +1 -1
  87. package/dist/esm/emails/SubscriptionPaymentCancellation.mjs +168 -0
  88. package/dist/esm/emails/SubscriptionPaymentCancellation.mjs.map +1 -0
  89. package/dist/esm/emails/SubscriptionPaymentError.mjs +168 -0
  90. package/dist/esm/emails/SubscriptionPaymentError.mjs.map +1 -0
  91. package/dist/esm/emails/SubscriptionPaymentSuccess.mjs +174 -0
  92. package/dist/esm/emails/SubscriptionPaymentSuccess.mjs.map +1 -0
  93. package/dist/esm/export.mjs.map +1 -1
  94. package/dist/esm/index.mjs +15 -5
  95. package/dist/esm/index.mjs.map +1 -1
  96. package/dist/esm/middlewares/sessionAuth.middleware.mjs +4 -6
  97. package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -1
  98. package/dist/esm/routes/dictionary.routes.mjs +2 -62
  99. package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
  100. package/dist/esm/routes/organization.routes.mjs +1 -25
  101. package/dist/esm/routes/organization.routes.mjs.map +1 -1
  102. package/dist/esm/routes/project.routes.mjs +10 -85
  103. package/dist/esm/routes/project.routes.mjs.map +1 -1
  104. package/dist/esm/routes/sessionAuth.routes.mjs +29 -26
  105. package/dist/esm/routes/sessionAuth.routes.mjs.map +1 -1
  106. package/dist/esm/routes/stripe.routes.mjs +17 -0
  107. package/dist/esm/routes/stripe.routes.mjs.map +1 -0
  108. package/dist/esm/routes/user.routes.mjs +6 -27
  109. package/dist/esm/routes/user.routes.mjs.map +1 -1
  110. package/dist/esm/schemas/organization.schema.mjs +5 -0
  111. package/dist/esm/schemas/organization.schema.mjs.map +1 -1
  112. package/dist/esm/schemas/plans.schema.mjs +2 -8
  113. package/dist/esm/schemas/plans.schema.mjs.map +1 -1
  114. package/dist/esm/schemas/user.schema.mjs +1 -1
  115. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  116. package/dist/esm/services/email.service.mjs +125 -43
  117. package/dist/esm/services/email.service.mjs.map +1 -1
  118. package/dist/esm/services/organization.service.mjs +51 -7
  119. package/dist/esm/services/organization.service.mjs.map +1 -1
  120. package/dist/esm/services/project.service.mjs +1 -3
  121. package/dist/esm/services/project.service.mjs.map +1 -1
  122. package/dist/esm/services/sessionAuth.service.mjs +9 -10
  123. package/dist/esm/services/sessionAuth.service.mjs.map +1 -1
  124. package/dist/esm/services/subscription.service.mjs +136 -53
  125. package/dist/esm/services/subscription.service.mjs.map +1 -1
  126. package/dist/esm/services/user.service.mjs +1 -3
  127. package/dist/esm/services/user.service.mjs.map +1 -1
  128. package/dist/esm/utils/errors/ErrorHandler.mjs +29 -9
  129. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
  130. package/dist/esm/utils/errors/ErrorsClass.mjs +17 -3
  131. package/dist/esm/utils/errors/ErrorsClass.mjs.map +1 -1
  132. package/dist/esm/utils/errors/errorCodes.mjs +99 -8
  133. package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
  134. package/dist/esm/utils/mapper/project.mjs +1 -1
  135. package/dist/esm/utils/mapper/project.mjs.map +1 -1
  136. package/dist/esm/utils/plan.mjs +7 -2
  137. package/dist/esm/utils/plan.mjs.map +1 -1
  138. package/dist/esm/utils/responseData.mjs +8 -0
  139. package/dist/esm/utils/responseData.mjs.map +1 -1
  140. package/dist/esm/webhooks/stripe.webhook.mjs +113 -0
  141. package/dist/esm/webhooks/stripe.webhook.mjs.map +1 -0
  142. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  143. package/dist/types/controllers/organization.controller.d.ts.map +1 -1
  144. package/dist/types/controllers/project.controller.d.ts.map +1 -1
  145. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  146. package/dist/types/controllers/sessionAuth.controller.d.ts +24 -5
  147. package/dist/types/controllers/sessionAuth.controller.d.ts.map +1 -1
  148. package/dist/types/controllers/stripe.controller.d.ts +17 -0
  149. package/dist/types/controllers/stripe.controller.d.ts.map +1 -0
  150. package/dist/types/controllers/user.controller.d.ts.map +1 -1
  151. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +20 -0
  152. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -0
  153. package/dist/types/emails/SubscriptionPaymentError.d.ts +20 -0
  154. package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -0
  155. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +20 -0
  156. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -0
  157. package/dist/types/export.d.ts +1 -0
  158. package/dist/types/export.d.ts.map +1 -1
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
  161. package/dist/types/models/organization.model.d.ts +1 -0
  162. package/dist/types/models/organization.model.d.ts.map +1 -1
  163. package/dist/types/routes/dictionary.routes.d.ts.map +1 -1
  164. package/dist/types/routes/organization.routes.d.ts.map +1 -1
  165. package/dist/types/routes/project.routes.d.ts.map +1 -1
  166. package/dist/types/routes/sessionAuth.routes.d.ts +15 -2
  167. package/dist/types/routes/sessionAuth.routes.d.ts.map +1 -1
  168. package/dist/types/routes/stripe.routes.d.ts +10 -0
  169. package/dist/types/routes/stripe.routes.d.ts.map +1 -0
  170. package/dist/types/routes/user.routes.d.ts.map +1 -1
  171. package/dist/types/schemas/organization.schema.d.ts +1 -0
  172. package/dist/types/schemas/organization.schema.d.ts.map +1 -1
  173. package/dist/types/schemas/plans.schema.d.ts.map +1 -1
  174. package/dist/types/services/email.service.d.ts +33 -4
  175. package/dist/types/services/email.service.d.ts.map +1 -1
  176. package/dist/types/services/organization.service.d.ts +15 -0
  177. package/dist/types/services/organization.service.d.ts.map +1 -1
  178. package/dist/types/services/project.service.d.ts.map +1 -1
  179. package/dist/types/services/sessionAuth.service.d.ts +1 -8
  180. package/dist/types/services/sessionAuth.service.d.ts.map +1 -1
  181. package/dist/types/services/subscription.service.d.ts +20 -5
  182. package/dist/types/services/subscription.service.d.ts.map +1 -1
  183. package/dist/types/services/user.service.d.ts.map +1 -1
  184. package/dist/types/types/organization.types.d.ts +2 -0
  185. package/dist/types/types/organization.types.d.ts.map +1 -1
  186. package/dist/types/types/plan.types.d.ts +2 -3
  187. package/dist/types/types/plan.types.d.ts.map +1 -1
  188. package/dist/types/types/session.types.d.ts +6 -6
  189. package/dist/types/types/session.types.d.ts.map +1 -1
  190. package/dist/types/utils/errors/ErrorHandler.d.ts +5 -3
  191. package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
  192. package/dist/types/utils/errors/ErrorsClass.d.ts +4 -1
  193. package/dist/types/utils/errors/ErrorsClass.d.ts.map +1 -1
  194. package/dist/types/utils/errors/errorCodes.d.ts +92 -1
  195. package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
  196. package/dist/types/utils/mapper/project.d.ts +1 -1
  197. package/dist/types/utils/mapper/project.d.ts.map +1 -1
  198. package/dist/types/utils/plan.d.ts +1 -1
  199. package/dist/types/utils/plan.d.ts.map +1 -1
  200. package/dist/types/utils/responseData.d.ts +13 -2
  201. package/dist/types/utils/responseData.d.ts.map +1 -1
  202. package/dist/types/webhooks/stripe.d.ts.map +1 -1
  203. package/dist/types/webhooks/stripe.webhook.d.ts +3 -0
  204. package/dist/types/webhooks/stripe.webhook.d.ts.map +1 -0
  205. package/package.json +6 -5
  206. package/dist/cjs/models/plan.moddel.cjs.map +0 -1
  207. package/dist/cjs/services/plans.service.cjs +0 -72
  208. package/dist/cjs/services/plans.service.cjs.map +0 -1
  209. package/dist/cjs/webhooks/stripe.cjs +0 -94
  210. package/dist/cjs/webhooks/stripe.cjs.map +0 -1
  211. package/dist/esm/models/plan.moddel.mjs +0 -7
  212. package/dist/esm/models/plan.moddel.mjs.map +0 -1
  213. package/dist/esm/services/plans.service.mjs +0 -44
  214. package/dist/esm/services/plans.service.mjs.map +0 -1
  215. package/dist/esm/webhooks/stripe.mjs +0 -70
  216. 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
- if (emailProvider.emailValidated) {
83
- import_errors.ErrorHandler.handleGenericErrorResponse(
84
- res,
85
- "EMAIL_ALREADY_VALIDATED"
86
- );
87
- return;
88
- } else {
89
- user2 = await sessionAuthService.updateUserProvider(
90
- user2._id,
91
- "email",
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(userData);
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 sessionAuthService.setUserAuth(res, user2);
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)({ data: formattedUser });
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)({ data: formattedUser });
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)({ data: void 0 });
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
- try {
175
- const { error } = await sessionAuthService.testUserPassword(
176
- user.email,
177
- oldPassword
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
- if (error) {
180
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "LOGIN_FAILED");
181
- return;
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)({ data: formattedUser });
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 { organization } = res.locals;
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
- await sessionAuthService.activateUser(user._id, secret);
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: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
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)({ data: void 0 });
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)({ data: formattedUser });
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
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
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: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
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: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
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