@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","updatedUser"]}
@@ -0,0 +1,160 @@
1
+ import { logger } from './../logger/index.mjs';
2
+ import { sessionAuthRoutes } from './../routes/sessionAuth.routes.mjs';
3
+ import { sendEmail } from './../services/email.service.mjs';
4
+ import * as userService from './../services/user.service.mjs';
5
+ import { ErrorHandler } from './../utils/errors/index.mjs';
6
+ import { getOrganizationFiltersAndPagination } from './../utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs';
7
+ import { mapUsersToAPI, mapUserToAPI } from './../utils/mapper/user.mjs';
8
+ import {
9
+ formatPaginatedResponse,
10
+ formatResponse
11
+ } from './../utils/responseData.mjs';
12
+ const createUser = async (req, res, _next) => {
13
+ const user = req.body;
14
+ if (!user) {
15
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
16
+ return;
17
+ }
18
+ try {
19
+ const newUser = await userService.createUser(user);
20
+ await sendEmail({
21
+ type: "welcome",
22
+ to: newUser.email,
23
+ username: newUser.name,
24
+ loginLink: sessionAuthRoutes.loginEmailPassword.url
25
+ });
26
+ const formattedUser = mapUserToAPI(newUser);
27
+ const responseData = formatResponse({ data: formattedUser });
28
+ res.json(responseData);
29
+ return;
30
+ } catch (error) {
31
+ ErrorHandler.handleAppErrorResponse(res, error);
32
+ return;
33
+ }
34
+ };
35
+ const getUsers = async (req, res, _next) => {
36
+ const { user } = res.locals;
37
+ if (!user) {
38
+ if (!user) {
39
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
40
+ return;
41
+ }
42
+ }
43
+ const { filters, pageSize, skip, page, getNumberOfPages } = getOrganizationFiltersAndPagination(req);
44
+ try {
45
+ const users = await userService.findUsers(filters, skip, pageSize);
46
+ const totalItems = await userService.countUsers(filters);
47
+ const formattedUsers = mapUsersToAPI(users);
48
+ const responseData = formatPaginatedResponse({
49
+ data: formattedUsers,
50
+ page,
51
+ pageSize,
52
+ totalPages: getNumberOfPages(totalItems),
53
+ totalItems
54
+ });
55
+ res.json(responseData);
56
+ return;
57
+ } catch (error) {
58
+ ErrorHandler.handleAppErrorResponse(res, error);
59
+ return;
60
+ }
61
+ };
62
+ const getUserById = async (req, res, _next) => {
63
+ const { userId } = req.params;
64
+ try {
65
+ const user = await userService.getUserById(userId);
66
+ if (!user) {
67
+ if (!user) {
68
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
69
+ return;
70
+ }
71
+ }
72
+ const formattedUser = mapUserToAPI(user);
73
+ const responseData = formatResponse({ data: formattedUser });
74
+ res.json(responseData);
75
+ return;
76
+ } catch (error) {
77
+ ErrorHandler.handleAppErrorResponse(res, error);
78
+ return;
79
+ }
80
+ };
81
+ const getUserByEmail = async (req, res, _next) => {
82
+ const { email } = req.params;
83
+ try {
84
+ const user = await userService.getUserByEmail(email);
85
+ if (!user) {
86
+ if (!user) {
87
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
88
+ return;
89
+ }
90
+ }
91
+ const formattedUser = mapUserToAPI(user);
92
+ const responseData = formatResponse({ data: formattedUser });
93
+ res.json(responseData);
94
+ } catch (error) {
95
+ ErrorHandler.handleAppErrorResponse(res, error);
96
+ }
97
+ };
98
+ const getUserByAccount = async (req, res, _next) => {
99
+ const { providerAccountId, provider } = req.params;
100
+ try {
101
+ const user = await userService.getUserByAccount(
102
+ provider,
103
+ providerAccountId
104
+ );
105
+ const formattedUser = mapUserToAPI(user);
106
+ const responseData = formatResponse({ data: formattedUser });
107
+ res.json(responseData);
108
+ } catch (error) {
109
+ ErrorHandler.handleAppErrorResponse(res, error);
110
+ }
111
+ };
112
+ const updateUser = async (req, res, _next) => {
113
+ const userData = req.body;
114
+ const { user } = res.locals;
115
+ if (!user) {
116
+ if (!user) {
117
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
118
+ return;
119
+ }
120
+ }
121
+ if (typeof userData !== "object") {
122
+ ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
123
+ return;
124
+ }
125
+ try {
126
+ const updatedUser = await userService.updateUserById(user._id, userData);
127
+ logger.info(
128
+ `User updated: Name: ${updatedUser.name}, id: ${String(updatedUser._id)}`
129
+ );
130
+ const formattedUser = mapUserToAPI(updatedUser);
131
+ const responseData = formatResponse({ data: formattedUser });
132
+ res.json(responseData);
133
+ return;
134
+ } catch (error) {
135
+ ErrorHandler.handleAppErrorResponse(res, error);
136
+ return;
137
+ }
138
+ };
139
+ const deleteUser = async (req, res, _next) => {
140
+ const { userId } = req.params;
141
+ try {
142
+ const user = await userService.deleteUser(userId);
143
+ const formattedUser = mapUserToAPI(user);
144
+ const responseData = formatResponse({ data: formattedUser });
145
+ res.json(responseData);
146
+ } catch (error) {
147
+ ErrorHandler.handleAppErrorResponse(res, error);
148
+ return;
149
+ }
150
+ };
151
+ export {
152
+ createUser,
153
+ deleteUser,
154
+ getUserByAccount,
155
+ getUserByEmail,
156
+ getUserById,
157
+ getUsers,
158
+ updateUser
159
+ };
160
+ //# sourceMappingURL=user.controller.mjs.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,285 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ Body,
4
+ Button,
5
+ Container,
6
+ Head,
7
+ Heading,
8
+ Hr,
9
+ Html,
10
+ Img,
11
+ Link,
12
+ Preview,
13
+ Section,
14
+ Text,
15
+ Tailwind
16
+ } from "@react-email/components";
17
+ const InviteUserEmailEN = ({
18
+ username,
19
+ invitedByUsername,
20
+ invitedByEmail,
21
+ organizationName,
22
+ inviteLink,
23
+ inviteFromIp,
24
+ inviteFromLocation
25
+ }) => {
26
+ const previewText = `Join ${invitedByUsername} on Intlayer`;
27
+ return /* @__PURE__ */ jsxs(Html, { children: [
28
+ /* @__PURE__ */ jsx(Head, {}),
29
+ /* @__PURE__ */ jsx(Preview, { children: previewText }),
30
+ /* @__PURE__ */ jsx(Tailwind, { children: /* @__PURE__ */ jsx(Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
31
+ /* @__PURE__ */ jsx(Section, { className: "mt-[32px]", children: /* @__PURE__ */ jsx(
32
+ Img,
33
+ {
34
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
35
+ width: "40",
36
+ height: "37",
37
+ alt: "Intlayer",
38
+ className: "mx-auto my-0"
39
+ }
40
+ ) }),
41
+ /* @__PURE__ */ jsxs(Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
42
+ "Join ",
43
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
44
+ " on",
45
+ " ",
46
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" })
47
+ ] }),
48
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
49
+ "Hello ",
50
+ username,
51
+ ","
52
+ ] }),
53
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
54
+ /* @__PURE__ */ jsx("strong", { children: invitedByUsername }),
55
+ " (",
56
+ /* @__PURE__ */ jsx(
57
+ Link,
58
+ {
59
+ href: `mailto:${invitedByEmail}`,
60
+ className: "text-[#E879BA] no-underline",
61
+ children: invitedByEmail
62
+ }
63
+ ),
64
+ ") has invited you to the ",
65
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
66
+ " team on ",
67
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" }),
68
+ "."
69
+ ] }),
70
+ /* @__PURE__ */ jsx(Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ jsx(
71
+ Button,
72
+ {
73
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
74
+ href: inviteLink,
75
+ children: "Join the team"
76
+ }
77
+ ) }),
78
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
79
+ "or copy and paste this URL into your browser:",
80
+ " ",
81
+ /* @__PURE__ */ jsx(Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
82
+ ] }),
83
+ /* @__PURE__ */ jsx(Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
84
+ /* @__PURE__ */ jsxs(Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
85
+ "This invitation was intended for",
86
+ " ",
87
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: username }),
88
+ ". This invite was sent from ",
89
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromIp }),
90
+ " ",
91
+ inviteFromLocation && /* @__PURE__ */ jsxs(Fragment, { children: [
92
+ " located in ",
93
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromLocation })
94
+ ] }),
95
+ ". 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."
96
+ ] })
97
+ ] }) }) })
98
+ ] });
99
+ };
100
+ const InviteUserEmailFR = ({
101
+ username,
102
+ invitedByUsername,
103
+ invitedByEmail,
104
+ organizationName,
105
+ inviteLink,
106
+ inviteFromIp,
107
+ inviteFromLocation
108
+ }) => {
109
+ const previewText = `Rejoignez ${invitedByUsername} sur Intlayer`;
110
+ return /* @__PURE__ */ jsxs(Html, { children: [
111
+ /* @__PURE__ */ jsx(Head, {}),
112
+ /* @__PURE__ */ jsx(Preview, { children: previewText }),
113
+ /* @__PURE__ */ jsx(Tailwind, { children: /* @__PURE__ */ jsx(Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
114
+ /* @__PURE__ */ jsx(Section, { className: "mt-[32px]", children: /* @__PURE__ */ jsx(
115
+ Img,
116
+ {
117
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
118
+ width: "40",
119
+ height: "37",
120
+ alt: "Intlayer",
121
+ className: "mx-auto my-0"
122
+ }
123
+ ) }),
124
+ /* @__PURE__ */ jsxs(Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
125
+ "Rejoignez ",
126
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
127
+ " sur",
128
+ " ",
129
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" })
130
+ ] }),
131
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
132
+ "Bonjour ",
133
+ username,
134
+ ","
135
+ ] }),
136
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
137
+ /* @__PURE__ */ jsx("strong", { children: invitedByUsername }),
138
+ " (",
139
+ /* @__PURE__ */ jsx(
140
+ Link,
141
+ {
142
+ href: `mailto:${invitedByEmail}`,
143
+ className: "text-[#E879BA] no-underline",
144
+ children: invitedByEmail
145
+ }
146
+ ),
147
+ ") vous a invit\xE9 \xE0 rejoindre l'\xE9quipe de",
148
+ " ",
149
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
150
+ " sur ",
151
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" }),
152
+ "."
153
+ ] }),
154
+ /* @__PURE__ */ jsx(Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ jsx(
155
+ Button,
156
+ {
157
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
158
+ href: inviteLink,
159
+ children: "Rejoindre l'\xE9quipe"
160
+ }
161
+ ) }),
162
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
163
+ "ou copiez et collez cette URL dans votre navigateur :",
164
+ " ",
165
+ /* @__PURE__ */ jsx(Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
166
+ ] }),
167
+ /* @__PURE__ */ jsx(Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
168
+ /* @__PURE__ */ jsxs(Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
169
+ "Cette invitation \xE9tait destin\xE9e \xE0",
170
+ " ",
171
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: username }),
172
+ ". Cette invitation a \xE9t\xE9 envoy\xE9e depuis",
173
+ " ",
174
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromIp }),
175
+ inviteFromLocation && /* @__PURE__ */ jsxs(Fragment, { children: [
176
+ ", situ\xE9e \xE0 ",
177
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromLocation })
178
+ ] }),
179
+ ". 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."
180
+ ] })
181
+ ] }) }) })
182
+ ] });
183
+ };
184
+ const InviteUserEmailES = ({
185
+ username,
186
+ invitedByUsername,
187
+ invitedByEmail,
188
+ organizationName,
189
+ inviteLink,
190
+ inviteFromIp,
191
+ inviteFromLocation
192
+ }) => {
193
+ const previewText = `\xDAnete a ${invitedByUsername} en Intlayer`;
194
+ return /* @__PURE__ */ jsxs(Html, { children: [
195
+ /* @__PURE__ */ jsx(Head, {}),
196
+ /* @__PURE__ */ jsx(Preview, { children: previewText }),
197
+ /* @__PURE__ */ jsx(Tailwind, { children: /* @__PURE__ */ jsx(Body, { className: "m-auto px-2 font-sans", children: /* @__PURE__ */ jsxs(Container, { className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-solid border-[#eaeaea] bg-white p-[20px]", children: [
198
+ /* @__PURE__ */ jsx(Section, { className: "mt-[32px]", children: /* @__PURE__ */ jsx(
199
+ Img,
200
+ {
201
+ src: `https://intlayer.org/assets/favicon-32x32.png`,
202
+ width: "40",
203
+ height: "37",
204
+ alt: "Intlayer",
205
+ className: "mx-auto my-0"
206
+ }
207
+ ) }),
208
+ /* @__PURE__ */ jsxs(Heading, { className: "mx-0 my-[30px] p-0 text-center text-[24px] font-normal text-black", children: [
209
+ "\xDAnete a ",
210
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
211
+ " en",
212
+ " ",
213
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" })
214
+ ] }),
215
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
216
+ "Hola ",
217
+ username,
218
+ ","
219
+ ] }),
220
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
221
+ /* @__PURE__ */ jsx("strong", { children: invitedByUsername }),
222
+ " (",
223
+ /* @__PURE__ */ jsx(
224
+ Link,
225
+ {
226
+ href: `mailto:${invitedByEmail}`,
227
+ className: "text-[#E879BA] no-underline",
228
+ children: invitedByEmail
229
+ }
230
+ ),
231
+ ") te ha invitado a unirte al equipo de",
232
+ " ",
233
+ /* @__PURE__ */ jsx("strong", { children: organizationName }),
234
+ " en ",
235
+ /* @__PURE__ */ jsx("strong", { children: "Intlayer" }),
236
+ "."
237
+ ] }),
238
+ /* @__PURE__ */ jsx(Section, { className: "my-[32px] text-center", children: /* @__PURE__ */ jsx(
239
+ Button,
240
+ {
241
+ className: "rounded-md bg-[#000000] px-5 py-3 text-center text-[12px] font-semibold text-white no-underline",
242
+ href: inviteLink,
243
+ children: "Unirse al equipo"
244
+ }
245
+ ) }),
246
+ /* @__PURE__ */ jsxs(Text, { className: "text-[14px] leading-[24px] text-black", children: [
247
+ "o copia y pega esta URL en tu navegador:",
248
+ " ",
249
+ /* @__PURE__ */ jsx(Link, { href: inviteLink, className: "text-[#E879BA] no-underline", children: inviteLink })
250
+ ] }),
251
+ /* @__PURE__ */ jsx(Hr, { className: "mx-0 my-[26px] w-full border border-solid border-[#eaeaea]" }),
252
+ /* @__PURE__ */ jsxs(Text, { className: "text-[12px] leading-[24px] text-[#666666]", children: [
253
+ "Esta invitaci\xF3n estaba destinada para",
254
+ " ",
255
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: username }),
256
+ ". Esta invitaci\xF3n fue enviada desde",
257
+ " ",
258
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromIp }),
259
+ inviteFromLocation && /* @__PURE__ */ jsxs(Fragment, { children: [
260
+ ", ubicada en ",
261
+ /* @__PURE__ */ jsx("span", { className: "text-black", children: inviteFromLocation })
262
+ ] }),
263
+ ". 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."
264
+ ] })
265
+ ] }) }) })
266
+ ] });
267
+ };
268
+ const PreviewProps = {
269
+ username: "alanturing",
270
+ invitedByUsername: "Alan",
271
+ invitedByEmail: "alan.turing@example.com",
272
+ organizationName: "Enigma",
273
+ inviteLink: "https://intlayer.org/teams/invite/foo",
274
+ inviteFromIp: "204.13.x.x",
275
+ inviteFromLocation: "S\xE3o Paulo, Brazil"
276
+ };
277
+ InviteUserEmailEN.PreviewProps = PreviewProps;
278
+ InviteUserEmailFR.PreviewProps = PreviewProps;
279
+ InviteUserEmailES.PreviewProps = PreviewProps;
280
+ export {
281
+ InviteUserEmailEN,
282
+ InviteUserEmailES,
283
+ InviteUserEmailFR
284
+ };
285
+ //# sourceMappingURL=InviteUserEmail.mjs.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":[]}