@intlayer/backend 3.0.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 (464) hide show
  1. package/LICENSE +202 -0
  2. package/dist/cjs/controllers/dictionary.controller.cjs +356 -0
  3. package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -0
  4. package/dist/cjs/controllers/oAuth2.controller.cjs +46 -0
  5. package/dist/cjs/controllers/oAuth2.controller.cjs.map +1 -0
  6. package/dist/cjs/controllers/organization.controller.cjs +354 -0
  7. package/dist/cjs/controllers/organization.controller.cjs.map +1 -0
  8. package/dist/cjs/controllers/project.controller.cjs +298 -0
  9. package/dist/cjs/controllers/project.controller.cjs.map +1 -0
  10. package/dist/cjs/controllers/projectAccessKey.controller.cjs +134 -0
  11. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -0
  12. package/dist/cjs/controllers/sessionAuth.controller.cjs +616 -0
  13. package/dist/cjs/controllers/sessionAuth.controller.cjs.map +1 -0
  14. package/dist/cjs/controllers/user.controller.cjs +197 -0
  15. package/dist/cjs/controllers/user.controller.cjs.map +1 -0
  16. package/dist/cjs/emails/InviteUserEmail.cjs +297 -0
  17. package/dist/cjs/emails/InviteUserEmail.cjs.map +1 -0
  18. package/dist/cjs/emails/PasswordChangeConfirmation.cjs +148 -0
  19. package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +1 -0
  20. package/dist/cjs/emails/ResetUserPassword.cjs +209 -0
  21. package/dist/cjs/emails/ResetUserPassword.cjs.map +1 -0
  22. package/dist/cjs/emails/ValidateUserEmail.cjs +230 -0
  23. package/dist/cjs/emails/ValidateUserEmail.cjs.map +1 -0
  24. package/dist/cjs/emails/Welcome.cjs +185 -0
  25. package/dist/cjs/emails/Welcome.cjs.map +1 -0
  26. package/dist/cjs/emails/index.cjs +31 -0
  27. package/dist/cjs/emails/index.cjs.map +1 -0
  28. package/dist/cjs/export.cjs +46 -0
  29. package/dist/cjs/export.cjs.map +1 -0
  30. package/dist/cjs/index.cjs +122 -0
  31. package/dist/cjs/index.cjs.map +1 -0
  32. package/dist/cjs/logger/index.cjs +53 -0
  33. package/dist/cjs/logger/index.cjs.map +1 -0
  34. package/dist/cjs/middlewares/admin.middleware.cjs +44 -0
  35. package/dist/cjs/middlewares/admin.middleware.cjs.map +1 -0
  36. package/dist/cjs/middlewares/oAuth2.middleware.cjs +89 -0
  37. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +1 -0
  38. package/dist/cjs/middlewares/request.middleware.cjs +41 -0
  39. package/dist/cjs/middlewares/request.middleware.cjs.map +1 -0
  40. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +130 -0
  41. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +1 -0
  42. package/dist/cjs/models/dictionary.model.cjs +34 -0
  43. package/dist/cjs/models/dictionary.model.cjs.map +1 -0
  44. package/dist/cjs/models/oAuth2.model.cjs +31 -0
  45. package/dist/cjs/models/oAuth2.model.cjs.map +1 -0
  46. package/dist/cjs/models/organization.model.cjs +34 -0
  47. package/dist/cjs/models/organization.model.cjs.map +1 -0
  48. package/dist/cjs/models/project.model.cjs +31 -0
  49. package/dist/cjs/models/project.model.cjs.map +1 -0
  50. package/dist/cjs/models/user.model.cjs +31 -0
  51. package/dist/cjs/models/user.model.cjs.map +1 -0
  52. package/dist/cjs/routes/dictionary.routes.cjs +156 -0
  53. package/dist/cjs/routes/dictionary.routes.cjs.map +1 -0
  54. package/dist/cjs/routes/organization.routes.cjs +132 -0
  55. package/dist/cjs/routes/organization.routes.cjs.map +1 -0
  56. package/dist/cjs/routes/project.routes.cjs +175 -0
  57. package/dist/cjs/routes/project.routes.cjs.map +1 -0
  58. package/dist/cjs/routes/sessionAuth.routes.cjs +147 -0
  59. package/dist/cjs/routes/sessionAuth.routes.cjs.map +1 -0
  60. package/dist/cjs/routes/user.routes.cjs +96 -0
  61. package/dist/cjs/routes/user.routes.cjs.map +1 -0
  62. package/dist/cjs/schemas/dictionary.schema.cjs +69 -0
  63. package/dist/cjs/schemas/dictionary.schema.cjs.map +1 -0
  64. package/dist/cjs/schemas/oAuth2.schema.cjs +55 -0
  65. package/dist/cjs/schemas/oAuth2.schema.cjs.map +1 -0
  66. package/dist/cjs/schemas/organization.schema.cjs +60 -0
  67. package/dist/cjs/schemas/organization.schema.cjs.map +1 -0
  68. package/dist/cjs/schemas/project.schema.cjs +79 -0
  69. package/dist/cjs/schemas/project.schema.cjs.map +1 -0
  70. package/dist/cjs/schemas/user.schema.cjs +112 -0
  71. package/dist/cjs/schemas/user.schema.cjs.map +1 -0
  72. package/dist/cjs/services/dictionary.service.cjs +166 -0
  73. package/dist/cjs/services/dictionary.service.cjs.map +1 -0
  74. package/dist/cjs/services/email.service.cjs +118 -0
  75. package/dist/cjs/services/email.service.cjs.map +1 -0
  76. package/dist/cjs/services/oAuth2.service.cjs +182 -0
  77. package/dist/cjs/services/oAuth2.service.cjs.map +1 -0
  78. package/dist/cjs/services/organization.service.cjs +95 -0
  79. package/dist/cjs/services/organization.service.cjs.map +1 -0
  80. package/dist/cjs/services/project.service.cjs +87 -0
  81. package/dist/cjs/services/project.service.cjs.map +1 -0
  82. package/dist/cjs/services/projectAccessKey.service.cjs +139 -0
  83. package/dist/cjs/services/projectAccessKey.service.cjs.map +1 -0
  84. package/dist/cjs/services/sessionAuth.service.cjs +386 -0
  85. package/dist/cjs/services/sessionAuth.service.cjs.map +1 -0
  86. package/dist/cjs/services/user.service.cjs +155 -0
  87. package/dist/cjs/services/user.service.cjs.map +1 -0
  88. package/dist/cjs/types/Routes.cjs +17 -0
  89. package/dist/cjs/types/Routes.cjs.map +1 -0
  90. package/dist/cjs/types/dictionary.types.cjs +17 -0
  91. package/dist/cjs/types/dictionary.types.cjs.map +1 -0
  92. package/dist/cjs/types/organization.types.cjs +17 -0
  93. package/dist/cjs/types/organization.types.cjs.map +1 -0
  94. package/dist/cjs/types/project.types.cjs +17 -0
  95. package/dist/cjs/types/project.types.cjs.map +1 -0
  96. package/dist/cjs/types/session.types.cjs +17 -0
  97. package/dist/cjs/types/session.types.cjs.map +1 -0
  98. package/dist/cjs/types/user.types.cjs +17 -0
  99. package/dist/cjs/types/user.types.cjs.map +1 -0
  100. package/dist/cjs/utils/CSRF.cjs +47 -0
  101. package/dist/cjs/utils/CSRF.cjs.map +1 -0
  102. package/dist/cjs/utils/accessControl.cjs +121 -0
  103. package/dist/cjs/utils/accessControl.cjs.map +1 -0
  104. package/dist/cjs/utils/cookies.cjs +59 -0
  105. package/dist/cjs/utils/cookies.cjs.map +1 -0
  106. package/dist/cjs/utils/errors/ErrorHandler.cjs +103 -0
  107. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -0
  108. package/dist/cjs/utils/errors/ErrorsClass.cjs +65 -0
  109. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +1 -0
  110. package/dist/cjs/utils/errors/errorCodes.cjs +837 -0
  111. package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -0
  112. package/dist/cjs/utils/errors/index.cjs +37 -0
  113. package/dist/cjs/utils/errors/index.cjs.map +1 -0
  114. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +55 -0
  115. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +1 -0
  116. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +65 -0
  117. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +1 -0
  118. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +55 -0
  119. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +1 -0
  120. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +58 -0
  121. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +1 -0
  122. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +52 -0
  123. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +1 -0
  124. package/dist/cjs/utils/httpStatusCodes.cjs +93 -0
  125. package/dist/cjs/utils/httpStatusCodes.cjs.map +1 -0
  126. package/dist/cjs/utils/mapper/dictionary.cjs +40 -0
  127. package/dist/cjs/utils/mapper/dictionary.cjs.map +1 -0
  128. package/dist/cjs/utils/mapper/organization.cjs +39 -0
  129. package/dist/cjs/utils/mapper/organization.cjs.map +1 -0
  130. package/dist/cjs/utils/mapper/project.cjs +39 -0
  131. package/dist/cjs/utils/mapper/project.cjs.map +1 -0
  132. package/dist/cjs/utils/mapper/user.cjs +39 -0
  133. package/dist/cjs/utils/mapper/user.cjs.map +1 -0
  134. package/dist/cjs/utils/mongoDB/connectDB.cjs +53 -0
  135. package/dist/cjs/utils/mongoDB/connectDB.cjs.map +1 -0
  136. package/dist/cjs/utils/oAuth2.cjs +50 -0
  137. package/dist/cjs/utils/oAuth2.cjs.map +1 -0
  138. package/dist/cjs/utils/responseData.cjs +66 -0
  139. package/dist/cjs/utils/responseData.cjs.map +1 -0
  140. package/dist/cjs/utils/validation/validateArray.cjs +57 -0
  141. package/dist/cjs/utils/validation/validateArray.cjs.map +1 -0
  142. package/dist/cjs/utils/validation/validateDictionary.cjs +66 -0
  143. package/dist/cjs/utils/validation/validateDictionary.cjs.map +1 -0
  144. package/dist/cjs/utils/validation/validateEmail.cjs +37 -0
  145. package/dist/cjs/utils/validation/validateEmail.cjs.map +1 -0
  146. package/dist/cjs/utils/validation/validateOrganization.cjs +79 -0
  147. package/dist/cjs/utils/validation/validateOrganization.cjs.map +1 -0
  148. package/dist/cjs/utils/validation/validatePhone.cjs +37 -0
  149. package/dist/cjs/utils/validation/validatePhone.cjs.map +1 -0
  150. package/dist/cjs/utils/validation/validateProject.cjs +97 -0
  151. package/dist/cjs/utils/validation/validateProject.cjs.map +1 -0
  152. package/dist/cjs/utils/validation/validateString.cjs +39 -0
  153. package/dist/cjs/utils/validation/validateString.cjs.map +1 -0
  154. package/dist/cjs/utils/validation/validateUser.cjs +73 -0
  155. package/dist/cjs/utils/validation/validateUser.cjs.map +1 -0
  156. package/dist/esm/controllers/dictionary.controller.mjs +321 -0
  157. package/dist/esm/controllers/dictionary.controller.mjs.map +1 -0
  158. package/dist/esm/controllers/oAuth2.controller.mjs +25 -0
  159. package/dist/esm/controllers/oAuth2.controller.mjs.map +1 -0
  160. package/dist/esm/controllers/organization.controller.mjs +317 -0
  161. package/dist/esm/controllers/organization.controller.mjs.map +1 -0
  162. package/dist/esm/controllers/project.controller.mjs +263 -0
  163. package/dist/esm/controllers/project.controller.mjs.map +1 -0
  164. package/dist/esm/controllers/projectAccessKey.controller.mjs +98 -0
  165. package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -0
  166. package/dist/esm/controllers/sessionAuth.controller.mjs +570 -0
  167. package/dist/esm/controllers/sessionAuth.controller.mjs.map +1 -0
  168. package/dist/esm/controllers/user.controller.mjs +160 -0
  169. package/dist/esm/controllers/user.controller.mjs.map +1 -0
  170. package/dist/esm/emails/InviteUserEmail.mjs +285 -0
  171. package/dist/esm/emails/InviteUserEmail.mjs.map +1 -0
  172. package/dist/esm/emails/PasswordChangeConfirmation.mjs +134 -0
  173. package/dist/esm/emails/PasswordChangeConfirmation.mjs.map +1 -0
  174. package/dist/esm/emails/ResetUserPassword.mjs +197 -0
  175. package/dist/esm/emails/ResetUserPassword.mjs.map +1 -0
  176. package/dist/esm/emails/ValidateUserEmail.mjs +218 -0
  177. package/dist/esm/emails/ValidateUserEmail.mjs.map +1 -0
  178. package/dist/esm/emails/Welcome.mjs +173 -0
  179. package/dist/esm/emails/Welcome.mjs.map +1 -0
  180. package/dist/esm/emails/index.mjs +6 -0
  181. package/dist/esm/emails/index.mjs.map +1 -0
  182. package/dist/esm/export.mjs +15 -0
  183. package/dist/esm/export.mjs.map +1 -0
  184. package/dist/esm/index.mjs +102 -0
  185. package/dist/esm/index.mjs.map +1 -0
  186. package/dist/esm/logger/index.mjs +29 -0
  187. package/dist/esm/logger/index.mjs.map +1 -0
  188. package/dist/esm/middlewares/admin.middleware.mjs +20 -0
  189. package/dist/esm/middlewares/admin.middleware.mjs.map +1 -0
  190. package/dist/esm/middlewares/oAuth2.middleware.mjs +57 -0
  191. package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -0
  192. package/dist/esm/middlewares/request.middleware.mjs +17 -0
  193. package/dist/esm/middlewares/request.middleware.mjs.map +1 -0
  194. package/dist/esm/middlewares/sessionAuth.middleware.mjs +96 -0
  195. package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -0
  196. package/dist/esm/models/dictionary.model.mjs +10 -0
  197. package/dist/esm/models/dictionary.model.mjs.map +1 -0
  198. package/dist/esm/models/oAuth2.model.mjs +7 -0
  199. package/dist/esm/models/oAuth2.model.mjs.map +1 -0
  200. package/dist/esm/models/organization.model.mjs +10 -0
  201. package/dist/esm/models/organization.model.mjs.map +1 -0
  202. package/dist/esm/models/project.model.mjs +7 -0
  203. package/dist/esm/models/project.model.mjs.map +1 -0
  204. package/dist/esm/models/user.model.mjs +7 -0
  205. package/dist/esm/models/user.model.mjs.map +1 -0
  206. package/dist/esm/routes/dictionary.routes.mjs +139 -0
  207. package/dist/esm/routes/dictionary.routes.mjs.map +1 -0
  208. package/dist/esm/routes/organization.routes.mjs +116 -0
  209. package/dist/esm/routes/organization.routes.mjs.map +1 -0
  210. package/dist/esm/routes/project.routes.mjs +162 -0
  211. package/dist/esm/routes/project.routes.mjs.map +1 -0
  212. package/dist/esm/routes/sessionAuth.routes.mjs +134 -0
  213. package/dist/esm/routes/sessionAuth.routes.mjs.map +1 -0
  214. package/dist/esm/routes/user.routes.mjs +78 -0
  215. package/dist/esm/routes/user.routes.mjs.map +1 -0
  216. package/dist/esm/schemas/dictionary.schema.mjs +45 -0
  217. package/dist/esm/schemas/dictionary.schema.mjs.map +1 -0
  218. package/dist/esm/schemas/oAuth2.schema.mjs +31 -0
  219. package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -0
  220. package/dist/esm/schemas/organization.schema.mjs +40 -0
  221. package/dist/esm/schemas/organization.schema.mjs.map +1 -0
  222. package/dist/esm/schemas/project.schema.mjs +59 -0
  223. package/dist/esm/schemas/project.schema.mjs.map +1 -0
  224. package/dist/esm/schemas/user.schema.mjs +81 -0
  225. package/dist/esm/schemas/user.schema.mjs.map +1 -0
  226. package/dist/esm/services/dictionary.service.mjs +134 -0
  227. package/dist/esm/services/dictionary.service.mjs.map +1 -0
  228. package/dist/esm/services/email.service.mjs +114 -0
  229. package/dist/esm/services/email.service.mjs.map +1 -0
  230. package/dist/esm/services/oAuth2.service.mjs +150 -0
  231. package/dist/esm/services/oAuth2.service.mjs.map +1 -0
  232. package/dist/esm/services/organization.service.mjs +68 -0
  233. package/dist/esm/services/organization.service.mjs.map +1 -0
  234. package/dist/esm/services/project.service.mjs +60 -0
  235. package/dist/esm/services/project.service.mjs.map +1 -0
  236. package/dist/esm/services/projectAccessKey.service.mjs +113 -0
  237. package/dist/esm/services/projectAccessKey.service.mjs.map +1 -0
  238. package/dist/esm/services/sessionAuth.service.mjs +337 -0
  239. package/dist/esm/services/sessionAuth.service.mjs.map +1 -0
  240. package/dist/esm/services/user.service.mjs +122 -0
  241. package/dist/esm/services/user.service.mjs.map +1 -0
  242. package/dist/esm/types/Routes.mjs +1 -0
  243. package/dist/esm/types/Routes.mjs.map +1 -0
  244. package/dist/esm/types/dictionary.types.mjs +1 -0
  245. package/dist/esm/types/dictionary.types.mjs.map +1 -0
  246. package/dist/esm/types/organization.types.mjs +1 -0
  247. package/dist/esm/types/organization.types.mjs.map +1 -0
  248. package/dist/esm/types/project.types.mjs +1 -0
  249. package/dist/esm/types/project.types.mjs.map +1 -0
  250. package/dist/esm/types/session.types.mjs +1 -0
  251. package/dist/esm/types/session.types.mjs.map +1 -0
  252. package/dist/esm/types/user.types.mjs +1 -0
  253. package/dist/esm/types/user.types.mjs.map +1 -0
  254. package/dist/esm/utils/CSRF.mjs +21 -0
  255. package/dist/esm/utils/CSRF.mjs.map +1 -0
  256. package/dist/esm/utils/accessControl.mjs +95 -0
  257. package/dist/esm/utils/accessControl.mjs.map +1 -0
  258. package/dist/esm/utils/cookies.mjs +32 -0
  259. package/dist/esm/utils/cookies.mjs.map +1 -0
  260. package/dist/esm/utils/errors/ErrorHandler.mjs +79 -0
  261. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -0
  262. package/dist/esm/utils/errors/ErrorsClass.mjs +40 -0
  263. package/dist/esm/utils/errors/ErrorsClass.mjs.map +1 -0
  264. package/dist/esm/utils/errors/errorCodes.mjs +813 -0
  265. package/dist/esm/utils/errors/errorCodes.mjs.map +1 -0
  266. package/dist/esm/utils/errors/index.mjs +10 -0
  267. package/dist/esm/utils/errors/index.mjs.map +1 -0
  268. package/dist/esm/utils/filtersAndPagination/getDictionaryFiltersAndPagination.mjs +33 -0
  269. package/dist/esm/utils/filtersAndPagination/getDictionaryFiltersAndPagination.mjs.map +1 -0
  270. package/dist/esm/utils/filtersAndPagination/getFiltersAndPaginationFromBody.mjs +41 -0
  271. package/dist/esm/utils/filtersAndPagination/getFiltersAndPaginationFromBody.mjs.map +1 -0
  272. package/dist/esm/utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs +33 -0
  273. package/dist/esm/utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs.map +1 -0
  274. package/dist/esm/utils/filtersAndPagination/getProjectFiltersAndPagination.mjs +36 -0
  275. package/dist/esm/utils/filtersAndPagination/getProjectFiltersAndPagination.mjs.map +1 -0
  276. package/dist/esm/utils/filtersAndPagination/getUserFiltersAndPagination.mjs +30 -0
  277. package/dist/esm/utils/filtersAndPagination/getUserFiltersAndPagination.mjs.map +1 -0
  278. package/dist/esm/utils/httpStatusCodes.mjs +69 -0
  279. package/dist/esm/utils/httpStatusCodes.mjs.map +1 -0
  280. package/dist/esm/utils/mapper/dictionary.mjs +16 -0
  281. package/dist/esm/utils/mapper/dictionary.mjs.map +1 -0
  282. package/dist/esm/utils/mapper/organization.mjs +15 -0
  283. package/dist/esm/utils/mapper/organization.mjs.map +1 -0
  284. package/dist/esm/utils/mapper/project.mjs +15 -0
  285. package/dist/esm/utils/mapper/project.mjs.map +1 -0
  286. package/dist/esm/utils/mapper/user.mjs +14 -0
  287. package/dist/esm/utils/mapper/user.mjs.map +1 -0
  288. package/dist/esm/utils/mongoDB/connectDB.mjs +19 -0
  289. package/dist/esm/utils/mongoDB/connectDB.mjs.map +1 -0
  290. package/dist/esm/utils/oAuth2.mjs +29 -0
  291. package/dist/esm/utils/oAuth2.mjs.map +1 -0
  292. package/dist/esm/utils/responseData.mjs +41 -0
  293. package/dist/esm/utils/responseData.mjs.map +1 -0
  294. package/dist/esm/utils/validation/validateArray.mjs +33 -0
  295. package/dist/esm/utils/validation/validateArray.mjs.map +1 -0
  296. package/dist/esm/utils/validation/validateDictionary.mjs +42 -0
  297. package/dist/esm/utils/validation/validateDictionary.mjs.map +1 -0
  298. package/dist/esm/utils/validation/validateEmail.mjs +13 -0
  299. package/dist/esm/utils/validation/validateEmail.mjs.map +1 -0
  300. package/dist/esm/utils/validation/validateOrganization.mjs +52 -0
  301. package/dist/esm/utils/validation/validateOrganization.mjs.map +1 -0
  302. package/dist/esm/utils/validation/validatePhone.mjs +13 -0
  303. package/dist/esm/utils/validation/validatePhone.mjs.map +1 -0
  304. package/dist/esm/utils/validation/validateProject.mjs +70 -0
  305. package/dist/esm/utils/validation/validateProject.mjs.map +1 -0
  306. package/dist/esm/utils/validation/validateString.mjs +15 -0
  307. package/dist/esm/utils/validation/validateString.mjs.map +1 -0
  308. package/dist/esm/utils/validation/validateUser.mjs +47 -0
  309. package/dist/esm/utils/validation/validateUser.mjs.map +1 -0
  310. package/dist/types/controllers/dictionary.controller.d.ts +70 -0
  311. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -0
  312. package/dist/types/controllers/oAuth2.controller.d.ts +14 -0
  313. package/dist/types/controllers/oAuth2.controller.d.ts.map +1 -0
  314. package/dist/types/controllers/organization.controller.d.ts +72 -0
  315. package/dist/types/controllers/organization.controller.d.ts.map +1 -0
  316. package/dist/types/controllers/project.controller.d.ts +59 -0
  317. package/dist/types/controllers/project.controller.d.ts.map +1 -0
  318. package/dist/types/controllers/projectAccessKey.controller.d.ts +27 -0
  319. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -0
  320. package/dist/types/controllers/sessionAuth.controller.d.ts +120 -0
  321. package/dist/types/controllers/sessionAuth.controller.d.ts.map +1 -0
  322. package/dist/types/controllers/user.controller.d.ts +56 -0
  323. package/dist/types/controllers/user.controller.d.ts.map +1 -0
  324. package/dist/types/emails/InviteUserEmail.d.ts +22 -0
  325. package/dist/types/emails/InviteUserEmail.d.ts.map +1 -0
  326. package/dist/types/emails/PasswordChangeConfirmation.d.ts +16 -0
  327. package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -0
  328. package/dist/types/emails/ResetUserPassword.d.ts +17 -0
  329. package/dist/types/emails/ResetUserPassword.d.ts.map +1 -0
  330. package/dist/types/emails/ValidateUserEmail.d.ts +17 -0
  331. package/dist/types/emails/ValidateUserEmail.d.ts.map +1 -0
  332. package/dist/types/emails/Welcome.d.ts +17 -0
  333. package/dist/types/emails/Welcome.d.ts.map +1 -0
  334. package/dist/types/emails/index.d.ts +6 -0
  335. package/dist/types/emails/index.d.ts.map +1 -0
  336. package/dist/types/export.d.ts +19 -0
  337. package/dist/types/export.d.ts.map +1 -0
  338. package/dist/types/index.d.ts +4 -0
  339. package/dist/types/index.d.ts.map +1 -0
  340. package/dist/types/logger/index.d.ts +2 -0
  341. package/dist/types/logger/index.d.ts.map +1 -0
  342. package/dist/types/middlewares/admin.middleware.d.ts +10 -0
  343. package/dist/types/middlewares/admin.middleware.d.ts.map +1 -0
  344. package/dist/types/middlewares/oAuth2.middleware.d.ts +9 -0
  345. package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -0
  346. package/dist/types/middlewares/request.middleware.d.ts +4 -0
  347. package/dist/types/middlewares/request.middleware.d.ts.map +1 -0
  348. package/dist/types/middlewares/sessionAuth.middleware.d.ts +20 -0
  349. package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -0
  350. package/dist/types/models/dictionary.model.d.ts +11 -0
  351. package/dist/types/models/dictionary.model.d.ts.map +1 -0
  352. package/dist/types/models/oAuth2.model.d.ts +10 -0
  353. package/dist/types/models/oAuth2.model.d.ts.map +1 -0
  354. package/dist/types/models/organization.model.d.ts +12 -0
  355. package/dist/types/models/organization.model.d.ts.map +1 -0
  356. package/dist/types/models/project.model.d.ts +12 -0
  357. package/dist/types/models/project.model.d.ts.map +1 -0
  358. package/dist/types/models/user.model.d.ts +3 -0
  359. package/dist/types/models/user.model.d.ts.map +1 -0
  360. package/dist/types/routes/dictionary.routes.d.ts +42 -0
  361. package/dist/types/routes/dictionary.routes.d.ts.map +1 -0
  362. package/dist/types/routes/organization.routes.d.ts +47 -0
  363. package/dist/types/routes/organization.routes.d.ts.map +1 -0
  364. package/dist/types/routes/project.routes.d.ts +57 -0
  365. package/dist/types/routes/project.routes.d.ts.map +1 -0
  366. package/dist/types/routes/sessionAuth.routes.d.ts +66 -0
  367. package/dist/types/routes/sessionAuth.routes.d.ts.map +1 -0
  368. package/dist/types/routes/user.routes.d.ts +42 -0
  369. package/dist/types/routes/user.routes.d.ts.map +1 -0
  370. package/dist/types/schemas/dictionary.schema.d.ts +16 -0
  371. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -0
  372. package/dist/types/schemas/oAuth2.schema.d.ts +19 -0
  373. package/dist/types/schemas/oAuth2.schema.d.ts.map +1 -0
  374. package/dist/types/schemas/organization.schema.d.ts +17 -0
  375. package/dist/types/schemas/organization.schema.d.ts.map +1 -0
  376. package/dist/types/schemas/project.schema.d.ts +17 -0
  377. package/dist/types/schemas/project.schema.d.ts.map +1 -0
  378. package/dist/types/schemas/user.schema.d.ts +12 -0
  379. package/dist/types/schemas/user.schema.d.ts.map +1 -0
  380. package/dist/types/services/dictionary.service.d.ts +70 -0
  381. package/dist/types/services/dictionary.service.d.ts.map +1 -0
  382. package/dist/types/services/email.service.d.ts +18 -0
  383. package/dist/types/services/email.service.d.ts.map +1 -0
  384. package/dist/types/services/oAuth2.service.d.ts +85 -0
  385. package/dist/types/services/oAuth2.service.d.ts.map +1 -0
  386. package/dist/types/services/organization.service.d.ts +43 -0
  387. package/dist/types/services/organization.service.d.ts.map +1 -0
  388. package/dist/types/services/project.service.d.ts +43 -0
  389. package/dist/types/services/project.service.d.ts.map +1 -0
  390. package/dist/types/services/projectAccessKey.service.d.ts +16 -0
  391. package/dist/types/services/projectAccessKey.service.d.ts.map +1 -0
  392. package/dist/types/services/sessionAuth.service.d.ts +148 -0
  393. package/dist/types/services/sessionAuth.service.d.ts.map +1 -0
  394. package/dist/types/services/user.service.d.ts +89 -0
  395. package/dist/types/services/user.service.d.ts.map +1 -0
  396. package/dist/types/types/Routes.d.ts +7 -0
  397. package/dist/types/types/Routes.d.ts.map +1 -0
  398. package/dist/types/types/dictionary.types.d.ts +35 -0
  399. package/dist/types/types/dictionary.types.d.ts.map +1 -0
  400. package/dist/types/types/organization.types.d.ts +21 -0
  401. package/dist/types/types/organization.types.d.ts.map +1 -0
  402. package/dist/types/types/project.types.d.ts +40 -0
  403. package/dist/types/types/project.types.d.ts.map +1 -0
  404. package/dist/types/types/session.types.d.ts +22 -0
  405. package/dist/types/types/session.types.d.ts.map +1 -0
  406. package/dist/types/types/user.types.d.ts +28 -0
  407. package/dist/types/types/user.types.d.ts.map +1 -0
  408. package/dist/types/utils/CSRF.d.ts +3 -0
  409. package/dist/types/utils/CSRF.d.ts.map +1 -0
  410. package/dist/types/utils/accessControl.d.ts +58 -0
  411. package/dist/types/utils/accessControl.d.ts.map +1 -0
  412. package/dist/types/utils/cookies.d.ts +12 -0
  413. package/dist/types/utils/cookies.d.ts.map +1 -0
  414. package/dist/types/utils/errors/ErrorHandler.d.ts +32 -0
  415. package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -0
  416. package/dist/types/utils/errors/ErrorsClass.d.ts +26 -0
  417. package/dist/types/utils/errors/ErrorsClass.d.ts.map +1 -0
  418. package/dist/types/utils/errors/errorCodes.d.ts +811 -0
  419. package/dist/types/utils/errors/errorCodes.d.ts.map +1 -0
  420. package/dist/types/utils/errors/index.d.ts +4 -0
  421. package/dist/types/utils/errors/index.d.ts.map +1 -0
  422. package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts +23 -0
  423. package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts.map +1 -0
  424. package/dist/types/utils/filtersAndPagination/getFiltersAndPaginationFromBody.d.ts +22 -0
  425. package/dist/types/utils/filtersAndPagination/getFiltersAndPaginationFromBody.d.ts.map +1 -0
  426. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +31 -0
  427. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts.map +1 -0
  428. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +24 -0
  429. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts.map +1 -0
  430. package/dist/types/utils/filtersAndPagination/getUserFiltersAndPagination.d.ts +22 -0
  431. package/dist/types/utils/filtersAndPagination/getUserFiltersAndPagination.d.ts.map +1 -0
  432. package/dist/types/utils/httpStatusCodes.d.ts +395 -0
  433. package/dist/types/utils/httpStatusCodes.d.ts.map +1 -0
  434. package/dist/types/utils/mapper/dictionary.d.ts +12 -0
  435. package/dist/types/utils/mapper/dictionary.d.ts.map +1 -0
  436. package/dist/types/utils/mapper/organization.d.ts +9 -0
  437. package/dist/types/utils/mapper/organization.d.ts.map +1 -0
  438. package/dist/types/utils/mapper/project.d.ts +9 -0
  439. package/dist/types/utils/mapper/project.d.ts.map +1 -0
  440. package/dist/types/utils/mapper/user.d.ts +14 -0
  441. package/dist/types/utils/mapper/user.d.ts.map +1 -0
  442. package/dist/types/utils/mongoDB/connectDB.d.ts +3 -0
  443. package/dist/types/utils/mongoDB/connectDB.d.ts.map +1 -0
  444. package/dist/types/utils/oAuth2.d.ts +6 -0
  445. package/dist/types/utils/oAuth2.d.ts.map +1 -0
  446. package/dist/types/utils/responseData.d.ts +53 -0
  447. package/dist/types/utils/responseData.d.ts.map +1 -0
  448. package/dist/types/utils/validation/validateArray.d.ts +13 -0
  449. package/dist/types/utils/validation/validateArray.d.ts.map +1 -0
  450. package/dist/types/utils/validation/validateDictionary.d.ts +12 -0
  451. package/dist/types/utils/validation/validateDictionary.d.ts.map +1 -0
  452. package/dist/types/utils/validation/validateEmail.d.ts +10 -0
  453. package/dist/types/utils/validation/validateEmail.d.ts.map +1 -0
  454. package/dist/types/utils/validation/validateOrganization.d.ts +15 -0
  455. package/dist/types/utils/validation/validateOrganization.d.ts.map +1 -0
  456. package/dist/types/utils/validation/validatePhone.d.ts +10 -0
  457. package/dist/types/utils/validation/validatePhone.d.ts.map +1 -0
  458. package/dist/types/utils/validation/validateProject.d.ts +15 -0
  459. package/dist/types/utils/validation/validateProject.d.ts.map +1 -0
  460. package/dist/types/utils/validation/validateString.d.ts +10 -0
  461. package/dist/types/utils/validation/validateString.d.ts.map +1 -0
  462. package/dist/types/utils/validation/validateUser.d.ts +15 -0
  463. package/dist/types/utils/validation/validateUser.d.ts.map +1 -0
  464. package/package.json +115 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/controllers/sessionAuth.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport { sessionAuthRoutes } from '@routes/sessionAuth.routes';\nimport { sendEmail } from '@services/email.service';\nimport * as sessionAuthService from '@services/sessionAuth.service';\nimport * as userService from '@services/user.service';\nimport { generateToken } from '@utils/CSRF';\nimport { ErrorHandler, AppError, GenericError } from '@utils/errors';\nimport { HttpStatusCodes } from '@utils/httpStatusCodes';\nimport { mapUserToAPI } from '@utils/mapper/user';\nimport { formatResponse, type ResponseData } from '@utils/responseData';\nimport type { NextFunction, Request, Response } from 'express';\nimport { Types } from 'mongoose';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Organization } from '@/types/organization.types';\nimport { Project } from '@/types/project.types';\nimport type {\n Session,\n GithubSessionProvider,\n GoogleSessionProvider,\n} from '@/types/session.types';\nimport type { UserAPI, UserData } from '@/types/user.types';\n\nexport type CSRFTokenData = { csrf_token: string };\nexport type SetCSRFTokenResult = ResponseData<CSRFTokenData>;\n\nexport const setCSRFToken = (\n req: Request,\n res: Response<SetCSRFTokenResult>,\n _next: NextFunction\n) => {\n const csrf_token = generateToken(req, res);\n\n const responseData = formatResponse<CSRFTokenData>({\n data: { csrf_token },\n });\n\n res.locals.csrf_token = csrf_token;\n res.json(responseData);\n};\n\nexport type RegisterBody = { email: string; password: string };\nexport type RegisterResult = ResponseData<UserAPI>;\n\n/**\n * Handles user registration.\n */\nexport const registerEmailPassword = async (\n req: Request<any, any, RegisterBody>,\n res: ResponseWithInformation<RegisterResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n\n if (user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_ALREADY_LOGGED_IN');\n return;\n }\n\n const userData = req.body;\n\n try {\n let user = await userService.getUserByEmail(userData.email);\n\n if (user) {\n const emailProvider = user.provider?.find(\n (provider) => provider.provider === 'email'\n );\n\n if (emailProvider) {\n if (emailProvider.emailValidated) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'EMAIL_ALREADY_VALIDATED'\n );\n return;\n } else {\n user = await sessionAuthService.updateUserProvider(\n user._id,\n 'email',\n {\n secret: uuidv4(),\n }\n );\n }\n } else {\n user = await sessionAuthService.addUserProvider(user._id, {\n provider: 'email',\n emailValidated: undefined,\n secret: uuidv4(),\n });\n }\n } else {\n user = await userService.createUser(userData);\n logger.info(`New registration: ${user.name} - ${user.email}`);\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_CREATION_FAILED', {\n email: userData.email,\n });\n return;\n }\n\n await sessionAuthService.setUserAuth(res, user);\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type LoginBody = {\n email: string;\n password: string;\n};\nexport type LoginResult = ResponseData<UserAPI>;\n\n/**\n * Handles user login.\n */\nexport const loginEmailPassword = async (\n req: Request<any, any, LoginBody>,\n res: ResponseWithInformation<LoginResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n\n if (user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_ALREADY_LOGGED_IN');\n return;\n }\n\n const { email, password } = req.body;\n\n try {\n const { user: loggedInUser, error } =\n await sessionAuthService.testUserPassword(email, password);\n\n if (error) {\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'LOGIN_FAILED');\n return;\n }\n }\n\n if (!loggedInUser) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n await sessionAuthService.setUserAuth(res, loggedInUser);\n\n const formattedUser = mapUserToAPI(loggedInUser);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n logger.info(`Login: ${loggedInUser.email}`);\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type LogoutResult = ResponseData<undefined>;\n\n/**\n * Handles user logout and clears cookies.\n */\nexport const logOut = async (\n _req: Request,\n res: ResponseWithInformation<LogoutResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n await sessionAuthService.clearUserAuth(res);\n sessionAuthService.clearOrganizationAuth(res);\n sessionAuthService.clearProjectAuth(res);\n\n logger.info(`Logout: ${user.name} - ${user.email}`);\n\n const responseData = formatResponse<undefined>({ data: undefined });\n\n res.json(responseData);\n};\n\nexport type UpdatePasswordBody = {\n oldPassword: string;\n newPassword: string;\n};\nexport type UpdatePasswordResult = ResponseData<UserAPI>;\n\n/**\n * Updates the user's password.\n */\nexport const updatePassword = async (\n req: Request<undefined, any, UpdatePasswordBody>,\n res: ResponseWithInformation<UpdatePasswordResult>,\n _next: NextFunction\n): Promise<void> => {\n const { oldPassword, newPassword } = req.body;\n let { user } = res.locals;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const { error } = await sessionAuthService.testUserPassword(\n user.email,\n oldPassword\n );\n\n if (error) {\n ErrorHandler.handleGenericErrorResponse(res, 'LOGIN_FAILED');\n return;\n }\n\n user = await sessionAuthService.changeUserPassword(\n user._id,\n oldPassword,\n newPassword\n );\n\n if (!user || typeof user !== 'object') {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n logger.info(\n `Password changed - User : Name : ${user.name}, id : ${String(user._id)}`\n );\n\n const formattedUser = mapUserToAPI(user);\n\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type ValidEmailParams = { secret: string; userId: string };\nexport type ValidEmailResult = ResponseData<UserAPI>;\n\n/**\n * Validates a user's email based on the provided secret and user ID.\n */\nexport const validEmail = async (\n req: Request<ValidEmailParams, any, any>,\n res: ResponseWithInformation<ValidEmailResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId, secret } = req.params;\n const { organization } = res.locals;\n\n if (!Types.ObjectId.isValid(userId.toString())) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_USER_ID');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n const user = await userService.getUserById(userId);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND', { userId });\n return;\n }\n\n await sessionAuthService.activateUser(user._id, secret);\n\n logger.info(\n `User activated - User: Name: ${user.name}, id: ${String(user._id)}`\n );\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name,\n loginLink: sessionAuthRoutes.loginEmailPassword.url,\n });\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n};\n\nexport type AskResetPasswordBody = {\n email: string;\n};\nexport type AskResetPasswordResult = ResponseData<undefined>;\n\n/**\n * Requests a password reset for a user.\n */\nexport const askResetPassword = async (\n req: Request<undefined, any, AskResetPasswordBody>,\n res: ResponseWithInformation<AskResetPasswordResult>,\n _next: NextFunction\n): Promise<void> => {\n const { email } = req.body as Partial<AskResetPasswordBody>;\n\n if (!email) {\n ErrorHandler.handleGenericErrorResponse(res, 'EMAIL_NOT_PROVIDED');\n return;\n }\n\n try {\n const updatedUser = await sessionAuthService.requestPasswordReset(email);\n\n if (!updatedUser) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND', { email });\n return;\n }\n\n logger.info(\n `Ask changing password - User: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`\n );\n\n await sendEmail({\n type: 'resetPassword',\n to: updatedUser.email,\n username: updatedUser.name,\n resetLink: sessionAuthRoutes.resetPassword.url({\n userId: String(updatedUser._id),\n secret:\n updatedUser.provider?.find(\n (provider) => provider.provider === 'email'\n )?.secret ?? '',\n }),\n });\n\n const responseData = formatResponse<undefined>({ data: undefined });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type ResetPasswordParams = { secret: string; userId: string };\nexport type ResetPasswordResult = ResponseData<UserAPI>;\n\n/**\n * Resets a user's password based on the provided secret and user ID.\n */\nexport const resetPassword = async (\n req: Request<ResetPasswordParams, any, any>,\n res: Response<ResetPasswordResult>,\n _next: NextFunction\n): Promise<void> => {\n const { secret, userId } = req.params as Partial<ResetPasswordParams>;\n const password: string = req.body.password;\n\n const userIdString = String(userId);\n\n if (!userId || !userIdString || !Types.ObjectId.isValid(userIdString)) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_USER_ID', { userId });\n return;\n }\n\n if (!secret) {\n ErrorHandler.handleGenericErrorResponse(res, 'SECRET_NOT_PROVIDED');\n return;\n }\n\n try {\n const updatedUser = await sessionAuthService.resetUserPassword(\n userId,\n secret,\n password\n );\n\n logger.info(\n `Password changed - User: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`\n );\n\n await sendEmail({\n type: 'passwordChangeConfirmation',\n to: updatedUser.email,\n username: updatedUser.name,\n });\n\n const formattedUser = mapUserToAPI(updatedUser);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type CreateSessionBody = {\n sessionToken: string;\n userId: string;\n expires: Date;\n};\nexport type CreateSessionResult = ResponseData<Session>;\n\nexport type GetSessionInformationQuery = {\n session_token?: string;\n};\ntype SessionInformation = {\n user: UserAPI | null;\n organization: Organization | null;\n project: Project | null;\n session: Session | null;\n};\nexport type GetSessionInformationResult = ResponseData<SessionInformation>;\n\n/**\n * Gets information about a session for a user.\n */\nexport const getSessionInformation = async (\n req: Request<undefined, undefined, undefined, GetSessionInformationQuery>,\n res: ResponseWithInformation<GetSessionInformationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { session_token: sessionToken } = req.query;\n\n let { user } = res.locals;\n const { organization, project } = res.locals;\n\n try {\n if (sessionToken) {\n user = await userService.getUserBySession(sessionToken);\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const session = user.session;\n\n if (!session) {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_FOUND');\n return;\n }\n\n const formattedUser: SessionInformation['user'] = {\n ...mapUserToAPI(user),\n role: 'user',\n };\n\n const responseData = formatResponse<SessionInformation>({\n data: { session, user: formattedUser, organization, project },\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GithubLoginQueryParams = {\n origin: string;\n};\nexport type GithubLoginQueryResult = ResponseData<undefined>;\n\nexport const githubLoginQuery = (\n req: Request<undefined, undefined, undefined, GithubLoginQueryParams>,\n res: ResponseWithInformation<GithubLoginQueryResult>,\n _next: NextFunction\n): void => {\n const { origin } = req.query;\n const { user } = res.locals;\n\n if (user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_ALREADY_LOGGED_IN');\n return;\n }\n\n const encodedOrigin = encodeURIComponent(origin);\n\n const redirectURI = `${process.env.BACKEND_URL}/api/auth/callback/github?redirect_uri=${encodedOrigin}`;\n const encodedRedirectURI = encodeURIComponent(redirectURI);\n\n res.redirect(\n `https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_CLIENT_ID}&redirect_uri=${encodedRedirectURI}`\n );\n};\n\nexport type GithubCallbackQuery = {\n code: string;\n redirect_uri: string;\n};\n\nexport type GithubCallbackResult = ResponseData<UserAPI>;\n\n/**\n * Handles GitHub OAuth callback.\n */\nexport const githubCallback = async (\n req: Request<undefined, undefined, undefined, GithubCallbackQuery>,\n res: ResponseWithInformation<GithubCallbackResult>,\n _next: NextFunction\n): Promise<void> => {\n const { code, redirect_uri } = req.query;\n\n if (!code) {\n const errorMessage = 'Code not provided';\n\n logger.error(errorMessage);\n\n res.redirect(redirect_uri);\n return;\n }\n\n if (!redirect_uri) {\n const errorMessage = 'Redirect URI not provided';\n\n logger.error(errorMessage);\n\n res.redirect(redirect_uri);\n return;\n }\n\n try {\n const tokenResponse = await fetch(\n 'https://github.com/login/oauth/access_token',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n client_id: process.env.GITHUB_CLIENT_ID,\n client_secret: process.env.GITHUB_CLIENT_SECRET,\n code,\n }),\n }\n );\n\n const tokenData = await tokenResponse.json();\n\n const userResponse = await fetch('https://api.github.com/user', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${tokenData.access_token}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (!userResponse.ok) {\n throw new GenericError('GITHUB_FETCH_USER_DATA_FAILED', { userResponse });\n }\n\n const userData = await userResponse.json();\n\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${tokenData.access_token}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (!emailResponse.ok) {\n throw new GenericError('GIT_HUB_FETCH_USER_EMAIL_FAILED', {\n emailResponse,\n });\n }\n\n const emails: { primary: boolean; email: string }[] =\n await emailResponse.json();\n\n const primaryEmail = emails.find((email) => email.primary)?.email;\n\n if (!primaryEmail) {\n const errorMessage = 'Primary email not found';\n\n logger.error(errorMessage);\n\n const responseCode = HttpStatusCodes.NOT_FOUND_404;\n\n res.redirect(responseCode, redirect_uri);\n return;\n }\n\n let existingUser = await userService.getUserByEmail(primaryEmail);\n\n if (existingUser) {\n const existingProvider = await sessionAuthService.getUserProvider(\n existingUser._id,\n 'github'\n );\n\n if (existingProvider?.providerAccountId !== userData.id) {\n const updatedUser = await sessionAuthService.updateUserProvider(\n existingUser._id,\n 'github',\n {\n providerAccountId: userData.id,\n }\n );\n\n logger.info(\n `GitHub login provider updated - User: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`\n );\n\n if (updatedUser) {\n existingUser = updatedUser;\n }\n }\n\n const updatedUser = await userService.updateUserById(existingUser._id, {\n name: existingUser.name ?? userData.name,\n });\n\n await sessionAuthService.setUserAuth(res, updatedUser);\n\n res.redirect(redirect_uri);\n return;\n }\n\n const userInformation: UserData = {\n name: userData.name,\n email: primaryEmail,\n };\n\n const userProvider: GithubSessionProvider = {\n provider: 'github',\n providerAccountId: userData.id,\n };\n\n const user = await userService.createUser({\n ...userInformation,\n provider: [userProvider],\n });\n\n await sessionAuthService.setUserAuth(res, user);\n\n logger.info(\n `GitHub login - User: Name: ${user.name}, id: ${String(user._id)}`\n );\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name,\n loginLink: sessionAuthRoutes.loginEmailPassword.url,\n });\n\n res.redirect(redirect_uri);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GoogleLoginQueryParams = {\n origin: string;\n};\n\nexport type GoogleLoginResult = ResponseData<undefined>;\n\nexport const googleLoginQuery = (\n req: Request<undefined, undefined, undefined, GoogleLoginQueryParams>,\n res: ResponseWithInformation<GoogleLoginResult>,\n _next: NextFunction\n): void => {\n const { origin } = req.query;\n const { user } = res.locals;\n\n if (user) {\n const errorMessage = `User already logged in - ${user?.email}`;\n\n logger.error(errorMessage);\n\n res.redirect(origin);\n return;\n }\n\n const responseType = 'code';\n const scope = [\n 'https%3A//www.googleapis.com/auth/userinfo.email',\n 'https%3A//www.googleapis.com/auth/userinfo.profile',\n ].join(' ');\n const includeGrantedScopes = 'false';\n\n const encodedOrigin = encodeURIComponent(origin);\n const state = JSON.stringify({ redirect_uri: encodedOrigin });\n\n const redirectURI = `${process.env.BACKEND_URL}/api/auth/callback/google`;\n\n res.redirect(\n `https://accounts.google.com/o/oauth2/v2/auth?client_id=${process.env.GOOGLE_CLIENT_ID}&redirect_uri=${redirectURI}&response_type=${responseType}&scope=${scope}&include_granted_scopes=${includeGrantedScopes}&state=${state}`\n );\n};\n\nexport type GoogleCallbackQuery = {\n code: string;\n state: string;\n};\n\nexport type GoogleCallbackResult = ResponseData<UserAPI>;\n\n/**\n * Handles Google OAuth 2 callback.\n */\nexport const googleCallback = async (\n req: Request<undefined, undefined, undefined, GoogleCallbackQuery>,\n res: ResponseWithInformation<GoogleCallbackResult>,\n _next: NextFunction\n): Promise<void> => {\n const { code, state } = req.query;\n\n const decodedState = decodeURIComponent(state);\n const { redirect_uri } = JSON.parse(decodedState);\n\n if (!code) {\n const errorMessage = 'code not provided';\n\n logger.error(errorMessage);\n\n const responseCode = HttpStatusCodes.BAD_REQUEST_400;\n\n res.redirect(responseCode, redirect_uri);\n return;\n }\n\n if (!redirect_uri) {\n const errorMessage = 'Redirect URI not provided';\n\n logger.error(errorMessage);\n\n const responseCode = HttpStatusCodes.BAD_REQUEST_400;\n\n res.redirect(responseCode, redirect_uri);\n return;\n }\n\n try {\n // Exchange the authorization code for an access token\n const tokenResponse = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n code,\n redirect_uri: `${process.env.BACKEND_URL}/api/auth/callback/google`,\n client_id: process.env.GOOGLE_CLIENT_ID!,\n client_secret: process.env.GOOGLE_CLIENT_SECRET!,\n grant_type: 'authorization_code',\n }),\n });\n\n const responseData = await tokenResponse.json();\n\n const { access_token: accessToken } = responseData;\n\n if (!accessToken) {\n const errorMessage = 'Failed to fetch access_token';\n\n logger.error(errorMessage);\n\n const responseCode = HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n res.redirect(responseCode, redirect_uri);\n return;\n }\n\n const userResponse = await fetch(\n 'https://www.googleapis.com/oauth2/v3/userinfo',\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n }\n );\n\n const userData = await userResponse.json();\n\n if (!userData.email) {\n const errorMessage = 'Failed to fetch user data from Google';\n\n logger.error(errorMessage);\n\n const responseCode = HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n res.redirect(responseCode, redirect_uri);\n return;\n }\n\n let existingUser = await userService.getUserByEmail(userData.email);\n\n if (existingUser) {\n const existingProvider = await sessionAuthService.getUserProvider(\n existingUser._id,\n 'google'\n );\n\n if (existingProvider?.providerAccountId !== userData.sub) {\n const updatedUser = await sessionAuthService.updateUserProvider(\n existingUser._id,\n 'google',\n {\n providerAccountId: userData.id,\n }\n );\n\n logger.info(\n `Google login provider updated - User: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`\n );\n\n if (updatedUser) {\n existingUser = updatedUser;\n }\n }\n\n const updatedUser = await userService.updateUserById(existingUser._id, {\n name: existingUser.name ?? userData.name,\n });\n\n await sessionAuthService.setUserAuth(res, updatedUser);\n\n res.redirect(redirect_uri);\n return;\n }\n\n const userInformation: UserData = {\n name: userData.name,\n email: userData.email,\n };\n\n const userProvider: GoogleSessionProvider = {\n provider: 'google',\n providerAccountId: userData.id,\n };\n\n const user = await userService.createUser({\n ...userInformation,\n provider: [userProvider],\n });\n\n await sessionAuthService.setUserAuth(res, user);\n\n logger.info(\n `Google login - User: Name: ${user.name}, id: ${String(user._id)}`\n );\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name,\n loginLink: sessionAuthRoutes.loginEmailPassword.url,\n });\n\n // res.redirect(redirect_uri);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":["user","uuidv4","updatedUser"]}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var user_controller_exports = {};
30
+ __export(user_controller_exports, {
31
+ createUser: () => createUser,
32
+ deleteUser: () => deleteUser,
33
+ getUserByAccount: () => getUserByAccount,
34
+ getUserByEmail: () => getUserByEmail,
35
+ getUserById: () => getUserById,
36
+ getUsers: () => getUsers,
37
+ updateUser: () => updateUser
38
+ });
39
+ module.exports = __toCommonJS(user_controller_exports);
40
+ var import_logger = require('./../logger/index.cjs');
41
+ var import_sessionAuth = require('./../routes/sessionAuth.routes.cjs');
42
+ var import_email = require('./../services/email.service.cjs');
43
+ var userService = __toESM(require('./../services/user.service.cjs'), 1);
44
+ var import_errors = require('./../utils/errors/index.cjs');
45
+ var import_getOrganizationFiltersAndPagination = require('./../utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs');
46
+ var import_user = require('./../utils/mapper/user.cjs');
47
+ var import_responseData = require('./../utils/responseData.cjs');
48
+ const createUser = async (req, res, _next) => {
49
+ const user = req.body;
50
+ if (!user) {
51
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
52
+ return;
53
+ }
54
+ try {
55
+ const newUser = await userService.createUser(user);
56
+ await (0, import_email.sendEmail)({
57
+ type: "welcome",
58
+ to: newUser.email,
59
+ username: newUser.name,
60
+ loginLink: import_sessionAuth.sessionAuthRoutes.loginEmailPassword.url
61
+ });
62
+ const formattedUser = (0, import_user.mapUserToAPI)(newUser);
63
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
64
+ res.json(responseData);
65
+ return;
66
+ } catch (error) {
67
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
68
+ return;
69
+ }
70
+ };
71
+ const getUsers = async (req, res, _next) => {
72
+ const { user } = res.locals;
73
+ if (!user) {
74
+ if (!user) {
75
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
76
+ return;
77
+ }
78
+ }
79
+ const { filters, pageSize, skip, page, getNumberOfPages } = (0, import_getOrganizationFiltersAndPagination.getOrganizationFiltersAndPagination)(req);
80
+ try {
81
+ const users = await userService.findUsers(filters, skip, pageSize);
82
+ const totalItems = await userService.countUsers(filters);
83
+ const formattedUsers = (0, import_user.mapUsersToAPI)(users);
84
+ const responseData = (0, import_responseData.formatPaginatedResponse)({
85
+ data: formattedUsers,
86
+ page,
87
+ pageSize,
88
+ totalPages: getNumberOfPages(totalItems),
89
+ totalItems
90
+ });
91
+ res.json(responseData);
92
+ return;
93
+ } catch (error) {
94
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
95
+ return;
96
+ }
97
+ };
98
+ const getUserById = async (req, res, _next) => {
99
+ const { userId } = req.params;
100
+ try {
101
+ const user = await userService.getUserById(userId);
102
+ if (!user) {
103
+ if (!user) {
104
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
105
+ return;
106
+ }
107
+ }
108
+ const formattedUser = (0, import_user.mapUserToAPI)(user);
109
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
110
+ res.json(responseData);
111
+ return;
112
+ } catch (error) {
113
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
114
+ return;
115
+ }
116
+ };
117
+ const getUserByEmail = async (req, res, _next) => {
118
+ const { email } = req.params;
119
+ try {
120
+ const user = await userService.getUserByEmail(email);
121
+ if (!user) {
122
+ if (!user) {
123
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
124
+ return;
125
+ }
126
+ }
127
+ const formattedUser = (0, import_user.mapUserToAPI)(user);
128
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
129
+ res.json(responseData);
130
+ } catch (error) {
131
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
132
+ }
133
+ };
134
+ const getUserByAccount = async (req, res, _next) => {
135
+ const { providerAccountId, provider } = req.params;
136
+ try {
137
+ const user = await userService.getUserByAccount(
138
+ provider,
139
+ providerAccountId
140
+ );
141
+ const formattedUser = (0, import_user.mapUserToAPI)(user);
142
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
143
+ res.json(responseData);
144
+ } catch (error) {
145
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
146
+ }
147
+ };
148
+ const updateUser = async (req, res, _next) => {
149
+ const userData = req.body;
150
+ const { user } = res.locals;
151
+ if (!user) {
152
+ if (!user) {
153
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
154
+ return;
155
+ }
156
+ }
157
+ if (typeof userData !== "object") {
158
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
159
+ return;
160
+ }
161
+ try {
162
+ const updatedUser = await userService.updateUserById(user._id, userData);
163
+ import_logger.logger.info(
164
+ `User updated: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`
165
+ );
166
+ const formattedUser = (0, import_user.mapUserToAPI)(updatedUser);
167
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
168
+ res.json(responseData);
169
+ return;
170
+ } catch (error) {
171
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
172
+ return;
173
+ }
174
+ };
175
+ const deleteUser = async (req, res, _next) => {
176
+ const { userId } = req.params;
177
+ try {
178
+ const user = await userService.deleteUser(userId);
179
+ const formattedUser = (0, import_user.mapUserToAPI)(user);
180
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedUser });
181
+ res.json(responseData);
182
+ } catch (error) {
183
+ import_errors.ErrorHandler.handleAppErrorResponse(res, error);
184
+ return;
185
+ }
186
+ };
187
+ // Annotate the CommonJS export names for ESM import in node:
188
+ 0 && (module.exports = {
189
+ createUser,
190
+ deleteUser,
191
+ getUserByAccount,
192
+ getUserByEmail,
193
+ getUserById,
194
+ getUsers,
195
+ updateUser
196
+ });
197
+ //# sourceMappingURL=user.controller.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/controllers/user.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport { sessionAuthRoutes } from '@routes/sessionAuth.routes';\nimport { sendEmail } from '@services/email.service';\nimport * as userService from '@services/user.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport { getOrganizationFiltersAndPagination } from '@utils/filtersAndPagination/getOrganizationFiltersAndPagination';\nimport type { UserFiltersParam } from '@utils/filtersAndPagination/getUserFiltersAndPagination';\nimport { mapUsersToAPI, mapUserToAPI } from '@utils/mapper/user';\nimport {\n formatPaginatedResponse,\n formatResponse,\n type PaginatedResponse,\n type ResponseData,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type { SessionProviders } from '@/types/session.types';\nimport type {\n User,\n UserAPI,\n UserWithPasswordNotHashed,\n} from '@/types/user.types';\n\nexport type CreateUserBody = { email: string; password?: string };\nexport type CreateUserResult = ResponseData<UserAPI>;\n\n/**\n * Creates a new user.\n */\nexport const createUser = async (\n req: Request<any, any, UserWithPasswordNotHashed>,\n res: ResponseWithInformation<CreateUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const user: UserWithPasswordNotHashed | undefined = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const newUser = await userService.createUser(user);\n\n await sendEmail({\n type: 'welcome',\n to: newUser.email,\n username: newUser.name,\n loginLink: sessionAuthRoutes.loginEmailPassword.url,\n });\n\n const formattedUser = mapUserToAPI(newUser);\n\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetUsersParams = FiltersAndPagination<UserFiltersParam>;\nexport type GetUsersResult = PaginatedResponse<UserAPI>;\n\n/**\n * Retrieves a list of users based on filters and pagination.\n */\nexport const getUsers = async (\n req: Request<GetUsersParams>,\n res: ResponseWithInformation<GetUsersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n\n if (!user) {\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n }\n\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getOrganizationFiltersAndPagination(req);\n\n try {\n const users = await userService.findUsers(filters, skip, pageSize);\n const totalItems = await userService.countUsers(filters);\n\n const formattedUsers = mapUsersToAPI(users);\n\n const responseData = formatPaginatedResponse<UserAPI>({\n data: formattedUsers,\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetUserByIdParams = { userId: string };\nexport type GetUserByIdResult = ResponseData<UserAPI>;\n\nexport const getUserById = async (\n req: Request<GetUserByIdParams>,\n res: ResponseWithInformation<GetUserByIdResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId } = req.params;\n\n try {\n const user = await userService.getUserById(userId);\n\n if (!user) {\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n }\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetUserByEmailParams = { email: string };\nexport type GetUserByEmailResult = ResponseData<UserAPI>;\n\nexport const getUserByEmail = async (\n req: Request<GetUserByEmailParams>,\n res: ResponseWithInformation<GetUserByEmailResult>,\n _next: NextFunction\n): Promise<void> => {\n const { email } = req.params;\n\n try {\n const user = await userService.getUserByEmail(email);\n\n if (!user) {\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n }\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n};\n\nexport type GetUserByAccountParams = {\n providerAccountId: string;\n provider: SessionProviders['provider'];\n};\nexport type GetUserByAccountResult = ResponseData<UserAPI>;\n\n/**\n * Retrieves a user by account.\n */\nexport const getUserByAccount = async (\n req: Request<GetUserByAccountParams>,\n res: ResponseWithInformation<GetUserByAccountResult>,\n _next: NextFunction\n): Promise<void> => {\n const { providerAccountId, provider } = req.params;\n\n try {\n const user = await userService.getUserByAccount(\n provider,\n providerAccountId\n );\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n};\n\nexport type UpdateUserBody = Partial<User>;\nexport type UpdateUserResult = ResponseData<UserAPI>;\n\n/**\n * Updates user information (phone number, date of birth).\n */\nexport const updateUser = async (\n req: Request<any, any, UpdateUserBody | undefined>,\n res: ResponseWithInformation<UpdateUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const userData = req.body;\n const { user } = res.locals;\n\n if (!user) {\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n }\n\n if (typeof userData !== 'object') {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n try {\n const updatedUser = await userService.updateUserById(user._id, userData);\n\n logger.info(\n `User updated: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`\n );\n\n const formattedUser = mapUserToAPI(updatedUser);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type DeleteUserParams = { userId: string };\nexport type DeleteUserResult = ResponseData<UserAPI>;\n\n/**\n * Deletes a user based on the provided ID.\n */\nexport const deleteUser = async (\n req: Request<any, any, DeleteUserParams>,\n res: ResponseWithInformation<DeleteUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId } = req.params;\n\n try {\n const user = await userService.deleteUser(userId);\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var InviteUserEmail_exports = {};
20
+ __export(InviteUserEmail_exports, {
21
+ InviteUserEmailEN: () => InviteUserEmailEN,
22
+ InviteUserEmailES: () => InviteUserEmailES,
23
+ InviteUserEmailFR: () => InviteUserEmailFR
24
+ });
25
+ module.exports = __toCommonJS(InviteUserEmail_exports);
26
+ var import_jsx_runtime = require("react/jsx-runtime");
27
+ var import_components = require("@react-email/components");
28
+ const InviteUserEmailEN = ({
29
+ username,
30
+ invitedByUsername,
31
+ invitedByEmail,
32
+ organizationName,
33
+ inviteLink,
34
+ inviteFromIp,
35
+ inviteFromLocation
36
+ }) => {
37
+ const previewText = `Join ${invitedByUsername} on Intlayer`;
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Html, { children: [
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Head, {}),
40
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Preview, { children: previewText }),
41
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Tailwind, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "mt-[32px]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
43
+ import_components.Img,
44
+ {
45
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
46
+ width: "40",
47
+ height: "37",
48
+ alt: "Intlayer",
49
+ className: "mx-auto my-0"
50
+ }
51
+ ) }),
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
53
+ "Join ",
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
55
+ " on",
56
+ " ",
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" })
58
+ ] }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
60
+ "Hello ",
61
+ username,
62
+ ","
63
+ ] }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
66
+ " (",
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
+ import_components.Link,
69
+ {
70
+ href: `mailto:${invitedByEmail}`,
71
+ className: "text-[#E879BA] no-underline",
72
+ children: invitedByEmail
73
+ }
74
+ ),
75
+ ") has invited you to the ",
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
77
+ " team on ",
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
79
+ "."
80
+ ] }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ import_components.Button,
83
+ {
84
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
85
+ href: inviteLink,
86
+ children: "Join the team"
87
+ }
88
+ ) }),
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
90
+ "or copy and paste this URL into your browser:",
91
+ " ",
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
93
+ ] }),
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
96
+ "This invitation was intended for",
97
+ " ",
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: username }),
99
+ ". This invite was sent from ",
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromIp }),
101
+ " ",
102
+ inviteFromLocation && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
103
+ " located in ",
104
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromLocation })
105
+ ] }),
106
+ ". If you were not expecting this invitation, you can ignore this email. If you are concerned about your account's safety, please reply to this email to get in touch with us."
107
+ ] })
108
+ ] }) }) })
109
+ ] });
110
+ };
111
+ const InviteUserEmailFR = ({
112
+ username,
113
+ invitedByUsername,
114
+ invitedByEmail,
115
+ organizationName,
116
+ inviteLink,
117
+ inviteFromIp,
118
+ inviteFromLocation
119
+ }) => {
120
+ const previewText = `Rejoignez ${invitedByUsername} sur Intlayer`;
121
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Html, { children: [
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Head, {}),
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Preview, { children: previewText }),
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Tailwind, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "mt-[32px]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
126
+ import_components.Img,
127
+ {
128
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
129
+ width: "40",
130
+ height: "37",
131
+ alt: "Intlayer",
132
+ className: "mx-auto my-0"
133
+ }
134
+ ) }),
135
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
136
+ "Rejoignez ",
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
138
+ " sur",
139
+ " ",
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" })
141
+ ] }),
142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
143
+ "Bonjour ",
144
+ username,
145
+ ","
146
+ ] }),
147
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
148
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
149
+ " (",
150
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
151
+ import_components.Link,
152
+ {
153
+ href: `mailto:${invitedByEmail}`,
154
+ className: "text-[#E879BA] no-underline",
155
+ children: invitedByEmail
156
+ }
157
+ ),
158
+ ") vous a invit\xE9 \xE0 rejoindre l'\xE9quipe de",
159
+ " ",
160
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
161
+ " sur ",
162
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
163
+ "."
164
+ ] }),
165
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
166
+ import_components.Button,
167
+ {
168
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
169
+ href: inviteLink,
170
+ children: "Rejoindre l'\xE9quipe"
171
+ }
172
+ ) }),
173
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
174
+ "ou copiez et collez cette URL dans votre navigateur :",
175
+ " ",
176
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
177
+ ] }),
178
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
179
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
180
+ "Cette invitation \xE9tait destin\xE9e \xE0",
181
+ " ",
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: username }),
183
+ ". Cette invitation a \xE9t\xE9 envoy\xE9e depuis",
184
+ " ",
185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromIp }),
186
+ inviteFromLocation && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
187
+ ", situ\xE9e \xE0 ",
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromLocation })
189
+ ] }),
190
+ ". Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email. Si vous \xEAtes pr\xE9occup\xE9 par la s\xE9curit\xE9 de votre compte, veuillez r\xE9pondre \xE0 cet email pour nous contacter."
191
+ ] })
192
+ ] }) }) })
193
+ ] });
194
+ };
195
+ const InviteUserEmailES = ({
196
+ username,
197
+ invitedByUsername,
198
+ invitedByEmail,
199
+ organizationName,
200
+ inviteLink,
201
+ inviteFromIp,
202
+ inviteFromLocation
203
+ }) => {
204
+ const previewText = `\xDAnete a ${invitedByUsername} en Intlayer`;
205
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Html, { children: [
206
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Head, {}),
207
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Preview, { children: previewText }),
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Tailwind, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "mt-[32px]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
210
+ import_components.Img,
211
+ {
212
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
213
+ width: "40",
214
+ height: "37",
215
+ alt: "Intlayer",
216
+ className: "mx-auto my-0"
217
+ }
218
+ ) }),
219
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
220
+ "\xDAnete a ",
221
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
222
+ " en",
223
+ " ",
224
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" })
225
+ ] }),
226
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
227
+ "Hola ",
228
+ username,
229
+ ","
230
+ ] }),
231
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
232
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
233
+ " (",
234
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
235
+ import_components.Link,
236
+ {
237
+ href: `mailto:${invitedByEmail}`,
238
+ className: "text-[#E879BA] no-underline",
239
+ children: invitedByEmail
240
+ }
241
+ ),
242
+ ") te ha invitado a unirte al equipo de",
243
+ " ",
244
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: organizationName }),
245
+ " en ",
246
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
247
+ "."
248
+ ] }),
249
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
250
+ import_components.Button,
251
+ {
252
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
253
+ href: inviteLink,
254
+ children: "Unirse al equipo"
255
+ }
256
+ ) }),
257
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[14px] leading-[24px] text-black", children: [
258
+ "o copia y pega esta URL en tu navegador:",
259
+ " ",
260
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
261
+ ] }),
262
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
263
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
264
+ "Esta invitaci\xF3n estaba destinada para",
265
+ " ",
266
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: username }),
267
+ ". Esta invitaci\xF3n fue enviada desde",
268
+ " ",
269
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromIp }),
270
+ inviteFromLocation && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
271
+ ", ubicada en ",
272
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-black", children: inviteFromLocation })
273
+ ] }),
274
+ ". Si no esperabas esta invitaci\xF3n, puedes ignorar este correo. Si est\xE1s preocupado por la seguridad de tu cuenta, por favor responde a este correo para contactarte con nosotros."
275
+ ] })
276
+ ] }) }) })
277
+ ] });
278
+ };
279
+ const PreviewProps = {
280
+ username: "alanturing",
281
+ invitedByUsername: "Alan",
282
+ invitedByEmail: "alan.turing@example.com",
283
+ organizationName: "Enigma",
284
+ inviteLink: "https://intlayer.org/teams/invite/foo",
285
+ inviteFromIp: "204.13.x.x",
286
+ inviteFromLocation: "S\xE3o Paulo, Brazil"
287
+ };
288
+ InviteUserEmailEN.PreviewProps = PreviewProps;
289
+ InviteUserEmailFR.PreviewProps = PreviewProps;
290
+ InviteUserEmailES.PreviewProps = PreviewProps;
291
+ // Annotate the CommonJS export names for ESM import in node:
292
+ 0 && (module.exports = {
293
+ InviteUserEmailEN,
294
+ InviteUserEmailES,
295
+ InviteUserEmailFR
296
+ });
297
+ //# sourceMappingURL=InviteUserEmail.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/emails/InviteUserEmail.tsx"],"sourcesContent":["import {\n Body,\n Button,\n Container,\n Head,\n Heading,\n Hr,\n Html,\n Img,\n Link,\n Preview,\n Section,\n Text,\n Tailwind,\n} from '@react-email/components';\n\nexport type InviteUserEmailProps = {\n username: string;\n invitedByUsername: string;\n invitedByEmail: string;\n organizationName: string;\n inviteLink: string;\n inviteFromIp: string;\n inviteFromLocation: string;\n};\n\nexport const InviteUserEmailEN = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Join ${invitedByUsername} on Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src={`https://intlayer.org/assets/favicon-32x32.png`}\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black\">\n Join <strong>{organizationName}</strong> on{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n Hello {username},\n </Text>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#E879BA] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) has invited you to the <strong>{organizationName}</strong> team\n on <strong>Intlayer</strong>.\n </Text>\n\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline\"\n href={inviteLink}\n >\n Join the team\n </Button>\n </Section>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n or copy and paste this URL into your browser:{' '}\n <Link href={inviteLink} className=\"text-[#E879BA] no-underline\">\n {inviteLink}\n </Link>\n </Text>\n <Hr className=\"mx-0 my-[26px] w-full border border-solid border-[#eaeaea]\" />\n <Text className=\"text-[12px] leading-[24px] text-[#666666]\">\n This invitation was intended for{' '}\n <span className=\"text-black\">{username}</span>. This invite was\n sent from <span className=\"text-black\">{inviteFromIp}</span>{' '}\n {inviteFromLocation && (\n <>\n {' located in '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . If you were not expecting this invitation, you can ignore this\n email. If you are concerned about your account's safety, please\n reply to this email to get in touch with us.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const InviteUserEmailFR = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Rejoignez ${invitedByUsername} sur Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src={`https://intlayer.org/assets/favicon-32x32.png`}\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black\">\n Rejoignez <strong>{organizationName}</strong> sur{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n Bonjour {username},\n </Text>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#E879BA] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) vous a invité à rejoindre l'équipe de{' '}\n <strong>{organizationName}</strong> sur <strong>Intlayer</strong>.\n </Text>\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline\"\n href={inviteLink}\n >\n Rejoindre l'équipe\n </Button>\n </Section>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n ou copiez et collez cette URL dans votre navigateur :{' '}\n <Link href={inviteLink} className=\"text-[#E879BA] no-underline\">\n {inviteLink}\n </Link>\n </Text>\n <Hr className=\"mx-0 my-[26px] w-full border border-solid border-[#eaeaea]\" />\n <Text className=\"text-[12px] leading-[24px] text-[#666666]\">\n Cette invitation était destinée à{' '}\n <span className=\"text-black\">{username}</span>. Cette invitation a\n été envoyée depuis{' '}\n <span className=\"text-black\">{inviteFromIp}</span>\n {inviteFromLocation && (\n <>\n {', située à '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . Si vous n'attendiez pas cette invitation, vous pouvez ignorer\n cet email. Si vous êtes préoccupé par la sécurité de votre compte,\n veuillez répondre à cet email pour nous contacter.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const InviteUserEmailES = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Únete a ${invitedByUsername} en Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src={`https://intlayer.org/assets/favicon-32x32.png`}\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black\">\n Únete a <strong>{organizationName}</strong> en{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n Hola {username},\n </Text>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#E879BA] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) te ha invitado a unirte al equipo de{' '}\n <strong>{organizationName}</strong> en <strong>Intlayer</strong>.\n </Text>\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline\"\n href={inviteLink}\n >\n Unirse al equipo\n </Button>\n </Section>\n <Text className=\"text-[14px] leading-[24px] text-black\">\n o copia y pega esta URL en tu navegador:{' '}\n <Link href={inviteLink} className=\"text-[#E879BA] no-underline\">\n {inviteLink}\n </Link>\n </Text>\n <Hr className=\"mx-0 my-[26px] w-full border border-solid border-[#eaeaea]\" />\n <Text className=\"text-[12px] leading-[24px] text-[#666666]\">\n Esta invitación estaba destinada para{' '}\n <span className=\"text-black\">{username}</span>. Esta invitación\n fue enviada desde{' '}\n <span className=\"text-black\">{inviteFromIp}</span>\n {inviteFromLocation && (\n <>\n {', ubicada en '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . Si no esperabas esta invitación, puedes ignorar este correo. Si\n estás preocupado por la seguridad de tu cuenta, por favor responde\n a este correo para contactarte con nosotros.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nconst PreviewProps: InviteUserEmailProps = {\n username: 'alanturing',\n invitedByUsername: 'Alan',\n invitedByEmail: 'alan.turing@example.com',\n organizationName: 'Enigma',\n inviteLink: 'https://intlayer.org/teams/invite/foo',\n inviteFromIp: '204.13.x.x',\n inviteFromLocation: 'São Paulo, Brazil',\n};\n\nInviteUserEmailEN.PreviewProps = PreviewProps;\nInviteUserEmailFR.PreviewProps = PreviewProps;\nInviteUserEmailES.PreviewProps = PreviewProps;\n"],"mappings":"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","names":[]}