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