@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.
Files changed (272) hide show
  1. package/dist/cjs/controllers/dictionary.controller.cjs +91 -18
  2. package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
  3. package/dist/cjs/controllers/organization.controller.cjs +140 -12
  4. package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
  5. package/dist/cjs/controllers/project.controller.cjs +181 -31
  6. package/dist/cjs/controllers/project.controller.cjs.map +1 -1
  7. package/dist/cjs/controllers/projectAccessKey.controller.cjs +61 -10
  8. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
  9. package/dist/cjs/controllers/sessionAuth.controller.cjs +291 -62
  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 +49 -20
  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 +16 -5
  23. package/dist/cjs/index.cjs.map +1 -1
  24. package/dist/cjs/middlewares/oAuth2.middleware.cjs +10 -0
  25. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +1 -1
  26. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +50 -10
  27. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +1 -1
  28. package/dist/cjs/routes/dictionary.routes.cjs +2 -62
  29. package/dist/cjs/routes/dictionary.routes.cjs.map +1 -1
  30. package/dist/cjs/routes/organization.routes.cjs +1 -25
  31. package/dist/cjs/routes/organization.routes.cjs.map +1 -1
  32. package/dist/cjs/routes/project.routes.cjs +10 -85
  33. package/dist/cjs/routes/project.routes.cjs.map +1 -1
  34. package/dist/cjs/routes/sessionAuth.routes.cjs +26 -25
  35. package/dist/cjs/routes/sessionAuth.routes.cjs.map +1 -1
  36. package/dist/cjs/routes/stripe.routes.cjs +42 -0
  37. package/dist/cjs/routes/stripe.routes.cjs.map +1 -0
  38. package/dist/cjs/routes/user.routes.cjs +6 -27
  39. package/dist/cjs/routes/user.routes.cjs.map +1 -1
  40. package/dist/cjs/schemas/organization.schema.cjs +5 -0
  41. package/dist/cjs/schemas/organization.schema.cjs.map +1 -1
  42. package/dist/cjs/{middlewares/admin.middleware.cjs → schemas/plans.schema.cjs} +32 -20
  43. package/dist/cjs/schemas/plans.schema.cjs.map +1 -0
  44. package/dist/cjs/schemas/project.schema.cjs +14 -1
  45. package/dist/cjs/schemas/project.schema.cjs.map +1 -1
  46. package/dist/cjs/schemas/user.schema.cjs +5 -1
  47. package/dist/cjs/schemas/user.schema.cjs.map +1 -1
  48. package/dist/cjs/services/dictionary.service.cjs.map +1 -1
  49. package/dist/cjs/services/email.service.cjs +113 -43
  50. package/dist/cjs/services/email.service.cjs.map +1 -1
  51. package/dist/cjs/services/oAuth2.service.cjs +16 -8
  52. package/dist/cjs/services/oAuth2.service.cjs.map +1 -1
  53. package/dist/cjs/services/organization.service.cjs +63 -8
  54. package/dist/cjs/services/organization.service.cjs.map +1 -1
  55. package/dist/cjs/services/project.service.cjs +9 -5
  56. package/dist/cjs/services/project.service.cjs.map +1 -1
  57. package/dist/cjs/services/projectAccessKey.service.cjs +42 -10
  58. package/dist/cjs/services/projectAccessKey.service.cjs.map +1 -1
  59. package/dist/cjs/services/sessionAuth.service.cjs +9 -11
  60. package/dist/cjs/services/sessionAuth.service.cjs.map +1 -1
  61. package/dist/cjs/services/subscription.service.cjs +201 -0
  62. package/dist/cjs/services/subscription.service.cjs.map +1 -0
  63. package/dist/cjs/services/user.service.cjs +1 -3
  64. package/dist/cjs/services/user.service.cjs.map +1 -1
  65. package/dist/cjs/types/dictionary.types.cjs.map +1 -1
  66. package/dist/cjs/types/organization.types.cjs.map +1 -1
  67. package/dist/cjs/types/plan.types.cjs +17 -0
  68. package/dist/cjs/types/plan.types.cjs.map +1 -0
  69. package/dist/cjs/types/project.types.cjs.map +1 -1
  70. package/dist/cjs/types/session.types.cjs.map +1 -1
  71. package/dist/cjs/types/user.types.cjs.map +1 -1
  72. package/dist/cjs/utils/errors/ErrorHandler.cjs +29 -9
  73. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -1
  74. package/dist/cjs/utils/errors/ErrorsClass.cjs +17 -3
  75. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +1 -1
  76. package/dist/cjs/utils/errors/errorCodes.cjs +321 -9
  77. package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
  78. package/dist/cjs/utils/mapper/organization.cjs.map +1 -1
  79. package/dist/cjs/utils/mapper/project.cjs +19 -3
  80. package/dist/cjs/utils/mapper/project.cjs.map +1 -1
  81. package/dist/cjs/utils/mapper/user.cjs.map +1 -1
  82. package/dist/cjs/utils/plan.cjs +75 -0
  83. package/dist/cjs/utils/plan.cjs.map +1 -0
  84. package/dist/cjs/utils/responseData.cjs +8 -0
  85. package/dist/cjs/utils/responseData.cjs.map +1 -1
  86. package/dist/cjs/webhooks/stripe.webhook.cjs +133 -0
  87. package/dist/cjs/webhooks/stripe.webhook.cjs.map +1 -0
  88. package/dist/esm/controllers/dictionary.controller.mjs +91 -18
  89. package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
  90. package/dist/esm/controllers/organization.controller.mjs +140 -12
  91. package/dist/esm/controllers/organization.controller.mjs.map +1 -1
  92. package/dist/esm/controllers/project.controller.mjs +181 -31
  93. package/dist/esm/controllers/project.controller.mjs.map +1 -1
  94. package/dist/esm/controllers/projectAccessKey.controller.mjs +61 -10
  95. package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
  96. package/dist/esm/controllers/sessionAuth.controller.mjs +287 -61
  97. package/dist/esm/controllers/sessionAuth.controller.mjs.map +1 -1
  98. package/dist/esm/controllers/stripe.controller.mjs +60 -0
  99. package/dist/esm/controllers/stripe.controller.mjs.map +1 -0
  100. package/dist/esm/controllers/user.controller.mjs +49 -20
  101. package/dist/esm/controllers/user.controller.mjs.map +1 -1
  102. package/dist/esm/emails/SubscriptionPaymentCancellation.mjs +168 -0
  103. package/dist/esm/emails/SubscriptionPaymentCancellation.mjs.map +1 -0
  104. package/dist/esm/emails/SubscriptionPaymentError.mjs +168 -0
  105. package/dist/esm/emails/SubscriptionPaymentError.mjs.map +1 -0
  106. package/dist/esm/emails/SubscriptionPaymentSuccess.mjs +174 -0
  107. package/dist/esm/emails/SubscriptionPaymentSuccess.mjs.map +1 -0
  108. package/dist/esm/export.mjs.map +1 -1
  109. package/dist/esm/index.mjs +19 -7
  110. package/dist/esm/index.mjs.map +1 -1
  111. package/dist/esm/middlewares/oAuth2.middleware.mjs +10 -0
  112. package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -1
  113. package/dist/esm/middlewares/sessionAuth.middleware.mjs +49 -9
  114. package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -1
  115. package/dist/esm/routes/dictionary.routes.mjs +2 -62
  116. package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
  117. package/dist/esm/routes/organization.routes.mjs +1 -25
  118. package/dist/esm/routes/organization.routes.mjs.map +1 -1
  119. package/dist/esm/routes/project.routes.mjs +10 -85
  120. package/dist/esm/routes/project.routes.mjs.map +1 -1
  121. package/dist/esm/routes/sessionAuth.routes.mjs +29 -26
  122. package/dist/esm/routes/sessionAuth.routes.mjs.map +1 -1
  123. package/dist/esm/routes/stripe.routes.mjs +17 -0
  124. package/dist/esm/routes/stripe.routes.mjs.map +1 -0
  125. package/dist/esm/routes/user.routes.mjs +6 -27
  126. package/dist/esm/routes/user.routes.mjs.map +1 -1
  127. package/dist/esm/schemas/organization.schema.mjs +5 -0
  128. package/dist/esm/schemas/organization.schema.mjs.map +1 -1
  129. package/dist/esm/schemas/plans.schema.mjs +32 -0
  130. package/dist/esm/schemas/plans.schema.mjs.map +1 -0
  131. package/dist/esm/schemas/project.schema.mjs +13 -1
  132. package/dist/esm/schemas/project.schema.mjs.map +1 -1
  133. package/dist/esm/schemas/user.schema.mjs +5 -1
  134. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  135. package/dist/esm/services/dictionary.service.mjs.map +1 -1
  136. package/dist/esm/services/email.service.mjs +125 -43
  137. package/dist/esm/services/email.service.mjs.map +1 -1
  138. package/dist/esm/services/oAuth2.service.mjs +16 -8
  139. package/dist/esm/services/oAuth2.service.mjs.map +1 -1
  140. package/dist/esm/services/organization.service.mjs +58 -7
  141. package/dist/esm/services/organization.service.mjs.map +1 -1
  142. package/dist/esm/services/project.service.mjs +9 -5
  143. package/dist/esm/services/project.service.mjs.map +1 -1
  144. package/dist/esm/services/projectAccessKey.service.mjs +42 -10
  145. package/dist/esm/services/projectAccessKey.service.mjs.map +1 -1
  146. package/dist/esm/services/sessionAuth.service.mjs +9 -10
  147. package/dist/esm/services/sessionAuth.service.mjs.map +1 -1
  148. package/dist/esm/services/subscription.service.mjs +178 -0
  149. package/dist/esm/services/subscription.service.mjs.map +1 -0
  150. package/dist/esm/services/user.service.mjs +1 -3
  151. package/dist/esm/services/user.service.mjs.map +1 -1
  152. package/dist/esm/types/plan.types.mjs +1 -0
  153. package/dist/esm/types/plan.types.mjs.map +1 -0
  154. package/dist/esm/utils/errors/ErrorHandler.mjs +29 -9
  155. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
  156. package/dist/esm/utils/errors/ErrorsClass.mjs +17 -3
  157. package/dist/esm/utils/errors/ErrorsClass.mjs.map +1 -1
  158. package/dist/esm/utils/errors/errorCodes.mjs +321 -9
  159. package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
  160. package/dist/esm/utils/mapper/organization.mjs.map +1 -1
  161. package/dist/esm/utils/mapper/project.mjs +17 -2
  162. package/dist/esm/utils/mapper/project.mjs.map +1 -1
  163. package/dist/esm/utils/mapper/user.mjs.map +1 -1
  164. package/dist/esm/utils/plan.mjs +50 -0
  165. package/dist/esm/utils/plan.mjs.map +1 -0
  166. package/dist/esm/utils/responseData.mjs +8 -0
  167. package/dist/esm/utils/responseData.mjs.map +1 -1
  168. package/dist/esm/webhooks/stripe.webhook.mjs +113 -0
  169. package/dist/esm/webhooks/stripe.webhook.mjs.map +1 -0
  170. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  171. package/dist/types/controllers/organization.controller.d.ts.map +1 -1
  172. package/dist/types/controllers/project.controller.d.ts +9 -7
  173. package/dist/types/controllers/project.controller.d.ts.map +1 -1
  174. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  175. package/dist/types/controllers/sessionAuth.controller.d.ts +28 -9
  176. package/dist/types/controllers/sessionAuth.controller.d.ts.map +1 -1
  177. package/dist/types/controllers/stripe.controller.d.ts +17 -0
  178. package/dist/types/controllers/stripe.controller.d.ts.map +1 -0
  179. package/dist/types/controllers/user.controller.d.ts.map +1 -1
  180. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +20 -0
  181. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -0
  182. package/dist/types/emails/SubscriptionPaymentError.d.ts +20 -0
  183. package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -0
  184. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +20 -0
  185. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -0
  186. package/dist/types/export.d.ts +2 -0
  187. package/dist/types/export.d.ts.map +1 -1
  188. package/dist/types/index.d.ts.map +1 -1
  189. package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -1
  190. package/dist/types/middlewares/sessionAuth.middleware.d.ts +13 -7
  191. package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
  192. package/dist/types/models/dictionary.model.d.ts +1 -1
  193. package/dist/types/models/oAuth2.model.d.ts +1 -1
  194. package/dist/types/models/organization.model.d.ts +2 -1
  195. package/dist/types/models/organization.model.d.ts.map +1 -1
  196. package/dist/types/models/plan.moddel.d.ts +11 -0
  197. package/dist/types/models/plan.moddel.d.ts.map +1 -0
  198. package/dist/types/models/project.model.d.ts +1 -1
  199. package/dist/types/routes/dictionary.routes.d.ts.map +1 -1
  200. package/dist/types/routes/organization.routes.d.ts.map +1 -1
  201. package/dist/types/routes/project.routes.d.ts.map +1 -1
  202. package/dist/types/routes/sessionAuth.routes.d.ts +15 -2
  203. package/dist/types/routes/sessionAuth.routes.d.ts.map +1 -1
  204. package/dist/types/routes/stripe.routes.d.ts +10 -0
  205. package/dist/types/routes/stripe.routes.d.ts.map +1 -0
  206. package/dist/types/routes/user.routes.d.ts.map +1 -1
  207. package/dist/types/schemas/dictionary.schema.d.ts +2 -2
  208. package/dist/types/schemas/oAuth2.schema.d.ts +2 -2
  209. package/dist/types/schemas/organization.schema.d.ts +3 -2
  210. package/dist/types/schemas/organization.schema.d.ts.map +1 -1
  211. package/dist/types/schemas/plans.schema.d.ts +16 -0
  212. package/dist/types/schemas/plans.schema.d.ts.map +1 -0
  213. package/dist/types/schemas/project.schema.d.ts +12 -3
  214. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  215. package/dist/types/schemas/user.schema.d.ts +2 -2
  216. package/dist/types/schemas/user.schema.d.ts.map +1 -1
  217. package/dist/types/services/dictionary.service.d.ts +9 -9
  218. package/dist/types/services/dictionary.service.d.ts.map +1 -1
  219. package/dist/types/services/email.service.d.ts +33 -4
  220. package/dist/types/services/email.service.d.ts.map +1 -1
  221. package/dist/types/services/oAuth2.service.d.ts +7 -5
  222. package/dist/types/services/oAuth2.service.d.ts.map +1 -1
  223. package/dist/types/services/organization.service.d.ts +27 -6
  224. package/dist/types/services/organization.service.d.ts.map +1 -1
  225. package/dist/types/services/plans.service.d.ts +35 -0
  226. package/dist/types/services/plans.service.d.ts.map +1 -0
  227. package/dist/types/services/project.service.d.ts +6 -6
  228. package/dist/types/services/project.service.d.ts.map +1 -1
  229. package/dist/types/services/projectAccessKey.service.d.ts +4 -4
  230. package/dist/types/services/projectAccessKey.service.d.ts.map +1 -1
  231. package/dist/types/services/sessionAuth.service.d.ts +9 -16
  232. package/dist/types/services/sessionAuth.service.d.ts.map +1 -1
  233. package/dist/types/services/subscription.service.d.ts +22 -0
  234. package/dist/types/services/subscription.service.d.ts.map +1 -0
  235. package/dist/types/services/user.service.d.ts +11 -19
  236. package/dist/types/services/user.service.d.ts.map +1 -1
  237. package/dist/types/types/dictionary.types.d.ts +2 -2
  238. package/dist/types/types/dictionary.types.d.ts.map +1 -1
  239. package/dist/types/types/organization.types.d.ts +4 -2
  240. package/dist/types/types/organization.types.d.ts.map +1 -1
  241. package/dist/types/types/plan.types.d.ts +18 -0
  242. package/dist/types/types/plan.types.d.ts.map +1 -0
  243. package/dist/types/types/project.types.d.ts +13 -2
  244. package/dist/types/types/project.types.d.ts.map +1 -1
  245. package/dist/types/types/session.types.d.ts +6 -6
  246. package/dist/types/types/session.types.d.ts.map +1 -1
  247. package/dist/types/types/user.types.d.ts +2 -1
  248. package/dist/types/types/user.types.d.ts.map +1 -1
  249. package/dist/types/utils/errors/ErrorHandler.d.ts +5 -3
  250. package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
  251. package/dist/types/utils/errors/ErrorsClass.d.ts +4 -1
  252. package/dist/types/utils/errors/ErrorsClass.d.ts.map +1 -1
  253. package/dist/types/utils/errors/errorCodes.d.ts +313 -1
  254. package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
  255. package/dist/types/utils/mapper/organization.d.ts +1 -1
  256. package/dist/types/utils/mapper/organization.d.ts.map +1 -1
  257. package/dist/types/utils/mapper/project.d.ts +10 -1
  258. package/dist/types/utils/mapper/project.d.ts.map +1 -1
  259. package/dist/types/utils/mapper/user.d.ts +1 -1
  260. package/dist/types/utils/mapper/user.d.ts.map +1 -1
  261. package/dist/types/utils/plan.d.ts +17 -0
  262. package/dist/types/utils/plan.d.ts.map +1 -0
  263. package/dist/types/utils/responseData.d.ts +13 -2
  264. package/dist/types/utils/responseData.d.ts.map +1 -1
  265. package/dist/types/webhooks/stripe.d.ts +3 -0
  266. package/dist/types/webhooks/stripe.d.ts.map +1 -0
  267. package/dist/types/webhooks/stripe.webhook.d.ts +3 -0
  268. package/dist/types/webhooks/stripe.webhook.d.ts.map +1 -0
  269. package/package.json +27 -24
  270. package/dist/cjs/middlewares/admin.middleware.cjs.map +0 -1
  271. package/dist/esm/middlewares/admin.middleware.mjs +0 -20
  272. package/dist/esm/middlewares/admin.middleware.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');
@@ -51,8 +55,11 @@ var userService = __toESM(require('./../services/user.service.cjs'), 1);
51
55
  var import_CSRF = require('./../utils/CSRF.cjs');
52
56
  var import_errors = require('./../utils/errors/index.cjs');
53
57
  var import_httpStatusCodes = require('./../utils/httpStatusCodes.cjs');
58
+ var import_organization = require('./../utils/mapper/organization.cjs');
59
+ var import_project = require('./../utils/mapper/project.cjs');
54
60
  var import_user = require('./../utils/mapper/user.cjs');
55
61
  var import_responseData = require('./../utils/responseData.cjs');
62
+ var import_express_intlayer = require("express-intlayer");
56
63
  var import_mongoose = require("mongoose");
57
64
  var import_uuid = require("uuid");
58
65
  const setCSRFToken = (req, res, _next) => {
@@ -65,10 +72,15 @@ const setCSRFToken = (req, res, _next) => {
65
72
  };
66
73
  const registerEmailPassword = async (req, res, _next) => {
67
74
  const { user } = res.locals;
75
+ const { callBack_url } = req.query;
68
76
  if (user) {
69
77
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
70
78
  return;
71
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
+ }
72
84
  const userData = req.body;
73
85
  try {
74
86
  let user2 = await userService.getUserByEmail(userData.email);
@@ -76,22 +88,18 @@ const registerEmailPassword = async (req, res, _next) => {
76
88
  const emailProvider = user2.provider?.find(
77
89
  (provider) => provider.provider === "email"
78
90
  );
79
- if (emailProvider) {
80
- if (emailProvider.emailValidated) {
81
- import_errors.ErrorHandler.handleGenericErrorResponse(
82
- res,
83
- "EMAIL_ALREADY_VALIDATED"
84
- );
85
- return;
86
- } else {
87
- user2 = await sessionAuthService.updateUserProvider(
88
- user2._id,
89
- "email",
90
- {
91
- secret: (0, import_uuid.v4)()
92
- }
93
- );
94
- }
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
+ });
95
103
  } else {
96
104
  user2 = await sessionAuthService.addUserProvider(user2._id, {
97
105
  provider: "email",
@@ -100,7 +108,16 @@ const registerEmailPassword = async (req, res, _next) => {
100
108
  });
101
109
  }
102
110
  } else {
103
- 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
+ });
104
121
  import_logger.logger.info(`New registration: ${user2.name} - ${user2.email}`);
105
122
  }
106
123
  if (!user2) {
@@ -109,9 +126,30 @@ const registerEmailPassword = async (req, res, _next) => {
109
126
  });
110
127
  return;
111
128
  }
112
- 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
+ });
113
139
  const formattedUser = (0, import_user.mapUserToAPI)(user2);
114
- 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
+ });
115
153
  res.json(responseData);
116
154
  return;
117
155
  } catch (error) {
@@ -140,7 +178,19 @@ const loginEmailPassword = async (req, res, _next) => {
140
178
  }
141
179
  await sessionAuthService.setUserAuth(res, loggedInUser);
142
180
  const formattedUser = (0, import_user.mapUserToAPI)(loggedInUser);
143
- 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
+ });
144
194
  import_logger.logger.info(`Login: ${loggedInUser.email}`);
145
195
  res.json(responseData);
146
196
  return;
@@ -152,37 +202,63 @@ const loginEmailPassword = async (req, res, _next) => {
152
202
  const logOut = async (_req, res, _next) => {
153
203
  const { user } = res.locals;
154
204
  if (!user) {
155
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
205
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
156
206
  return;
157
207
  }
158
208
  await sessionAuthService.clearUserAuth(res);
159
209
  sessionAuthService.clearOrganizationAuth(res);
160
210
  sessionAuthService.clearProjectAuth(res);
161
211
  import_logger.logger.info(`Logout: ${user.name} - ${user.email}`);
162
- 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
+ });
163
225
  res.json(responseData);
164
226
  };
165
227
  const updatePassword = async (req, res, _next) => {
166
228
  const { oldPassword, newPassword } = req.body;
167
229
  let { user } = res.locals;
168
230
  if (!user) {
169
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
231
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
170
232
  return;
171
233
  }
172
- try {
173
- const { error } = await sessionAuthService.testUserPassword(
174
- user.email,
175
- 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"
176
247
  );
177
- if (error) {
178
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "LOGIN_FAILED");
179
- 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
+ }
180
260
  }
181
- user = await sessionAuthService.changeUserPassword(
182
- user._id,
183
- oldPassword,
184
- newPassword
185
- );
261
+ user = await sessionAuthService.changeUserPassword(user._id, newPassword);
186
262
  if (!user || typeof user !== "object") {
187
263
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
188
264
  return;
@@ -191,7 +267,65 @@ const updatePassword = async (req, res, _next) => {
191
267
  `Password changed - User : Name : ${user.name}, id : ${String(user._id)}`
192
268
  );
193
269
  const formattedUser = (0, import_user.mapUserToAPI)(user);
194
- 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
+ });
195
329
  res.json(responseData);
196
330
  return;
197
331
  } catch (error) {
@@ -201,33 +335,75 @@ const updatePassword = async (req, res, _next) => {
201
335
  };
202
336
  const validEmail = async (req, res, _next) => {
203
337
  const { userId, secret } = req.params;
204
- const { organization } = res.locals;
338
+ const callBack_url = `${req.query.callBack_url ?? `${process.env.CLIENT_URL}/auth/login`}?userId=${userId}`;
205
339
  if (!import_mongoose.Types.ObjectId.isValid(userId.toString())) {
206
340
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "INVALID_USER_ID");
207
341
  return;
208
342
  }
209
- if (!organization) {
210
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
211
- return;
212
- }
213
343
  const user = await userService.getUserById(userId);
214
344
  if (!user) {
215
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND", { userId });
345
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED", {
346
+ userId
347
+ });
216
348
  return;
217
349
  }
218
- 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
+ });
219
370
  import_logger.logger.info(
220
371
  `User activated - User: Name: ${user.name}, id: ${String(user._id)}`
221
372
  );
373
+ sendVerificationUpdate(user);
374
+ await sessionAuthService.setUserAuth(res, user);
222
375
  await (0, import_email.sendEmail)({
223
376
  type: "welcome",
224
377
  to: user.email,
225
378
  username: user.name,
226
- 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);
227
406
  });
228
- const formattedUser = (0, import_user.mapUserToAPI)(user);
229
- const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
230
- res.json(responseData);
231
407
  };
232
408
  const askResetPassword = async (req, res, _next) => {
233
409
  const { email } = req.body;
@@ -255,7 +431,19 @@ const askResetPassword = async (req, res, _next) => {
255
431
  )?.secret ?? ""
256
432
  })
257
433
  });
258
- 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
+ });
259
447
  res.json(responseData);
260
448
  return;
261
449
  } catch (error) {
@@ -290,7 +478,19 @@ const resetPassword = async (req, res, _next) => {
290
478
  username: updatedUser.name
291
479
  });
292
480
  const formattedUser = (0, import_user.mapUserToAPI)(updatedUser);
293
- 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
+ });
294
494
  res.json(responseData);
295
495
  return;
296
496
  } catch (error) {
@@ -301,26 +501,35 @@ const resetPassword = async (req, res, _next) => {
301
501
  const getSessionInformation = async (req, res, _next) => {
302
502
  const { session_token: sessionToken } = req.query;
303
503
  let { user } = res.locals;
304
- const { organization, project } = res.locals;
504
+ const { organization, project, isOrganizationAdmin, isProjectAdmin } = res.locals;
305
505
  try {
306
506
  if (sessionToken) {
307
507
  user = await userService.getUserBySession(sessionToken);
308
508
  }
309
- if (!user) {
310
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
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);
311
519
  return;
312
520
  }
313
521
  const session = user.session;
314
- if (!session) {
315
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_FOUND");
316
- return;
317
- }
318
522
  const formattedUser = {
319
523
  ...(0, import_user.mapUserToAPI)(user),
320
524
  role: "user"
321
525
  };
322
526
  const responseData = (0, import_responseData.formatResponse)({
323
- data: { session, user: formattedUser, organization, project }
527
+ data: {
528
+ session,
529
+ user: formattedUser,
530
+ organization: organization?._id ? (0, import_organization.mapOrganizationToAPI)(organization, isOrganizationAdmin) : null,
531
+ project: project?._id ? (0, import_project.mapProjectToAPI)(project, user, isProjectAdmin) : null
532
+ }
324
533
  });
325
534
  res.json(responseData);
326
535
  return;
@@ -336,11 +545,15 @@ const githubLoginQuery = (req, res, _next) => {
336
545
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_ALREADY_LOGGED_IN");
337
546
  return;
338
547
  }
548
+ if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
549
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
550
+ return;
551
+ }
339
552
  const encodedOrigin = encodeURIComponent(origin);
340
553
  const redirectURI = `${process.env.BACKEND_URL}/api/auth/callback/github?redirect_uri=${encodedOrigin}`;
341
554
  const encodedRedirectURI = encodeURIComponent(redirectURI);
342
555
  res.redirect(
343
- `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`
344
557
  );
345
558
  };
346
559
  const githubCallback = async (req, res, _next) => {
@@ -357,6 +570,10 @@ const githubCallback = async (req, res, _next) => {
357
570
  res.redirect(redirect_uri);
358
571
  return;
359
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
+ }
360
577
  try {
361
578
  const tokenResponse = await fetch(
362
579
  "https://github.com/login/oauth/access_token",
@@ -454,7 +671,7 @@ const githubCallback = async (req, res, _next) => {
454
671
  type: "welcome",
455
672
  to: user.email,
456
673
  username: user.name,
457
- loginLink: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
674
+ loginLink: `${process.env.CLIENT_URL}/auth/login`
458
675
  });
459
676
  res.redirect(redirect_uri);
460
677
  } catch (error) {
@@ -471,6 +688,10 @@ const googleLoginQuery = (req, res, _next) => {
471
688
  res.redirect(origin);
472
689
  return;
473
690
  }
691
+ if (origin && !origin.startsWith(process.env.CLIENT_URL ?? "")) {
692
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "CALLBACK_URL_NOT_VALID");
693
+ return;
694
+ }
474
695
  const responseType = "code";
475
696
  const scope = [
476
697
  "https%3A//www.googleapis.com/auth/userinfo.email",
@@ -502,6 +723,10 @@ const googleCallback = async (req, res, _next) => {
502
723
  res.redirect(responseCode, redirect_uri);
503
724
  return;
504
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
+ }
505
730
  try {
506
731
  const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
507
732
  method: "POST",
@@ -590,8 +815,9 @@ const googleCallback = async (req, res, _next) => {
590
815
  type: "welcome",
591
816
  to: user.email,
592
817
  username: user.name,
593
- loginLink: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
818
+ loginLink: `${process.env.CLIENT_URL}/auth/login`
594
819
  });
820
+ res.redirect(redirect_uri);
595
821
  } catch (error) {
596
822
  import_errors.ErrorHandler.handleAppErrorResponse(res, error);
597
823
  return;
@@ -600,6 +826,7 @@ const googleCallback = async (req, res, _next) => {
600
826
  // Annotate the CommonJS export names for ESM import in node:
601
827
  0 && (module.exports = {
602
828
  askResetPassword,
829
+ checkIfUserHasPassword,
603
830
  getSessionInformation,
604
831
  githubCallback,
605
832
  githubLoginQuery,
@@ -609,8 +836,10 @@ const googleCallback = async (req, res, _next) => {
609
836
  loginEmailPassword,
610
837
  registerEmailPassword,
611
838
  resetPassword,
839
+ sendVerificationUpdate,
612
840
  setCSRFToken,
613
841
  updatePassword,
614
- validEmail
842
+ validEmail,
843
+ verifyEmailStatusSSE
615
844
  });
616
845
  //# sourceMappingURL=sessionAuth.controller.cjs.map