@intlayer/backend 7.2.1-canary.1 → 7.2.3

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 (286) hide show
  1. package/dist/esm/utils/AI/aiSdk.mjs +7 -1
  2. package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
  3. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  4. package/dist/types/controllers/tag.controller.d.ts.map +1 -1
  5. package/dist/types/emails/InviteUserEmail.d.ts +4 -4
  6. package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
  7. package/dist/types/emails/MagicLinkEmail.d.ts +4 -4
  8. package/dist/types/emails/MagicLinkEmail.d.ts.map +1 -1
  9. package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +4 -4
  10. package/dist/types/emails/PasswordChangeConfirmation.d.ts +4 -4
  11. package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
  12. package/dist/types/emails/ResetUserPassword.d.ts +4 -4
  13. package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
  14. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +4 -4
  15. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -1
  16. package/dist/types/emails/SubscriptionPaymentError.d.ts +4 -4
  17. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
  18. package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
  19. package/dist/types/emails/Welcome.d.ts +4 -4
  20. package/dist/types/emails/Welcome.d.ts.map +1 -1
  21. package/dist/types/models/dictionary.model.d.ts +4 -4
  22. package/dist/types/models/discussion.model.d.ts +2 -2
  23. package/dist/types/models/discussion.model.d.ts.map +1 -1
  24. package/dist/types/models/oAuth2.model.d.ts +3 -3
  25. package/dist/types/routes/eventListener.routes.d.ts.map +1 -1
  26. package/dist/types/schemas/dictionary.schema.d.ts +6 -6
  27. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
  28. package/dist/types/schemas/discussion.schema.d.ts +6 -6
  29. package/dist/types/schemas/oAuth2.schema.d.ts +5 -5
  30. package/dist/types/schemas/oAuth2.schema.d.ts.map +1 -1
  31. package/dist/types/schemas/organization.schema.d.ts +6 -6
  32. package/dist/types/schemas/plans.schema.d.ts +6 -6
  33. package/dist/types/schemas/project.schema.d.ts +6 -6
  34. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  35. package/dist/types/schemas/tag.schema.d.ts +6 -6
  36. package/dist/types/schemas/user.schema.d.ts +6 -6
  37. package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts +2 -2
  38. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +2 -2
  39. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +2 -2
  40. package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +2 -2
  41. package/package.json +17 -18
  42. package/dist/cjs/_virtual/_utils_asset.cjs +0 -98
  43. package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -25
  44. package/dist/cjs/controllers/ai.controller.cjs +0 -381
  45. package/dist/cjs/controllers/ai.controller.cjs.map +0 -1
  46. package/dist/cjs/controllers/dictionary.controller.cjs +0 -463
  47. package/dist/cjs/controllers/dictionary.controller.cjs.map +0 -1
  48. package/dist/cjs/controllers/eventListener.controller.cjs +0 -53
  49. package/dist/cjs/controllers/eventListener.controller.cjs.map +0 -1
  50. package/dist/cjs/controllers/newsletter.controller.cjs +0 -164
  51. package/dist/cjs/controllers/newsletter.controller.cjs.map +0 -1
  52. package/dist/cjs/controllers/oAuth2.controller.cjs +0 -22
  53. package/dist/cjs/controllers/oAuth2.controller.cjs.map +0 -1
  54. package/dist/cjs/controllers/organization.controller.cjs +0 -492
  55. package/dist/cjs/controllers/organization.controller.cjs.map +0 -1
  56. package/dist/cjs/controllers/project.controller.cjs +0 -430
  57. package/dist/cjs/controllers/project.controller.cjs.map +0 -1
  58. package/dist/cjs/controllers/projectAccessKey.controller.cjs +0 -161
  59. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +0 -1
  60. package/dist/cjs/controllers/search.controller.cjs +0 -14
  61. package/dist/cjs/controllers/search.controller.cjs.map +0 -1
  62. package/dist/cjs/controllers/stripe.controller.cjs +0 -149
  63. package/dist/cjs/controllers/stripe.controller.cjs.map +0 -1
  64. package/dist/cjs/controllers/tag.controller.cjs +0 -226
  65. package/dist/cjs/controllers/tag.controller.cjs.map +0 -1
  66. package/dist/cjs/controllers/user.controller.cjs +0 -269
  67. package/dist/cjs/controllers/user.controller.cjs.map +0 -1
  68. package/dist/cjs/emails/InviteUserEmail.cjs +0 -325
  69. package/dist/cjs/emails/InviteUserEmail.cjs.map +0 -1
  70. package/dist/cjs/emails/MagicLinkEmail.cjs +0 -242
  71. package/dist/cjs/emails/MagicLinkEmail.cjs.map +0 -1
  72. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +0 -301
  73. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +0 -1
  74. package/dist/cjs/emails/PasswordChangeConfirmation.cjs +0 -177
  75. package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +0 -1
  76. package/dist/cjs/emails/ResetUserPassword.cjs +0 -240
  77. package/dist/cjs/emails/ResetUserPassword.cjs.map +0 -1
  78. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +0 -202
  79. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +0 -1
  80. package/dist/cjs/emails/SubscriptionPaymentError.cjs +0 -202
  81. package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +0 -1
  82. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +0 -208
  83. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +0 -1
  84. package/dist/cjs/emails/ValidateUserEmail.cjs +0 -240
  85. package/dist/cjs/emails/ValidateUserEmail.cjs.map +0 -1
  86. package/dist/cjs/emails/Welcome.cjs +0 -216
  87. package/dist/cjs/emails/Welcome.cjs.map +0 -1
  88. package/dist/cjs/emails/index.cjs +0 -25
  89. package/dist/cjs/export.cjs +0 -24
  90. package/dist/cjs/index.cjs +0 -91
  91. package/dist/cjs/index.cjs.map +0 -1
  92. package/dist/cjs/logger/index.cjs +0 -13
  93. package/dist/cjs/logger/index.cjs.map +0 -1
  94. package/dist/cjs/middlewares/oAuth2.middleware.cjs +0 -42
  95. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +0 -1
  96. package/dist/cjs/middlewares/request.middleware.cjs +0 -17
  97. package/dist/cjs/middlewares/request.middleware.cjs.map +0 -1
  98. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +0 -22
  99. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +0 -1
  100. package/dist/cjs/models/dictionary.model.cjs +0 -10
  101. package/dist/cjs/models/dictionary.model.cjs.map +0 -1
  102. package/dist/cjs/models/discussion.model.cjs +0 -10
  103. package/dist/cjs/models/discussion.model.cjs.map +0 -1
  104. package/dist/cjs/models/oAuth2.model.cjs +0 -10
  105. package/dist/cjs/models/oAuth2.model.cjs.map +0 -1
  106. package/dist/cjs/models/organization.model.cjs +0 -10
  107. package/dist/cjs/models/organization.model.cjs.map +0 -1
  108. package/dist/cjs/models/project.model.cjs +0 -10
  109. package/dist/cjs/models/project.model.cjs.map +0 -1
  110. package/dist/cjs/models/session.model.cjs +0 -10
  111. package/dist/cjs/models/session.model.cjs.map +0 -1
  112. package/dist/cjs/models/tag.model.cjs +0 -10
  113. package/dist/cjs/models/tag.model.cjs.map +0 -1
  114. package/dist/cjs/models/user.model.cjs +0 -10
  115. package/dist/cjs/models/user.model.cjs.map +0 -1
  116. package/dist/cjs/routes/ai.routes.cjs +0 -75
  117. package/dist/cjs/routes/ai.routes.cjs.map +0 -1
  118. package/dist/cjs/routes/dictionary.routes.cjs +0 -64
  119. package/dist/cjs/routes/dictionary.routes.cjs.map +0 -1
  120. package/dist/cjs/routes/eventListener.routes.cjs +0 -20
  121. package/dist/cjs/routes/eventListener.routes.cjs.map +0 -1
  122. package/dist/cjs/routes/newsletter.routes.cjs +0 -34
  123. package/dist/cjs/routes/newsletter.routes.cjs.map +0 -1
  124. package/dist/cjs/routes/organization.routes.cjs +0 -70
  125. package/dist/cjs/routes/organization.routes.cjs.map +0 -1
  126. package/dist/cjs/routes/project.routes.cjs +0 -83
  127. package/dist/cjs/routes/project.routes.cjs.map +0 -1
  128. package/dist/cjs/routes/search.routes.cjs +0 -20
  129. package/dist/cjs/routes/search.routes.cjs.map +0 -1
  130. package/dist/cjs/routes/stripe.routes.cjs +0 -34
  131. package/dist/cjs/routes/stripe.routes.cjs.map +0 -1
  132. package/dist/cjs/routes/tags.routes.cjs +0 -40
  133. package/dist/cjs/routes/tags.routes.cjs.map +0 -1
  134. package/dist/cjs/routes/user.routes.cjs +0 -58
  135. package/dist/cjs/routes/user.routes.cjs.map +0 -1
  136. package/dist/cjs/schemas/dictionary.schema.cjs +0 -73
  137. package/dist/cjs/schemas/dictionary.schema.cjs.map +0 -1
  138. package/dist/cjs/schemas/discussion.schema.cjs +0 -81
  139. package/dist/cjs/schemas/discussion.schema.cjs.map +0 -1
  140. package/dist/cjs/schemas/oAuth2.schema.cjs +0 -49
  141. package/dist/cjs/schemas/oAuth2.schema.cjs.map +0 -1
  142. package/dist/cjs/schemas/organization.schema.cjs +0 -62
  143. package/dist/cjs/schemas/organization.schema.cjs.map +0 -1
  144. package/dist/cjs/schemas/plans.schema.cjs +0 -75
  145. package/dist/cjs/schemas/plans.schema.cjs.map +0 -1
  146. package/dist/cjs/schemas/project.schema.cjs +0 -112
  147. package/dist/cjs/schemas/project.schema.cjs.map +0 -1
  148. package/dist/cjs/schemas/session.schema.cjs +0 -43
  149. package/dist/cjs/schemas/session.schema.cjs.map +0 -1
  150. package/dist/cjs/schemas/tag.schema.cjs +0 -62
  151. package/dist/cjs/schemas/tag.schema.cjs.map +0 -1
  152. package/dist/cjs/schemas/user.schema.cjs +0 -87
  153. package/dist/cjs/schemas/user.schema.cjs.map +0 -1
  154. package/dist/cjs/services/dictionary.service.cjs +0 -176
  155. package/dist/cjs/services/dictionary.service.cjs.map +0 -1
  156. package/dist/cjs/services/email.service.cjs +0 -155
  157. package/dist/cjs/services/email.service.cjs.map +0 -1
  158. package/dist/cjs/services/oAuth2.service.cjs +0 -211
  159. package/dist/cjs/services/oAuth2.service.cjs.map +0 -1
  160. package/dist/cjs/services/organization.service.cjs +0 -106
  161. package/dist/cjs/services/organization.service.cjs.map +0 -1
  162. package/dist/cjs/services/project.service.cjs +0 -89
  163. package/dist/cjs/services/project.service.cjs.map +0 -1
  164. package/dist/cjs/services/projectAccessKey.service.cjs +0 -111
  165. package/dist/cjs/services/projectAccessKey.service.cjs.map +0 -1
  166. package/dist/cjs/services/subscription.service.cjs +0 -184
  167. package/dist/cjs/services/subscription.service.cjs.map +0 -1
  168. package/dist/cjs/services/tag.service.cjs +0 -88
  169. package/dist/cjs/services/tag.service.cjs.map +0 -1
  170. package/dist/cjs/services/user.service.cjs +0 -120
  171. package/dist/cjs/services/user.service.cjs.map +0 -1
  172. package/dist/cjs/types/Routes.cjs +0 -0
  173. package/dist/cjs/types/dictionary.types.cjs +0 -0
  174. package/dist/cjs/types/discussion.types.cjs +0 -0
  175. package/dist/cjs/types/oAuth2.types.cjs +0 -0
  176. package/dist/cjs/types/organization.types.cjs +0 -0
  177. package/dist/cjs/types/plan.types.cjs +0 -0
  178. package/dist/cjs/types/project.types.cjs +0 -0
  179. package/dist/cjs/types/session.types.cjs +0 -0
  180. package/dist/cjs/types/tag.types.cjs +0 -0
  181. package/dist/cjs/types/user.types.cjs +0 -10
  182. package/dist/cjs/types/user.types.cjs.map +0 -1
  183. package/dist/cjs/utils/AI/aiSdk.cjs +0 -94
  184. package/dist/cjs/utils/AI/aiSdk.cjs.map +0 -1
  185. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +0 -201
  186. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +0 -1
  187. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs +0 -150
  188. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs.map +0 -1
  189. package/dist/cjs/utils/AI/auditDictionary/index.cjs +0 -60
  190. package/dist/cjs/utils/AI/auditDictionary/index.cjs.map +0 -1
  191. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs +0 -63
  192. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs.map +0 -1
  193. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs +0 -45
  194. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs.map +0 -1
  195. package/dist/cjs/utils/AI/auditTag/index.cjs +0 -40
  196. package/dist/cjs/utils/AI/auditTag/index.cjs.map +0 -1
  197. package/dist/cjs/utils/AI/autocomplete/index.cjs +0 -41
  198. package/dist/cjs/utils/AI/autocomplete/index.cjs.map +0 -1
  199. package/dist/cjs/utils/AI/customQuery/index.cjs +0 -27
  200. package/dist/cjs/utils/AI/customQuery/index.cjs.map +0 -1
  201. package/dist/cjs/utils/AI/translateJSON/index.cjs +0 -71
  202. package/dist/cjs/utils/AI/translateJSON/index.cjs.map +0 -1
  203. package/dist/cjs/utils/access.cjs +0 -0
  204. package/dist/cjs/utils/accessControl.cjs +0 -133
  205. package/dist/cjs/utils/accessControl.cjs.map +0 -1
  206. package/dist/cjs/utils/auth/getAuth.cjs +0 -218
  207. package/dist/cjs/utils/auth/getAuth.cjs.map +0 -1
  208. package/dist/cjs/utils/cors.cjs +0 -33
  209. package/dist/cjs/utils/cors.cjs.map +0 -1
  210. package/dist/cjs/utils/ensureArrayQueryFilter.cjs +0 -13
  211. package/dist/cjs/utils/ensureArrayQueryFilter.cjs.map +0 -1
  212. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs +0 -16
  213. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs.map +0 -1
  214. package/dist/cjs/utils/errors/ErrorHandler.cjs +0 -76
  215. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +0 -1
  216. package/dist/cjs/utils/errors/ErrorsClass.cjs +0 -54
  217. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +0 -1
  218. package/dist/cjs/utils/errors/errorCodes.cjs +0 -1387
  219. package/dist/cjs/utils/errors/errorCodes.cjs.map +0 -1
  220. package/dist/cjs/utils/errors/index.cjs +0 -8
  221. package/dist/cjs/utils/extractJSON.cjs +0 -61
  222. package/dist/cjs/utils/extractJSON.cjs.map +0 -1
  223. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +0 -94
  224. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +0 -1
  225. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs +0 -65
  226. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs.map +0 -1
  227. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +0 -36
  228. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +0 -1
  229. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +0 -49
  230. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +0 -1
  231. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +0 -53
  232. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +0 -1
  233. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs +0 -57
  234. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs.map +0 -1
  235. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +0 -74
  236. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +0 -1
  237. package/dist/cjs/utils/httpStatusCodes.cjs +0 -401
  238. package/dist/cjs/utils/httpStatusCodes.cjs.map +0 -1
  239. package/dist/cjs/utils/mapper/dictionary.cjs +0 -29
  240. package/dist/cjs/utils/mapper/dictionary.cjs.map +0 -1
  241. package/dist/cjs/utils/mapper/organization.cjs +0 -19
  242. package/dist/cjs/utils/mapper/organization.cjs.map +0 -1
  243. package/dist/cjs/utils/mapper/project.cjs +0 -26
  244. package/dist/cjs/utils/mapper/project.cjs.map +0 -1
  245. package/dist/cjs/utils/mapper/session.cjs +0 -15
  246. package/dist/cjs/utils/mapper/session.cjs.map +0 -1
  247. package/dist/cjs/utils/mapper/tag.cjs +0 -25
  248. package/dist/cjs/utils/mapper/tag.cjs.map +0 -1
  249. package/dist/cjs/utils/mapper/user.cjs +0 -24
  250. package/dist/cjs/utils/mapper/user.cjs.map +0 -1
  251. package/dist/cjs/utils/mergeFunctionTypes.cjs +0 -0
  252. package/dist/cjs/utils/mongoDB/connectDB.cjs +0 -32
  253. package/dist/cjs/utils/mongoDB/connectDB.cjs.map +0 -1
  254. package/dist/cjs/utils/mongoDB/types.cjs +0 -0
  255. package/dist/cjs/utils/oAuth2.cjs +0 -25
  256. package/dist/cjs/utils/oAuth2.cjs.map +0 -1
  257. package/dist/cjs/utils/permissions.cjs +0 -103
  258. package/dist/cjs/utils/permissions.cjs.map +0 -1
  259. package/dist/cjs/utils/plan.cjs +0 -63
  260. package/dist/cjs/utils/plan.cjs.map +0 -1
  261. package/dist/cjs/utils/rateLimiter.cjs +0 -48
  262. package/dist/cjs/utils/rateLimiter.cjs.map +0 -1
  263. package/dist/cjs/utils/removeObjectKeys.cjs +0 -11
  264. package/dist/cjs/utils/removeObjectKeys.cjs.map +0 -1
  265. package/dist/cjs/utils/responseData.cjs +0 -33
  266. package/dist/cjs/utils/responseData.cjs.map +0 -1
  267. package/dist/cjs/utils/validation/validateArray.cjs +0 -31
  268. package/dist/cjs/utils/validation/validateArray.cjs.map +0 -1
  269. package/dist/cjs/utils/validation/validateDictionary.cjs +0 -35
  270. package/dist/cjs/utils/validation/validateDictionary.cjs.map +0 -1
  271. package/dist/cjs/utils/validation/validateEmail.cjs +0 -20
  272. package/dist/cjs/utils/validation/validateEmail.cjs.map +0 -1
  273. package/dist/cjs/utils/validation/validateOrganization.cjs +0 -43
  274. package/dist/cjs/utils/validation/validateOrganization.cjs.map +0 -1
  275. package/dist/cjs/utils/validation/validatePhone.cjs +0 -20
  276. package/dist/cjs/utils/validation/validatePhone.cjs.map +0 -1
  277. package/dist/cjs/utils/validation/validateProject.cjs +0 -55
  278. package/dist/cjs/utils/validation/validateProject.cjs.map +0 -1
  279. package/dist/cjs/utils/validation/validateString.cjs +0 -21
  280. package/dist/cjs/utils/validation/validateString.cjs.map +0 -1
  281. package/dist/cjs/utils/validation/validateTag.cjs +0 -47
  282. package/dist/cjs/utils/validation/validateTag.cjs.map +0 -1
  283. package/dist/cjs/utils/validation/validateUser.cjs +0 -47
  284. package/dist/cjs/utils/validation/validateUser.cjs.map +0 -1
  285. package/dist/cjs/webhooks/stripe.webhook.cjs +0 -116
  286. package/dist/cjs/webhooks/stripe.webhook.cjs.map +0 -1
@@ -1,492 +0,0 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../logger/index.cjs');
3
- const require_utils_responseData = require('../utils/responseData.cjs');
4
- const require_utils_errors_ErrorHandler = require('../utils/errors/ErrorHandler.cjs');
5
- const require_services_organization_service = require('../services/organization.service.cjs');
6
- const require_services_project_service = require('../services/project.service.cjs');
7
- const require_utils_permissions = require('../utils/permissions.cjs');
8
- const require_services_user_service = require('../services/user.service.cjs');
9
- const require_models_session_model = require('../models/session.model.cjs');
10
- const require_services_email_service = require('../services/email.service.cjs');
11
- const require_utils_filtersAndPagination_getOrganizationFiltersAndPagination = require('../utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs');
12
- const require_utils_mapper_organization = require('../utils/mapper/organization.cjs');
13
- const require_utils_plan = require('../utils/plan.cjs');
14
- let express_intlayer = require("express-intlayer");
15
- let stripe = require("stripe");
16
-
17
- //#region src/controllers/organization.controller.ts
18
- /**
19
- * Retrieves a list of organizations based on filters and pagination.
20
- */
21
- const getOrganizations = async (req, res, _next) => {
22
- const { user, roles } = res.locals;
23
- const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } = require_utils_filtersAndPagination_getOrganizationFiltersAndPagination.getOrganizationFiltersAndPagination(req, res);
24
- if (!user) {
25
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
26
- return;
27
- }
28
- try {
29
- const organizations = await require_services_organization_service.findOrganizations(filters, skip, pageSize, sortOptions);
30
- if (!require_utils_permissions.hasPermission(roles, "organization:read")({
31
- ...res.locals,
32
- targetOrganizations: organizations
33
- })) {
34
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
35
- return;
36
- }
37
- const totalItems = await require_services_organization_service.countOrganizations(filters);
38
- const responseData = require_utils_responseData.formatPaginatedResponse({
39
- data: require_utils_mapper_organization.mapOrganizationsToAPI(organizations),
40
- page,
41
- pageSize,
42
- totalPages: getNumberOfPages(totalItems),
43
- totalItems
44
- });
45
- res.status(200).json(responseData);
46
- return;
47
- } catch (error) {
48
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
49
- return;
50
- }
51
- };
52
- /**
53
- * Retrieves an organization by its ID.
54
- */
55
- const getOrganization = async (req, res, _next) => {
56
- const { roles } = res.locals;
57
- const { organizationId } = req.params;
58
- if (!organizationId) {
59
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
60
- return;
61
- }
62
- try {
63
- const organization = await require_services_organization_service.getOrganizationById(organizationId);
64
- if (!require_utils_permissions.hasPermission(roles, "organization:read")({
65
- ...res.locals,
66
- targetOrganizations: [organization]
67
- })) {
68
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
69
- return;
70
- }
71
- const responseData = require_utils_responseData.formatResponse({ data: require_utils_mapper_organization.mapOrganizationToAPI(organization) });
72
- res.json(responseData);
73
- return;
74
- } catch (error) {
75
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
76
- return;
77
- }
78
- };
79
- /**
80
- * Adds a new organization to the database.
81
- */
82
- const addOrganization = async (req, res, _next) => {
83
- const { user } = res.locals;
84
- const organization = req.body;
85
- if (!organization) {
86
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
87
- return;
88
- }
89
- if (!user) {
90
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
91
- return;
92
- }
93
- try {
94
- const newOrganization = await require_services_organization_service.createOrganization(organization, user.id);
95
- const responseData = require_utils_responseData.formatResponse({
96
- message: (0, express_intlayer.t)({
97
- en: "Organization created successfully",
98
- fr: "Organisation créée avec succès",
99
- es: "Organización creada con éxito"
100
- }),
101
- description: (0, express_intlayer.t)({
102
- en: "Your organization has been created successfully",
103
- fr: "Votre organisation a été créée avec succès",
104
- es: "Su organización ha sido creada con éxito"
105
- }),
106
- data: require_utils_mapper_organization.mapOrganizationToAPI(newOrganization)
107
- });
108
- res.json(responseData);
109
- return;
110
- } catch (error) {
111
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
112
- return;
113
- }
114
- };
115
- /**
116
- * Updates an existing organization in the database.
117
- */
118
- const updateOrganization = async (req, res, _next) => {
119
- const { organization, roles } = res.locals;
120
- const organizationFields = req.body;
121
- if (!organizationFields) {
122
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
123
- return;
124
- }
125
- if (!organization) {
126
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
127
- return;
128
- }
129
- if (!require_utils_permissions.hasPermission(roles, "organization:write")({
130
- ...res.locals,
131
- targetOrganizations: [organization]
132
- })) {
133
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
134
- return;
135
- }
136
- try {
137
- const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, organizationFields);
138
- const responseData = require_utils_responseData.formatResponse({
139
- message: (0, express_intlayer.t)({
140
- en: "Organization updated successfully",
141
- fr: "Organisation mise à jour avec succès",
142
- es: "Organización actualizada con éxito"
143
- }),
144
- description: (0, express_intlayer.t)({
145
- en: "Your organization has been updated successfully",
146
- fr: "Votre organisation a été mise à jour avec succès",
147
- es: "Su organización ha sido actualizada con éxito"
148
- }),
149
- data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
150
- });
151
- res.json(responseData);
152
- return;
153
- } catch (error) {
154
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
155
- return;
156
- }
157
- };
158
- /**
159
- * Add member to the organization in the database.
160
- */
161
- const addOrganizationMember = async (req, res, _next) => {
162
- const { organization, user, roles } = res.locals;
163
- const { userEmail } = req.body;
164
- if (!organization) {
165
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
166
- return;
167
- }
168
- if (!user) {
169
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
170
- return;
171
- }
172
- if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
173
- ...res.locals,
174
- targetOrganizations: [organization]
175
- })) {
176
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
177
- return;
178
- }
179
- const planType = require_utils_plan.getPlanDetails(organization.plan);
180
- if (planType.numberOfOrganizationUsers && organization.membersIds.length >= planType.numberOfOrganizationUsers) {
181
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PLAN_USER_LIMIT_REACHED", { organizationId: organization.id });
182
- return;
183
- }
184
- try {
185
- let newMember = await require_services_user_service.getUserByEmail(userEmail);
186
- if (!newMember) {
187
- const newUser = await require_services_user_service.createUser({ email: userEmail });
188
- if (!newUser) {
189
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_CREATION_FAILED", { email: userEmail });
190
- return;
191
- }
192
- newMember = newUser;
193
- }
194
- const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, {
195
- ...organization,
196
- membersIds: [...organization.membersIds, newMember.id]
197
- });
198
- const responseData = require_utils_responseData.formatResponse({
199
- message: (0, express_intlayer.t)({
200
- en: "Organization updated successfully",
201
- fr: "Organisation mise à jour avec succès",
202
- es: "Organización actualizada con éxito"
203
- }),
204
- description: (0, express_intlayer.t)({
205
- en: "Your organization has been updated successfully",
206
- fr: "Votre organisation a été mise à jour avec succès",
207
- es: "Su organización ha sido actualizada con éxito"
208
- }),
209
- data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
210
- });
211
- res.json(responseData);
212
- await require_services_email_service.sendEmail({
213
- type: "invite",
214
- to: userEmail,
215
- username: newMember.email.slice(0, newMember.email.indexOf("@")),
216
- invitedByUsername: user.name,
217
- invitedByEmail: user.email,
218
- organizationName: organization.name,
219
- inviteLink: `${process.env.CLIENT_URL}/auth/login?email=${newMember.email}`,
220
- inviteFromIp: req.ip ?? "",
221
- inviteFromLocation: req.hostname
222
- });
223
- return;
224
- } catch (error) {
225
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
226
- return;
227
- }
228
- };
229
- /**
230
- * Update members to the organization in the database.
231
- */
232
- const updateOrganizationMembers = async (req, res, _next) => {
233
- const { organization, roles } = res.locals;
234
- const { membersIds, adminsIds } = req.body;
235
- if (!organization) {
236
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
237
- return;
238
- }
239
- if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
240
- ...res.locals,
241
- targetOrganizations: [organization]
242
- })) {
243
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
244
- return;
245
- }
246
- if (!membersIds) {
247
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "INVALID_REQUEST_BODY");
248
- return;
249
- }
250
- if (membersIds?.length === 0) {
251
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_MEMBER");
252
- return;
253
- }
254
- if (adminsIds?.filter((id) => membersIds?.includes(id)).length === 0) {
255
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_ADMIN");
256
- return;
257
- }
258
- try {
259
- const existingUsers = await require_services_user_service.getUsersByIds(membersIds);
260
- if (!existingUsers) {
261
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
262
- return;
263
- }
264
- const existingAdmins = await require_services_user_service.getUsersByIds(adminsIds);
265
- if (!existingAdmins) {
266
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
267
- return;
268
- }
269
- const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, {
270
- membersIds: existingUsers.map((user) => user.id),
271
- adminsIds: existingAdmins.map((user) => user.id)
272
- });
273
- const responseData = require_utils_responseData.formatResponse({
274
- message: (0, express_intlayer.t)({
275
- en: "Organization updated successfully",
276
- fr: "Organisation mise à jour avec succès",
277
- es: "Organización actualizada con éxito"
278
- }),
279
- description: (0, express_intlayer.t)({
280
- en: "Your organization has been updated successfully",
281
- fr: "Votre organisation a été mise à jour avec succès",
282
- es: "Su organización ha sido actualizada con éxito"
283
- }),
284
- data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
285
- });
286
- res.json(responseData);
287
- return;
288
- } catch (error) {
289
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
290
- return;
291
- }
292
- };
293
- /**
294
- * Admin-only: Update members of any organization by ID
295
- */
296
- const updateOrganizationMembersById = async (req, res, _next) => {
297
- const { user } = res.locals;
298
- const { organizationId } = req.params;
299
- const { membersIds, adminsIds } = req.body;
300
- if (!user) {
301
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
302
- return;
303
- }
304
- if (user.role !== "admin") {
305
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
306
- return;
307
- }
308
- if (!membersIds) {
309
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "INVALID_REQUEST_BODY");
310
- return;
311
- }
312
- if (membersIds?.length === 0) {
313
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_MEMBER");
314
- return;
315
- }
316
- try {
317
- const targetOrganization = await require_services_organization_service.getOrganizationById(organizationId);
318
- if (!targetOrganization) {
319
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
320
- return;
321
- }
322
- const existingUsers = await require_services_user_service.getUsersByIds(membersIds);
323
- if (!existingUsers) {
324
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
325
- return;
326
- }
327
- const finalAdminsIds = adminsIds && adminsIds.length > 0 ? adminsIds : targetOrganization.adminsIds;
328
- const existingAdmins = finalAdminsIds ? await require_services_user_service.getUsersByIds(finalAdminsIds) : [];
329
- if (!existingAdmins || existingAdmins.length === 0) {
330
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_ADMIN");
331
- return;
332
- }
333
- const updatedOrganization = await require_services_organization_service.updateOrganizationById(targetOrganization.id, {
334
- membersIds: existingUsers.map((user$1) => user$1.id),
335
- adminsIds: existingAdmins.map((user$1) => user$1.id)
336
- });
337
- const responseData = require_utils_responseData.formatResponse({
338
- message: (0, express_intlayer.t)({
339
- en: "Organization members updated successfully",
340
- fr: "Membres de l'organisation mis à jour avec succès",
341
- es: "Miembros de la organización actualizados con éxito"
342
- }),
343
- description: (0, express_intlayer.t)({
344
- en: "Organization members have been updated successfully",
345
- fr: "Les membres de l'organisation ont été mis à jour avec succès",
346
- es: "Los miembros de la organización han sido actualizados con éxito"
347
- }),
348
- data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
349
- });
350
- res.json(responseData);
351
- return;
352
- } catch (error) {
353
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
354
- return;
355
- }
356
- };
357
- /**
358
- * Deletes an organization from the database by its ID.
359
- */
360
- const deleteOrganization = async (_req, res, _next) => {
361
- const stripe$1 = new stripe.Stripe(process.env.STRIPE_SECRET_KEY);
362
- const { organization, roles } = res.locals;
363
- if (!organization) {
364
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
365
- return;
366
- }
367
- if ((await require_services_project_service.findProjects({ organizationId: organization.id })).length > 0) {
368
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECTS_EXIST", { organizationId: organization.id });
369
- return;
370
- }
371
- if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
372
- ...res.locals,
373
- targetOrganizations: [organization]
374
- })) {
375
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
376
- return;
377
- }
378
- try {
379
- if (organization.plan?.subscriptionId) await stripe$1.subscriptions.cancel(organization.plan.subscriptionId);
380
- const deletedOrganization = await require_services_organization_service.deleteOrganizationById(organization.id);
381
- if (!deletedOrganization) {
382
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND", { organizationId: organization.id });
383
- return;
384
- }
385
- require_logger_index.logger.info(`Organization deleted: ${String(deletedOrganization.id)}`);
386
- const responseData = require_utils_responseData.formatResponse({
387
- message: (0, express_intlayer.t)({
388
- en: "Organization deleted successfully",
389
- fr: "Organisation supprimée avec succès",
390
- es: "Organización eliminada con éxito"
391
- }),
392
- description: (0, express_intlayer.t)({
393
- en: "Your organization has been deleted successfully",
394
- fr: "Votre organisation a été supprimée avec succès",
395
- es: "Su organización ha sido eliminada con éxito"
396
- }),
397
- data: require_utils_mapper_organization.mapOrganizationToAPI(deletedOrganization)
398
- });
399
- res.json(responseData);
400
- return;
401
- } catch (error) {
402
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
403
- return;
404
- }
405
- };
406
- /**
407
- * Select an organization.
408
- */
409
- const selectOrganization = async (req, res, _next) => {
410
- const { organizationId } = req.params;
411
- const { session } = res.locals;
412
- if (!organizationId) {
413
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
414
- return;
415
- }
416
- if (typeof session === "undefined") {
417
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
418
- return;
419
- }
420
- try {
421
- const organization = await require_services_organization_service.getOrganizationById(organizationId);
422
- await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: {
423
- activeOrganizationId: String(organization.id),
424
- activeProjectId: null
425
- } });
426
- const responseData = require_utils_responseData.formatResponse({
427
- message: (0, express_intlayer.t)({
428
- en: "Organization retrieved successfully",
429
- fr: "Organisation récupérée avec succès",
430
- es: "Organización recuperada con éxito"
431
- }),
432
- description: (0, express_intlayer.t)({
433
- en: "Your organization has been retrieved successfully",
434
- fr: "Votre organisation a été récupérée avec succès",
435
- es: "Su organización ha sido recuperada con éxito"
436
- }),
437
- data: require_utils_mapper_organization.mapOrganizationToAPI(organization)
438
- });
439
- res.json(responseData);
440
- return;
441
- } catch (error) {
442
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
443
- return;
444
- }
445
- };
446
- /**
447
- * Unselect an organization.
448
- */
449
- const unselectOrganization = async (_req, res, _next) => {
450
- const { session } = res.locals;
451
- try {
452
- if (typeof session === "undefined") {
453
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
454
- return;
455
- }
456
- await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: {
457
- activeOrganizationId: null,
458
- activeProjectId: null
459
- } });
460
- const responseData = require_utils_responseData.formatResponse({
461
- message: (0, express_intlayer.t)({
462
- en: "Organization unselected successfully",
463
- fr: "Organisation désélectionnée avec succès",
464
- es: "Organización deseleccionada con éxito"
465
- }),
466
- description: (0, express_intlayer.t)({
467
- en: "Your organization has been unselected successfully",
468
- fr: "Votre organisation a été désélectionnée avec succès",
469
- es: "Su organización ha sido deseleccionada con éxito"
470
- }),
471
- data: null
472
- });
473
- res.json(responseData);
474
- return;
475
- } catch (error) {
476
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
477
- return;
478
- }
479
- };
480
-
481
- //#endregion
482
- exports.addOrganization = addOrganization;
483
- exports.addOrganizationMember = addOrganizationMember;
484
- exports.deleteOrganization = deleteOrganization;
485
- exports.getOrganization = getOrganization;
486
- exports.getOrganizations = getOrganizations;
487
- exports.selectOrganization = selectOrganization;
488
- exports.unselectOrganization = unselectOrganization;
489
- exports.updateOrganization = updateOrganization;
490
- exports.updateOrganizationMembers = updateOrganizationMembers;
491
- exports.updateOrganizationMembersById = updateOrganizationMembersById;
492
- //# sourceMappingURL=organization.controller.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"organization.controller.cjs","names":["getOrganizationFiltersAndPagination","hasPermission","formatPaginatedResponse","mapOrganizationsToAPI","formatResponse","mapOrganizationToAPI","getPlanDetails","sendEmail","user","stripe","Stripe","SessionModel"],"sources":["../../../src/controllers/organization.controller.ts"],"sourcesContent":["import { logger } from '@logger';\nimport type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { SessionModel } from '@models/session.model';\nimport { sendEmail } from '@services/email.service';\nimport * as organizationService from '@services/organization.service';\nimport * as projectService from '@services/project.service';\nimport * as userService from '@services/user.service';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getOrganizationFiltersAndPagination,\n type OrganizationFiltersParams,\n} from '@utils/filtersAndPagination/getOrganizationFiltersAndPagination';\nimport {\n mapOrganizationsToAPI,\n mapOrganizationToAPI,\n} from '@utils/mapper/organization';\nimport { hasPermission } from '@utils/permissions';\nimport { getPlanDetails } from '@utils/plan';\nimport {\n formatPaginatedResponse,\n formatResponse,\n type PaginatedResponse,\n type ResponseData,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport { t } from 'express-intlayer';\nimport type { Types } from 'mongoose';\nimport { Stripe } from 'stripe';\nimport type {\n Organization,\n OrganizationAPI,\n OrganizationCreationData,\n} from '@/types/organization.types';\nimport type { User, UserAPI } from '@/types/user.types';\n\nexport type GetOrganizationsParams =\n FiltersAndPagination<OrganizationFiltersParams>;\nexport type GetOrganizationsResult = PaginatedResponse<OrganizationAPI>;\n\n/**\n * Retrieves a list of organizations based on filters and pagination.\n */\nexport const getOrganizations = async (\n req: Request<GetOrganizationsParams>,\n res: ResponseWithSession<GetOrganizationsResult>,\n _next: NextFunction\n) => {\n const { user, roles } = res.locals;\n const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } =\n getOrganizationFiltersAndPagination(req, res);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const organizations = await organizationService.findOrganizations(\n filters,\n skip,\n pageSize,\n sortOptions\n );\n\n if (\n !hasPermission(\n roles,\n 'organization:read'\n )({\n ...res.locals,\n targetOrganizations: organizations,\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const totalItems = await organizationService.countOrganizations(filters);\n\n const responseData = formatPaginatedResponse<OrganizationAPI>({\n data: mapOrganizationsToAPI(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<OrganizationAPI>;\n\n/**\n * Retrieves an organization by its ID.\n */\nexport const getOrganization = async (\n req: Request<GetOrganizationParam, any, any>,\n res: ResponseWithSession<GetOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { roles } = res.locals;\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 if (\n !hasPermission(\n roles,\n 'organization:read'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const responseData = formatResponse<OrganizationAPI>({\n data: mapOrganizationToAPI(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 AddOrganizationBody = OrganizationCreationData;\nexport type AddOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Adds a new organization to the database.\n */\nexport const addOrganization = async (\n req: Request<any, any, AddOrganizationBody>,\n res: ResponseWithSession<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 return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const newOrganization = await organizationService.createOrganization(\n organization,\n user.id\n );\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization created successfully',\n fr: 'Organisation créée avec succès',\n es: 'Organización creada con éxito',\n }),\n description: t({\n en: 'Your organization has been created successfully',\n fr: 'Votre organisation a été créée avec succès',\n es: 'Su organización ha sido creada con éxito',\n }),\n data: mapOrganizationToAPI(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<OrganizationAPI>;\n\n/**\n * Updates an existing organization in the database.\n */\nexport const updateOrganization = async (\n req: Request<undefined, undefined, UpdateOrganizationBody>,\n res: ResponseWithSession<UpdateOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, roles } = 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_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:write'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const updatedOrganization =\n await organizationService.updateOrganizationById(\n organization.id,\n organizationFields\n );\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(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 AddOrganizationMemberBody = {\n userEmail: string;\n};\nexport type AddOrganizationMemberResult = ResponseData<OrganizationAPI>;\n\n/**\n * Add member to the organization in the database.\n */\nexport const addOrganizationMember = async (\n req: Request<any, any, AddOrganizationMemberBody>,\n res: ResponseWithSession<AddOrganizationMemberResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, roles } = res.locals;\n const { userEmail } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const planType = getPlanDetails(organization.plan);\n\n if (\n planType.numberOfOrganizationUsers &&\n organization.membersIds.length >= planType.numberOfOrganizationUsers\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PLAN_USER_LIMIT_REACHED', {\n organizationId: organization.id,\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 const updatedOrganization =\n await organizationService.updateOrganizationById(organization.id, {\n ...organization,\n membersIds: [...organization.membersIds, newMember.id],\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(updatedOrganization),\n });\n\n res.json(responseData);\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: `${process.env.CLIENT_URL}/auth/login?email=${newMember.email}`,\n inviteFromIp: req.ip ?? '',\n inviteFromLocation: req.hostname,\n });\n\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UpdateOrganizationMembersBody = Partial<{\n membersIds: (User | UserAPI)['id'][];\n adminsIds: (User | UserAPI)['id'][];\n}>;\nexport type UpdateOrganizationMembersResult = ResponseData<OrganizationAPI>;\n\n/**\n * Update members to the organization in the database.\n */\nexport const updateOrganizationMembers = async (\n req: Request<any, any, UpdateOrganizationMembersBody>,\n res: ResponseWithSession<UpdateOrganizationMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, roles } = res.locals;\n const { membersIds, adminsIds } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n if (!membersIds) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_REQUEST_BODY');\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 (adminsIds?.filter((id) => membersIds?.includes(id)).length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_ADMIN'\n );\n return;\n }\n\n try {\n const existingUsers = await userService.getUsersByIds(membersIds);\n\n if (!existingUsers) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const existingAdmins = await userService.getUsersByIds(adminsIds!);\n\n if (!existingAdmins) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(organization.id, {\n membersIds: existingUsers.map((user) => user.id),\n adminsIds: existingAdmins.map((user) => user.id),\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(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 UpdateOrganizationMembersByIdParams = { organizationId: string };\nexport type UpdateOrganizationMembersByIdBody = Partial<{\n membersIds: (User | UserAPI)['id'][];\n adminsIds: (User | UserAPI)['id'][];\n}>;\nexport type UpdateOrganizationMembersByIdResult = ResponseData<OrganizationAPI>;\n\n/**\n * Admin-only: Update members of any organization by ID\n */\nexport const updateOrganizationMembersById = async (\n req: Request<\n UpdateOrganizationMembersByIdParams,\n any,\n UpdateOrganizationMembersByIdBody\n >,\n res: ResponseWithSession<UpdateOrganizationMembersByIdResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n const { organizationId } = req.params;\n const { membersIds, adminsIds } = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (user.role !== 'admin') {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n if (!membersIds) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_REQUEST_BODY');\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 try {\n const targetOrganization =\n await organizationService.getOrganizationById(organizationId);\n\n if (!targetOrganization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n const existingUsers = await userService.getUsersByIds(membersIds);\n\n if (!existingUsers) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const finalAdminsIds =\n adminsIds && adminsIds.length > 0\n ? adminsIds\n : targetOrganization.adminsIds;\n const existingAdmins = finalAdminsIds\n ? await userService.getUsersByIds(finalAdminsIds)\n : [];\n\n if (!existingAdmins || existingAdmins.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_ADMIN'\n );\n return;\n }\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(targetOrganization.id, {\n membersIds: existingUsers.map((user) => user.id),\n adminsIds: existingAdmins.map((user) => user.id),\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization members updated successfully',\n fr: \"Membres de l'organisation mis à jour avec succès\",\n es: 'Miembros de la organización actualizados con éxito',\n }),\n description: t({\n en: 'Organization members have been updated successfully',\n fr: \"Les membres de l'organisation ont été mis à jour avec succès\",\n es: 'Los miembros de la organización han sido actualizados con éxito',\n }),\n data: mapOrganizationToAPI(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<OrganizationAPI>;\n\n/**\n * Deletes an organization from the database by its ID.\n */\nexport const deleteOrganization = async (\n _req: Request,\n res: ResponseWithSession,\n _next: NextFunction\n): Promise<void> => {\n const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n const { organization, roles } = res.locals;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n const projects = await projectService.findProjects({\n organizationId: organization.id,\n });\n\n if (projects.length > 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECTS_EXIST', {\n organizationId: organization.id,\n });\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n // Cancel the subscription on Stripe if it exists\n if (organization.plan?.subscriptionId) {\n await stripe.subscriptions.cancel(organization.plan.subscriptionId);\n }\n\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<OrganizationAPI>({\n message: t({\n en: 'Organization deleted successfully',\n fr: 'Organisation supprimée avec succès',\n es: 'Organización eliminada con éxito',\n }),\n description: t({\n en: 'Your organization has been deleted successfully',\n fr: 'Votre organisation a été supprimée avec succès',\n es: 'Su organización ha sido eliminada con éxito',\n }),\n data: mapOrganizationToAPI(deletedOrganization),\n });\n\n // No need to update session here, as it's a delete operation\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type SelectOrganizationParam = {\n organizationId: string | Types.ObjectId;\n};\nexport type SelectOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Select an organization.\n */\nexport const selectOrganization = async (\n req: Request<SelectOrganizationParam>,\n res: ResponseWithSession<SelectOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organizationId } = req.params as Partial<SelectOrganizationParam>;\n const { session } = res.locals;\n\n if (!organizationId) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_ID_NOT_FOUND');\n return;\n }\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n try {\n const organization =\n await organizationService.getOrganizationById(organizationId);\n\n // Update session to set activeOrganizationId\n await SessionModel.updateOne(\n { _id: session.id },\n {\n $set: {\n activeOrganizationId: String(organization.id),\n activeProjectId: null,\n },\n }\n );\n\n // No need to update session here, as it's a select operation\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization retrieved successfully',\n fr: 'Organisation récupérée avec succès',\n es: 'Organización recuperada con éxito',\n }),\n description: t({\n en: 'Your organization has been retrieved successfully',\n fr: 'Votre organisation a été récupérée avec succès',\n es: 'Su organización ha sido recuperada con éxito',\n }),\n data: mapOrganizationToAPI(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 = async (\n _req: Request,\n res: ResponseWithSession<UnselectOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { session } = res.locals;\n try {\n // Update session to clear activeOrganizationId and activeProjectId\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n await SessionModel.updateOne(\n { _id: session.id },\n {\n $set: {\n activeOrganizationId: null,\n activeProjectId: null,\n },\n }\n );\n\n const responseData = formatResponse<null>({\n message: t({\n en: 'Organization unselected successfully',\n fr: 'Organisation désélectionnée avec succès',\n es: 'Organización deseleccionada con éxito',\n }),\n description: t({\n en: 'Your organization has been unselected successfully',\n fr: 'Votre organisation a été désélectionnée avec succès',\n es: 'Su organización ha sido deseleccionada con éxito',\n }),\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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"}