@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/oAuth2.controller.ts"],"sourcesContent":["import { RequestWithOAuth2Information } from '@middlewares/oAuth2.middleware';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport { formatResponse, ResponseData } from '@utils/responseData';\nimport { Response, Request, NextFunction } from 'express';\nimport {\n type Token as OAuth2ServerToken,\n Request as OAuthRequest,\n Response as OAuthResponse,\n} from 'oauth2-server';\n\nexport type GetOAuth2TokenBody = {\n grant_type: 'client_credentials';\n client_id: string;\n client_secret: string;\n};\nexport type OAuth2Token = {\n [K in keyof OAuth2ServerToken]: OAuth2ServerToken[K];\n};\nexport type GetOAuth2TokenResult = ResponseData<OAuth2Token>;\n\n// Method to get the token\nexport const getOAuth2Token = async (\n req: Request,\n res: Response,\n _next: NextFunction\n): Promise<void> => {\n const oauthRequest = new OAuthRequest(req);\n const oauthResponse = new OAuthResponse(res);\n\n try {\n const token: OAuth2Token = await (\n req as unknown as RequestWithOAuth2Information<\n undefined,\n undefined,\n GetOAuth2TokenBody\n >\n ).oauth.token(oauthRequest, oauthResponse);\n\n const responseData = formatResponse<OAuth2Token>({\n data: token,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"AACA,SAAmB,oBAAoB;AACvC,SAAS,sBAAoC;AAE7C;AAAA,EAEE,WAAW;AAAA,EACX,YAAY;AAAA,OACP;AAaA,MAAM,iBAAiB,OAC5B,KACA,KACA,UACkB;AAClB,QAAM,eAAe,IAAI,aAAa,GAAG;AACzC,QAAM,gBAAgB,IAAI,cAAc,GAAG;AAE3C,MAAI;AACF,UAAM,QAAqB,MACzB,IAKA,MAAM,MAAM,cAAc,aAAa;AAEzC,UAAM,eAAe,eAA4B;AAAA,MAC/C,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,iBAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,317 @@
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 sessionAuthService from './../services/sessionAuth.service.mjs';
5
+ import * as userService from './../services/user.service.mjs';
6
+ import { ErrorHandler } from './../utils/errors/index.mjs';
7
+ import {
8
+ getOrganizationFiltersAndPagination
9
+ } from './../utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs';
10
+ import {
11
+ formatPaginatedResponse,
12
+ formatResponse
13
+ } from './../utils/responseData.mjs';
14
+ import * as organizationService from './../services/organization.service.mjs';
15
+ const getOrganizations = async (req, res, _next) => {
16
+ const { user } = res.locals;
17
+ const { filters, pageSize, skip, page, getNumberOfPages } = getOrganizationFiltersAndPagination(req);
18
+ if (!user) {
19
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
20
+ return;
21
+ }
22
+ const restrictedFilter = {
23
+ ...filters,
24
+ membersIds: { $in: [...filters.membersIds ?? [], String(user._id)] }
25
+ };
26
+ try {
27
+ const organizations = await organizationService.findOrganizations(
28
+ restrictedFilter,
29
+ skip,
30
+ pageSize
31
+ );
32
+ const totalItems = await organizationService.countOrganizations(filters);
33
+ const responseData = formatPaginatedResponse({
34
+ data: organizations,
35
+ page,
36
+ pageSize,
37
+ totalPages: getNumberOfPages(totalItems),
38
+ totalItems
39
+ });
40
+ res.status(200).json(responseData);
41
+ return;
42
+ } catch (error) {
43
+ ErrorHandler.handleAppErrorResponse(res, error);
44
+ return;
45
+ }
46
+ };
47
+ const getOrganization = async (req, res, _next) => {
48
+ const { organizationId } = req.params;
49
+ if (!organizationId) {
50
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
51
+ return;
52
+ }
53
+ try {
54
+ const organization = await organizationService.getOrganizationById(organizationId);
55
+ const responseData = formatResponse({ data: organization });
56
+ res.json(responseData);
57
+ return;
58
+ } catch (error) {
59
+ ErrorHandler.handleAppErrorResponse(res, error);
60
+ return;
61
+ }
62
+ };
63
+ const addOrganization = async (req, res, _next) => {
64
+ const { user } = res.locals;
65
+ const organization = req.body;
66
+ if (!organization) {
67
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
68
+ }
69
+ if (!user) {
70
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
71
+ return;
72
+ }
73
+ try {
74
+ const newOrganization = await organizationService.createOrganization(
75
+ organization,
76
+ user._id
77
+ );
78
+ const responseData = formatResponse({
79
+ data: newOrganization
80
+ });
81
+ res.json(responseData);
82
+ return;
83
+ } catch (error) {
84
+ ErrorHandler.handleAppErrorResponse(res, error);
85
+ return;
86
+ }
87
+ };
88
+ const updateOrganization = async (req, res, _next) => {
89
+ const { isOrganizationAdmin, organization } = res.locals;
90
+ const organizationFields = req.body;
91
+ if (!organizationFields) {
92
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
93
+ return;
94
+ }
95
+ if (!organization) {
96
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
97
+ return;
98
+ }
99
+ if (!isOrganizationAdmin) {
100
+ ErrorHandler.handleGenericErrorResponse(
101
+ res,
102
+ "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
103
+ );
104
+ return;
105
+ }
106
+ try {
107
+ const updatedOrganization = await organizationService.updateOrganizationById(
108
+ organization._id,
109
+ organizationFields
110
+ );
111
+ const responseData = formatResponse({
112
+ data: updatedOrganization
113
+ });
114
+ res.json(responseData);
115
+ return;
116
+ } catch (error) {
117
+ ErrorHandler.handleAppErrorResponse(res, error);
118
+ return;
119
+ }
120
+ };
121
+ const addOrganizationMember = async (req, res, _next) => {
122
+ const { organization, isOrganizationAdmin, user } = res.locals;
123
+ const { userEmail } = req.body;
124
+ if (!organization) {
125
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
126
+ return;
127
+ }
128
+ if (!user) {
129
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
130
+ return;
131
+ }
132
+ if (!isOrganizationAdmin) {
133
+ ErrorHandler.handleGenericErrorResponse(
134
+ res,
135
+ "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
136
+ );
137
+ return;
138
+ }
139
+ try {
140
+ let newMember = await userService.getUserByEmail(userEmail);
141
+ if (!newMember) {
142
+ const newUser = await userService.createUser({ email: userEmail });
143
+ if (!newUser) {
144
+ ErrorHandler.handleGenericErrorResponse(res, "USER_CREATION_FAILED", {
145
+ email: userEmail
146
+ });
147
+ return;
148
+ }
149
+ newMember = newUser;
150
+ }
151
+ await sendEmail({
152
+ type: "invite",
153
+ to: userEmail,
154
+ username: newMember.email.slice(0, newMember.email.indexOf("@")),
155
+ invitedByUsername: user.name,
156
+ invitedByEmail: user.email,
157
+ organizationName: organization.name,
158
+ inviteLink: sessionAuthRoutes.loginEmailPassword.url,
159
+ inviteFromIp: req.ip ?? "",
160
+ inviteFromLocation: req.hostname
161
+ });
162
+ const updatedOrganization = await organizationService.updateOrganizationById(organization._id, {
163
+ ...organization,
164
+ membersIds: [...organization.membersIds, newMember._id]
165
+ });
166
+ const responseData = formatResponse({
167
+ data: updatedOrganization
168
+ });
169
+ res.json(responseData);
170
+ return;
171
+ } catch (error) {
172
+ ErrorHandler.handleAppErrorResponse(res, error);
173
+ return;
174
+ }
175
+ };
176
+ const updateOrganizationMembers = async (req, res, _next) => {
177
+ const { organization, isOrganizationAdmin } = res.locals;
178
+ const { membersIds } = req.body;
179
+ if (!organization) {
180
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
181
+ return;
182
+ }
183
+ if (!isOrganizationAdmin) {
184
+ ErrorHandler.handleGenericErrorResponse(
185
+ res,
186
+ "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
187
+ );
188
+ return;
189
+ }
190
+ if (membersIds?.length === 0) {
191
+ ErrorHandler.handleGenericErrorResponse(
192
+ res,
193
+ "ORGANIZATION_MUST_HAVE_MEMBER"
194
+ );
195
+ return;
196
+ }
197
+ if (membersIds?.map((el) => el.isAdmin)?.length === 0) {
198
+ ErrorHandler.handleGenericErrorResponse(
199
+ res,
200
+ "ORGANIZATION_MUST_HAVE_ADMIN"
201
+ );
202
+ return;
203
+ }
204
+ try {
205
+ let existingUsers = [];
206
+ if (membersIds) {
207
+ const userIdList = membersIds?.map((member) => member.userId);
208
+ const users = await userService.getUsersByIds(userIdList);
209
+ if (users) {
210
+ const userMap = users.map((user) => {
211
+ const isAdmin = membersIds.find(
212
+ (member) => String(member.userId) === String(user._id)
213
+ )?.isAdmin ?? false;
214
+ return {
215
+ user,
216
+ isAdmin
217
+ };
218
+ });
219
+ existingUsers = userMap;
220
+ }
221
+ }
222
+ const formattedMembers = existingUsers.map(
223
+ (user) => user.user._id
224
+ );
225
+ const formattedAdmin = existingUsers.filter((el) => el.isAdmin).map((user) => user.user._id);
226
+ const updatedOrganization = await organizationService.updateOrganizationById(organization._id, {
227
+ ...organization,
228
+ membersIds: formattedMembers,
229
+ adminsIds: formattedAdmin
230
+ });
231
+ const responseData = formatResponse({
232
+ data: updatedOrganization
233
+ });
234
+ res.json(responseData);
235
+ return;
236
+ } catch (error) {
237
+ ErrorHandler.handleAppErrorResponse(res, error);
238
+ return;
239
+ }
240
+ };
241
+ const deleteOrganization = async (_req, res, _next) => {
242
+ const { isOrganizationAdmin, organization } = res.locals;
243
+ if (!organization) {
244
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
245
+ return;
246
+ }
247
+ if (!isOrganizationAdmin) {
248
+ ErrorHandler.handleGenericErrorResponse(
249
+ res,
250
+ "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
251
+ );
252
+ return;
253
+ }
254
+ try {
255
+ const deletedOrganization = await organizationService.deleteOrganizationById(organization._id);
256
+ if (!deletedOrganization) {
257
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND", {
258
+ organizationId: organization._id
259
+ });
260
+ return;
261
+ }
262
+ logger.info(`Organization deleted: ${String(deletedOrganization._id)}`);
263
+ const responseData = formatResponse({
264
+ data: deletedOrganization
265
+ });
266
+ res.json(responseData);
267
+ return;
268
+ } catch (error) {
269
+ ErrorHandler.handleAppErrorResponse(res, error);
270
+ return;
271
+ }
272
+ };
273
+ const selectOrganization = async (req, res, _next) => {
274
+ const { organizationId } = req.params;
275
+ if (!organizationId) {
276
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
277
+ return;
278
+ }
279
+ try {
280
+ const organization = await organizationService.getOrganizationById(organizationId);
281
+ sessionAuthService.setOrganizationAuth(res, organization);
282
+ const responseData = formatResponse({
283
+ data: organization
284
+ });
285
+ res.json(responseData);
286
+ return;
287
+ } catch (error) {
288
+ ErrorHandler.handleAppErrorResponse(res, error);
289
+ return;
290
+ }
291
+ };
292
+ const unselectOrganization = (_req, res, _next) => {
293
+ try {
294
+ sessionAuthService.clearOrganizationAuth(res);
295
+ sessionAuthService.clearProjectAuth(res);
296
+ const responseData = formatResponse({
297
+ data: null
298
+ });
299
+ res.json(responseData);
300
+ return;
301
+ } catch (error) {
302
+ ErrorHandler.handleAppErrorResponse(res, error);
303
+ return;
304
+ }
305
+ };
306
+ export {
307
+ addOrganization,
308
+ addOrganizationMember,
309
+ deleteOrganization,
310
+ getOrganization,
311
+ getOrganizations,
312
+ selectOrganization,
313
+ unselectOrganization,
314
+ updateOrganization,
315
+ updateOrganizationMembers
316
+ };
317
+ //# sourceMappingURL=organization.controller.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/controllers/organization.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 { AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getOrganizationFiltersAndPagination,\n type OrganizationFiltersParams,\n type OrganizationFilters,\n} from '@utils/filtersAndPagination/getOrganizationFiltersAndPagination';\nimport {\n formatPaginatedResponse,\n formatResponse,\n type PaginatedResponse,\n type ResponseData,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type { ObjectId } from 'mongoose';\nimport { User } from 'oauth2-server';\nimport * as organizationService from '@/services/organization.service';\nimport type {\n Organization,\n OrganizationCreationData,\n} from '@/types/organization.types';\n\nexport type GetOrganizationsParams =\n FiltersAndPagination<OrganizationFiltersParams>;\nexport type GetOrganizationsResult = PaginatedResponse<Organization>;\n\n/**\n * Retrieves a list of organizations based on filters and pagination.\n */\nexport const getOrganizations = async (\n req: Request<GetOrganizationsParams>,\n res: ResponseWithInformation<GetOrganizationsResult>,\n _next: NextFunction\n) => {\n const { user } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getOrganizationFiltersAndPagination(req);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const restrictedFilter: OrganizationFilters = {\n ...filters,\n\n membersIds: { $in: [...(filters.membersIds ?? []), String(user._id)] },\n };\n\n try {\n const organizations = await organizationService.findOrganizations(\n restrictedFilter,\n skip,\n pageSize\n );\n const totalItems = await organizationService.countOrganizations(filters);\n\n const responseData = formatPaginatedResponse<Organization>({\n data: organizations,\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\n });\n\n res.status(200).json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetOrganizationParam = { organizationId: string };\nexport type GetOrganizationResult = ResponseData<Organization>;\n\n/**\n * Retrieves an organization by its ID.\n */\nexport const getOrganization = async (\n req: Request<GetOrganizationParam, any, any>,\n res: ResponseWithInformation<GetOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organizationId } = req.params as Partial<GetOrganizationParam>;\n\n if (!organizationId) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_ID_NOT_FOUND');\n return;\n }\n\n try {\n const organization =\n await organizationService.getOrganizationById(organizationId);\n\n const responseData = formatResponse<Organization>({ data: organization });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AddOrganizationBody = OrganizationCreationData;\nexport type AddOrganizationResult = ResponseData<Organization>;\n\n/**\n * Adds a new organization to the database.\n */\nexport const addOrganization = async (\n req: Request<any, any, AddOrganizationBody>,\n res: ResponseWithInformation<AddOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n const organization = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_DATA_NOT_FOUND');\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const newOrganization = await organizationService.createOrganization(\n organization,\n user._id\n );\n\n const responseData = formatResponse<Organization>({\n data: newOrganization,\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 UpdateOrganizationBody = Partial<Organization>;\nexport type UpdateOrganizationResult = ResponseData<Organization>;\n\n/**\n * Updates an existing organization in the database.\n */\nexport const updateOrganization = async (\n req: Request<undefined, undefined, UpdateOrganizationBody>,\n res: ResponseWithInformation<UpdateOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { isOrganizationAdmin, organization } = res.locals;\n const organizationFields = req.body;\n\n if (!organizationFields) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_DATA_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n return;\n }\n\n try {\n const updatedOrganization =\n await organizationService.updateOrganizationById(\n organization._id,\n organizationFields\n );\n\n const responseData = formatResponse<Organization>({\n data: updatedOrganization,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\ntype UserAndAdmin = { user: User; isAdmin: boolean };\n\nexport type OrganizationMemberByIdOption = {\n userId: string | ObjectId;\n isAdmin?: boolean;\n};\n\nexport type AddOrganizationMemberBody = {\n userEmail: string;\n};\nexport type AddOrganizationMemberResult = ResponseData<Organization>;\n\n/**\n * Add member to the organization in the database.\n */\nexport const addOrganizationMember = async (\n req: Request<any, any, AddOrganizationMemberBody>,\n res: ResponseWithInformation<AddOrganizationMemberResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, isOrganizationAdmin, user } = res.locals;\n const { userEmail } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n return;\n }\n\n try {\n let newMember = await userService.getUserByEmail(userEmail);\n\n if (!newMember) {\n // Create user if not found\n const newUser = await userService.createUser({ email: userEmail });\n if (!newUser) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_CREATION_FAILED', {\n email: userEmail,\n });\n return;\n }\n\n newMember = newUser;\n }\n\n await sendEmail({\n type: 'invite',\n to: userEmail,\n username: newMember.email.slice(0, newMember.email.indexOf('@')),\n invitedByUsername: user.name,\n invitedByEmail: user.email,\n organizationName: organization.name,\n inviteLink: sessionAuthRoutes.loginEmailPassword.url,\n inviteFromIp: req.ip ?? '',\n inviteFromLocation: req.hostname,\n });\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(organization._id, {\n ...organization,\n membersIds: [...organization.membersIds, newMember._id],\n });\n\n const responseData = formatResponse<Organization>({\n data: updatedOrganization,\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 UpdateOrganizationMembersBody = Partial<{\n membersIds: OrganizationMemberByIdOption[];\n}>;\nexport type UpdateOrganizationMembersResult = ResponseData<Organization>;\n\n/**\n * Update members to the organization in the database.\n */\nexport const updateOrganizationMembers = async (\n req: Request<any, any, UpdateOrganizationMembersBody>,\n res: ResponseWithInformation<UpdateOrganizationMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, isOrganizationAdmin } = res.locals;\n const { membersIds } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n return;\n }\n\n if (membersIds?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_MEMBER'\n );\n return;\n }\n\n if (membersIds?.map((el) => el.isAdmin)?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_ADMIN'\n );\n return;\n }\n\n try {\n let existingUsers: UserAndAdmin[] = [];\n\n if (membersIds) {\n const userIdList = membersIds?.map((member) => member.userId);\n const users = await userService.getUsersByIds(userIdList);\n\n if (users) {\n const userMap: UserAndAdmin[] = users.map((user) => {\n const isAdmin =\n membersIds.find(\n (member) => String(member.userId) === String(user._id)\n )?.isAdmin ?? false;\n\n return {\n user,\n isAdmin,\n };\n });\n\n existingUsers = userMap;\n }\n }\n\n const formattedMembers: ObjectId[] = existingUsers.map(\n (user) => user.user._id\n );\n const formattedAdmin: ObjectId[] = existingUsers\n .filter((el) => el.isAdmin)\n .map((user) => user.user._id);\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(organization._id, {\n ...organization,\n membersIds: formattedMembers,\n adminsIds: formattedAdmin,\n });\n\n const responseData = formatResponse<Organization>({\n data: updatedOrganization,\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 DeleteOrganizationResult = ResponseData<Organization>;\n\n/**\n * Deletes an organization from the database by its ID.\n */\nexport const deleteOrganization = async (\n _req: Request,\n res: ResponseWithInformation,\n _next: NextFunction\n): Promise<void> => {\n const { isOrganizationAdmin, organization } = res.locals;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n return;\n }\n\n try {\n const deletedOrganization =\n await organizationService.deleteOrganizationById(organization._id);\n\n if (!deletedOrganization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND', {\n organizationId: organization._id,\n });\n return;\n }\n\n logger.info(`Organization deleted: ${String(deletedOrganization._id)}`);\n\n const responseData = formatResponse<Organization>({\n data: deletedOrganization,\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 SelectOrganizationParam = { organizationId: ObjectId | string };\nexport type SelectOrganizationResult = ResponseData<Organization>;\n\n/**\n * Select an organization.\n */\nexport const selectOrganization = async (\n req: Request<SelectOrganizationParam>,\n res: ResponseWithInformation<SelectOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organizationId } = req.params as Partial<SelectOrganizationParam>;\n\n if (!organizationId) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_ID_NOT_FOUND');\n return;\n }\n\n try {\n const organization =\n await organizationService.getOrganizationById(organizationId);\n\n sessionAuthService.setOrganizationAuth(res, organization);\n\n const responseData = formatResponse<Organization>({\n data: organization,\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 UnselectOrganizationResult = ResponseData<null>;\n\n/**\n * Unselect an organization.\n */\nexport const unselectOrganization = (\n _req: Request,\n res: ResponseWithInformation<UnselectOrganizationResult>,\n _next: NextFunction\n): void => {\n try {\n sessionAuthService.clearOrganizationAuth(res);\n sessionAuthService.clearProjectAuth(res);\n\n const responseData = formatResponse<null>({\n data: null,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,263 @@
1
+ import { logger } from './../logger/index.mjs';
2
+ import * as projectService from './../services/project.service.mjs';
3
+ import * as sessionAuthService from './../services/sessionAuth.service.mjs';
4
+ import * as userService from './../services/user.service.mjs';
5
+ import { ErrorHandler } from './../utils/errors/index.mjs';
6
+ import {
7
+ getProjectFiltersAndPagination
8
+ } from './../utils/filtersAndPagination/getProjectFiltersAndPagination.mjs';
9
+ import {
10
+ formatPaginatedResponse,
11
+ formatResponse
12
+ } from './../utils/responseData.mjs';
13
+ const getProjects = async (req, res, _next) => {
14
+ const { user, organization } = res.locals;
15
+ const { filters, pageSize, skip, page, getNumberOfPages } = getProjectFiltersAndPagination(req);
16
+ if (!user) {
17
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
18
+ return;
19
+ }
20
+ if (!organization) {
21
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
22
+ return;
23
+ }
24
+ const restrictedFilter = {
25
+ ...filters,
26
+ membersIds: { $in: [...filters.membersIds ?? [], String(user._id)] },
27
+ organizationId: String(organization._id)
28
+ };
29
+ try {
30
+ const projects = await projectService.findProjects(
31
+ restrictedFilter,
32
+ skip,
33
+ pageSize
34
+ );
35
+ const totalItems = await projectService.countProjects(filters);
36
+ const responseData = formatPaginatedResponse({
37
+ data: projects,
38
+ page,
39
+ pageSize,
40
+ totalPages: getNumberOfPages(totalItems),
41
+ totalItems
42
+ });
43
+ res.json(responseData);
44
+ return;
45
+ } catch (error) {
46
+ ErrorHandler.handleAppErrorResponse(res, error);
47
+ return;
48
+ }
49
+ };
50
+ const addProject = async (req, res, _next) => {
51
+ const { organization, user, isOrganizationAdmin } = res.locals;
52
+ const projectData = req.body;
53
+ if (!user) {
54
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
55
+ return;
56
+ }
57
+ if (!organization) {
58
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
59
+ return;
60
+ }
61
+ if (!isOrganizationAdmin) {
62
+ ErrorHandler.handleGenericErrorResponse(
63
+ res,
64
+ "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
65
+ );
66
+ }
67
+ if (!projectData) {
68
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
69
+ }
70
+ const project = {
71
+ membersIds: [user._id],
72
+ adminsIds: [user._id],
73
+ creatorId: user._id,
74
+ organizationId: organization._id,
75
+ ...projectData
76
+ };
77
+ try {
78
+ const newProject = await projectService.createProject(project);
79
+ const responseData = formatResponse({ data: newProject });
80
+ res.json(responseData);
81
+ return;
82
+ } catch (error) {
83
+ ErrorHandler.handleAppErrorResponse(res, error);
84
+ return;
85
+ }
86
+ };
87
+ const updateProject = async (req, res, _next) => {
88
+ const { organization } = res.locals;
89
+ const project = req.body;
90
+ if (!project) {
91
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
92
+ return;
93
+ }
94
+ if (!organization) {
95
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
96
+ return;
97
+ }
98
+ if (project.organizationId !== organization._id) {
99
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_IN_ORGANIZATION");
100
+ return;
101
+ }
102
+ if (typeof project._id === "undefined") {
103
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_ID_NOT_FOUND");
104
+ return;
105
+ }
106
+ try {
107
+ const updatedProject = await projectService.updateProjectById(
108
+ project._id,
109
+ project
110
+ );
111
+ const responseData = formatResponse({ data: updatedProject });
112
+ res.json(responseData);
113
+ return;
114
+ } catch (error) {
115
+ ErrorHandler.handleAppErrorResponse(res, error);
116
+ return;
117
+ }
118
+ };
119
+ const updateProjectMembers = async (req, res, _next) => {
120
+ const { project, isProjectAdmin, organization } = res.locals;
121
+ const { membersIds } = req.body;
122
+ if (!project) {
123
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
124
+ return;
125
+ }
126
+ if (!isProjectAdmin) {
127
+ ErrorHandler.handleGenericErrorResponse(
128
+ res,
129
+ "USER_IS_NOT_ADMIN_OF_PROJECT"
130
+ );
131
+ return;
132
+ }
133
+ if (!organization) {
134
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
135
+ return;
136
+ }
137
+ if (membersIds?.length === 0) {
138
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_MUST_HAVE_MEMBER");
139
+ return;
140
+ }
141
+ if (membersIds?.map((el) => el.isAdmin)?.length === 0) {
142
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_MUST_HAVE_ADMIN");
143
+ return;
144
+ }
145
+ try {
146
+ const existingUsers = [];
147
+ if (membersIds) {
148
+ const userIdList = membersIds?.filter(
149
+ (member) => (
150
+ // Remove members that are not in the organization
151
+ !organization?.membersIds.includes(member.userId)
152
+ )
153
+ ).map((member) => member.userId);
154
+ const users = await userService.getUsersByIds(userIdList);
155
+ if (users) {
156
+ const userMap = users.map((user) => ({
157
+ user,
158
+ isAdmin: membersIds.find(
159
+ (member) => String(member.userId) === String(user._id)
160
+ )?.isAdmin ?? false
161
+ }));
162
+ existingUsers.push(...userMap);
163
+ }
164
+ }
165
+ const formattedMembers = existingUsers.map(
166
+ (user) => user.user._id
167
+ );
168
+ const formattedAdmin = existingUsers.filter((el) => el.isAdmin).map((user) => user.user._id);
169
+ const updatedOrganization = await projectService.updateProjectById(
170
+ project._id,
171
+ {
172
+ ...project,
173
+ membersIds: formattedMembers,
174
+ adminsIds: formattedAdmin
175
+ }
176
+ );
177
+ const responseData = formatResponse({
178
+ data: updatedOrganization
179
+ });
180
+ res.json(responseData);
181
+ return;
182
+ } catch (error) {
183
+ ErrorHandler.handleAppErrorResponse(res, error);
184
+ return;
185
+ }
186
+ };
187
+ const deleteProject = async (req, res, _next) => {
188
+ const { organization, project } = res.locals;
189
+ if (!organization) {
190
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
191
+ return;
192
+ }
193
+ if (!project) {
194
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
195
+ return;
196
+ }
197
+ try {
198
+ const projectToDelete = await projectService.getProjectById(project._id);
199
+ if (projectToDelete.organizationId !== organization._id) {
200
+ ErrorHandler.handleGenericErrorResponse(
201
+ res,
202
+ "PROJECT_NOT_IN_ORGANIZATION"
203
+ );
204
+ return;
205
+ }
206
+ const deletedProject = await projectService.deleteProjectById(project._id);
207
+ if (!deletedProject) {
208
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND", {
209
+ projectId: project._id
210
+ });
211
+ return;
212
+ }
213
+ logger.info(`Project deleted: ${String(deletedProject._id)}`);
214
+ const responseData = formatResponse({ data: deletedProject });
215
+ res.json(responseData);
216
+ return;
217
+ } catch (error) {
218
+ ErrorHandler.handleAppErrorResponse(res, error);
219
+ return;
220
+ }
221
+ };
222
+ const selectProject = async (req, res, _next) => {
223
+ const { projectId } = req.params;
224
+ if (!projectId) {
225
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_ID_NOT_FOUND");
226
+ return;
227
+ }
228
+ try {
229
+ const project = await projectService.getProjectById(projectId);
230
+ sessionAuthService.setProjectAuth(res, project);
231
+ const responseData = formatResponse({
232
+ data: project
233
+ });
234
+ res.json(responseData);
235
+ return;
236
+ } catch (error) {
237
+ ErrorHandler.handleAppErrorResponse(res, error);
238
+ return;
239
+ }
240
+ };
241
+ const unselectProject = (_req, res, _next) => {
242
+ try {
243
+ sessionAuthService.clearProjectAuth(res);
244
+ const responseData = formatResponse({
245
+ data: null
246
+ });
247
+ res.json(responseData);
248
+ return;
249
+ } catch (error) {
250
+ ErrorHandler.handleAppErrorResponse(res, error);
251
+ return;
252
+ }
253
+ };
254
+ export {
255
+ addProject,
256
+ deleteProject,
257
+ getProjects,
258
+ selectProject,
259
+ unselectProject,
260
+ updateProject,
261
+ updateProjectMembers
262
+ };
263
+ //# sourceMappingURL=project.controller.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/controllers/project.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as projectService from '@services/project.service';\nimport * as sessionAuthService from '@services/sessionAuth.service';\nimport * as userService from '@services/user.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getProjectFiltersAndPagination,\n type ProjectFilters,\n type ProjectFiltersParams,\n} from '@utils/filtersAndPagination/getProjectFiltersAndPagination';\nimport {\n formatPaginatedResponse,\n type ResponseData,\n type PaginatedResponse,\n formatResponse,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type { ObjectId } from 'mongoose';\nimport { User } from 'oauth2-server';\nimport type {\n Project,\n ProjectAPI,\n ProjectCreationData,\n ProjectData,\n} from '@/types/project.types';\n\nexport type GetProjectsParams = FiltersAndPagination<ProjectFiltersParams>;\nexport type GetProjectsResult = PaginatedResponse<ProjectAPI>;\n\n/**\n * Retrieves a list of projects based on filters and pagination.\n */\nexport const getProjects = async (\n req: Request<GetProjectsParams>,\n res: ResponseWithInformation<GetProjectsResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getProjectFiltersAndPagination(req);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n const restrictedFilter: ProjectFilters = {\n ...filters,\n membersIds: { $in: [...(filters.membersIds ?? []), String(user._id)] },\n organizationId: String(organization._id),\n };\n\n try {\n const projects = await projectService.findProjects(\n restrictedFilter,\n skip,\n pageSize\n );\n const totalItems = await projectService.countProjects(filters);\n\n const responseData = formatPaginatedResponse<ProjectAPI>({\n data: projects,\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 AddProjectBody = ProjectCreationData;\nexport type AddProjectResult = ResponseData<Project>;\n\n/**\n * Adds a new project to the database.\n */\nexport const addProject = async (\n req: Request<any, any, AddProjectBody>,\n res: ResponseWithInformation<AddProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, isOrganizationAdmin } = res.locals;\n const projectData = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n }\n\n if (!projectData) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\n }\n\n const project: ProjectData = {\n membersIds: [user._id],\n adminsIds: [user._id],\n creatorId: user._id,\n organizationId: organization._id,\n ...projectData,\n };\n\n try {\n const newProject = await projectService.createProject(project);\n\n const responseData = formatResponse<Project>({ data: newProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UpdateProjectBody = Partial<Project>;\nexport type UpdateProjectResult = ResponseData<Project>;\n\n/**\n * Updates an existing project in the database.\n */\nexport const updateProject = async (\n req: Request<any, any, UpdateProjectBody>,\n res: ResponseWithInformation<UpdateProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization } = res.locals;\n const project = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (project.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_IN_ORGANIZATION');\n return;\n }\n\n if (typeof project._id === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const updatedProject = await projectService.updateProjectById(\n project._id,\n project\n );\n\n const responseData = formatResponse<Project>({ data: updatedProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\ntype UserAndAdmin = { user: User; isAdmin: boolean };\nexport type ProjectMemberByIdOption = {\n userId: string | ObjectId;\n isAdmin?: boolean;\n};\n\nexport type UpdateProjectMembersBody = Partial<{\n membersIds: ProjectMemberByIdOption[];\n}>;\nexport type UpdateProjectMembersResult = ResponseData<Project>;\n\n/**\n * Update members to the dictionary in the database.\n */\nexport const updateProjectMembers = async (\n req: Request<any, any, UpdateProjectMembersBody>,\n res: ResponseWithInformation<UpdateProjectMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, isProjectAdmin, organization } = res.locals;\n const { membersIds } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n if (!isProjectAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_PROJECT'\n );\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (membersIds?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_MUST_HAVE_MEMBER');\n return;\n }\n\n if (membersIds?.map((el) => el.isAdmin)?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_MUST_HAVE_ADMIN');\n return;\n }\n\n try {\n const existingUsers: UserAndAdmin[] = [];\n\n if (membersIds) {\n const userIdList = membersIds\n ?.filter(\n (member) =>\n // Remove members that are not in the organization\n !organization?.membersIds.includes(member.userId as ObjectId)\n )\n .map((member) => member.userId);\n\n const users = await userService.getUsersByIds(userIdList);\n\n if (users) {\n const userMap: UserAndAdmin[] = users.map((user) => ({\n user,\n isAdmin:\n membersIds.find(\n (member) => String(member.userId) === String(user._id)\n )?.isAdmin ?? false,\n }));\n\n existingUsers.push(...userMap);\n }\n }\n\n const formattedMembers: ObjectId[] = existingUsers.map(\n (user) => user.user._id\n );\n const formattedAdmin: ObjectId[] = existingUsers\n .filter((el) => el.isAdmin)\n .map((user) => user.user._id);\n\n const updatedOrganization = await projectService.updateProjectById(\n project._id,\n {\n ...project,\n membersIds: formattedMembers,\n adminsIds: formattedAdmin,\n }\n );\n\n const responseData = formatResponse<Project>({\n data: updatedOrganization,\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 DeleteProjectResult = ResponseData<Project>;\n\n/**\n * Deletes a project from the database by its ID.\n * @param req - Express request object.\n * @param res - Express response object.\n * @returns Response confirming the deletion.\n */\nexport const deleteProject = async (\n req: Request,\n res: ResponseWithInformation<DeleteProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, project } = res.locals;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n try {\n const projectToDelete = await projectService.getProjectById(project._id);\n\n if (projectToDelete.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'PROJECT_NOT_IN_ORGANIZATION'\n );\n return;\n }\n\n const deletedProject = await projectService.deleteProjectById(project._id);\n\n if (!deletedProject) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND', {\n projectId: project._id,\n });\n\n return;\n }\n\n logger.info(`Project deleted: ${String(deletedProject._id)}`);\n\n const responseData = formatResponse<Project>({ data: deletedProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type SelectProjectParam = { projectId: ObjectId | string };\nexport type SelectProjectResult = ResponseData<Project>;\n\n/**\n * Select a project.\n */\nexport const selectProject = async (\n req: Request<SelectProjectParam>,\n res: ResponseWithInformation<SelectProjectResult>,\n _next: NextFunction\n) => {\n const { projectId } = req.params;\n\n if (!projectId) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const project = await projectService.getProjectById(projectId);\n\n sessionAuthService.setProjectAuth(res, project);\n\n const responseData = formatResponse<Project>({\n data: 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 UnselectProjectResult = ResponseData<null>;\n\n/**\n * Unselect a project.\n */\nexport const unselectProject = (\n _req: Request,\n res: ResponseWithInformation<UnselectProjectResult>,\n _next: NextFunction\n) => {\n try {\n sessionAuthService.clearProjectAuth(res);\n\n const responseData = formatResponse<null>({\n data: null,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}