@intlayer/backend 7.2.1-canary.0 → 7.2.2

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 (290) 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/projectAccessKey.controller.d.ts.map +1 -1
  5. package/dist/types/controllers/tag.controller.d.ts.map +1 -1
  6. package/dist/types/emails/InviteUserEmail.d.ts +4 -4
  7. package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
  8. package/dist/types/emails/MagicLinkEmail.d.ts +4 -4
  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/SubscriptionPaymentError.d.ts +4 -4
  16. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
  17. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
  18. package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
  19. package/dist/types/emails/Welcome.d.ts +4 -4
  20. package/dist/types/models/dictionary.model.d.ts +4 -4
  21. package/dist/types/models/dictionary.model.d.ts.map +1 -1
  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/models/oAuth2.model.d.ts.map +1 -1
  26. package/dist/types/routes/ai.routes.d.ts.map +1 -1
  27. package/dist/types/routes/project.routes.d.ts.map +1 -1
  28. package/dist/types/schemas/dictionary.schema.d.ts +6 -6
  29. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
  30. package/dist/types/schemas/discussion.schema.d.ts +6 -6
  31. package/dist/types/schemas/oAuth2.schema.d.ts +5 -5
  32. package/dist/types/schemas/organization.schema.d.ts +6 -6
  33. package/dist/types/schemas/plans.schema.d.ts +6 -6
  34. package/dist/types/schemas/project.schema.d.ts +6 -6
  35. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  36. package/dist/types/schemas/session.schema.d.ts +6 -6
  37. package/dist/types/schemas/tag.schema.d.ts +6 -6
  38. package/dist/types/schemas/user.schema.d.ts +6 -6
  39. package/dist/types/services/email.service.d.ts +11 -11
  40. package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts +2 -2
  41. package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts +2 -2
  42. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +2 -2
  43. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +2 -2
  44. package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +2 -2
  45. package/package.json +17 -18
  46. package/dist/cjs/_virtual/_utils_asset.cjs +0 -98
  47. package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -25
  48. package/dist/cjs/controllers/ai.controller.cjs +0 -381
  49. package/dist/cjs/controllers/ai.controller.cjs.map +0 -1
  50. package/dist/cjs/controllers/dictionary.controller.cjs +0 -463
  51. package/dist/cjs/controllers/dictionary.controller.cjs.map +0 -1
  52. package/dist/cjs/controllers/eventListener.controller.cjs +0 -53
  53. package/dist/cjs/controllers/eventListener.controller.cjs.map +0 -1
  54. package/dist/cjs/controllers/newsletter.controller.cjs +0 -164
  55. package/dist/cjs/controllers/newsletter.controller.cjs.map +0 -1
  56. package/dist/cjs/controllers/oAuth2.controller.cjs +0 -22
  57. package/dist/cjs/controllers/oAuth2.controller.cjs.map +0 -1
  58. package/dist/cjs/controllers/organization.controller.cjs +0 -492
  59. package/dist/cjs/controllers/organization.controller.cjs.map +0 -1
  60. package/dist/cjs/controllers/project.controller.cjs +0 -430
  61. package/dist/cjs/controllers/project.controller.cjs.map +0 -1
  62. package/dist/cjs/controllers/projectAccessKey.controller.cjs +0 -161
  63. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +0 -1
  64. package/dist/cjs/controllers/search.controller.cjs +0 -14
  65. package/dist/cjs/controllers/search.controller.cjs.map +0 -1
  66. package/dist/cjs/controllers/stripe.controller.cjs +0 -149
  67. package/dist/cjs/controllers/stripe.controller.cjs.map +0 -1
  68. package/dist/cjs/controllers/tag.controller.cjs +0 -226
  69. package/dist/cjs/controllers/tag.controller.cjs.map +0 -1
  70. package/dist/cjs/controllers/user.controller.cjs +0 -269
  71. package/dist/cjs/controllers/user.controller.cjs.map +0 -1
  72. package/dist/cjs/emails/InviteUserEmail.cjs +0 -325
  73. package/dist/cjs/emails/InviteUserEmail.cjs.map +0 -1
  74. package/dist/cjs/emails/MagicLinkEmail.cjs +0 -242
  75. package/dist/cjs/emails/MagicLinkEmail.cjs.map +0 -1
  76. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +0 -301
  77. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +0 -1
  78. package/dist/cjs/emails/PasswordChangeConfirmation.cjs +0 -177
  79. package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +0 -1
  80. package/dist/cjs/emails/ResetUserPassword.cjs +0 -240
  81. package/dist/cjs/emails/ResetUserPassword.cjs.map +0 -1
  82. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +0 -202
  83. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +0 -1
  84. package/dist/cjs/emails/SubscriptionPaymentError.cjs +0 -202
  85. package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +0 -1
  86. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +0 -208
  87. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +0 -1
  88. package/dist/cjs/emails/ValidateUserEmail.cjs +0 -240
  89. package/dist/cjs/emails/ValidateUserEmail.cjs.map +0 -1
  90. package/dist/cjs/emails/Welcome.cjs +0 -216
  91. package/dist/cjs/emails/Welcome.cjs.map +0 -1
  92. package/dist/cjs/emails/index.cjs +0 -25
  93. package/dist/cjs/export.cjs +0 -24
  94. package/dist/cjs/index.cjs +0 -91
  95. package/dist/cjs/index.cjs.map +0 -1
  96. package/dist/cjs/logger/index.cjs +0 -13
  97. package/dist/cjs/logger/index.cjs.map +0 -1
  98. package/dist/cjs/middlewares/oAuth2.middleware.cjs +0 -42
  99. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +0 -1
  100. package/dist/cjs/middlewares/request.middleware.cjs +0 -17
  101. package/dist/cjs/middlewares/request.middleware.cjs.map +0 -1
  102. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +0 -22
  103. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +0 -1
  104. package/dist/cjs/models/dictionary.model.cjs +0 -10
  105. package/dist/cjs/models/dictionary.model.cjs.map +0 -1
  106. package/dist/cjs/models/discussion.model.cjs +0 -10
  107. package/dist/cjs/models/discussion.model.cjs.map +0 -1
  108. package/dist/cjs/models/oAuth2.model.cjs +0 -10
  109. package/dist/cjs/models/oAuth2.model.cjs.map +0 -1
  110. package/dist/cjs/models/organization.model.cjs +0 -10
  111. package/dist/cjs/models/organization.model.cjs.map +0 -1
  112. package/dist/cjs/models/project.model.cjs +0 -10
  113. package/dist/cjs/models/project.model.cjs.map +0 -1
  114. package/dist/cjs/models/session.model.cjs +0 -10
  115. package/dist/cjs/models/session.model.cjs.map +0 -1
  116. package/dist/cjs/models/tag.model.cjs +0 -10
  117. package/dist/cjs/models/tag.model.cjs.map +0 -1
  118. package/dist/cjs/models/user.model.cjs +0 -10
  119. package/dist/cjs/models/user.model.cjs.map +0 -1
  120. package/dist/cjs/routes/ai.routes.cjs +0 -75
  121. package/dist/cjs/routes/ai.routes.cjs.map +0 -1
  122. package/dist/cjs/routes/dictionary.routes.cjs +0 -64
  123. package/dist/cjs/routes/dictionary.routes.cjs.map +0 -1
  124. package/dist/cjs/routes/eventListener.routes.cjs +0 -20
  125. package/dist/cjs/routes/eventListener.routes.cjs.map +0 -1
  126. package/dist/cjs/routes/newsletter.routes.cjs +0 -34
  127. package/dist/cjs/routes/newsletter.routes.cjs.map +0 -1
  128. package/dist/cjs/routes/organization.routes.cjs +0 -70
  129. package/dist/cjs/routes/organization.routes.cjs.map +0 -1
  130. package/dist/cjs/routes/project.routes.cjs +0 -83
  131. package/dist/cjs/routes/project.routes.cjs.map +0 -1
  132. package/dist/cjs/routes/search.routes.cjs +0 -20
  133. package/dist/cjs/routes/search.routes.cjs.map +0 -1
  134. package/dist/cjs/routes/stripe.routes.cjs +0 -34
  135. package/dist/cjs/routes/stripe.routes.cjs.map +0 -1
  136. package/dist/cjs/routes/tags.routes.cjs +0 -40
  137. package/dist/cjs/routes/tags.routes.cjs.map +0 -1
  138. package/dist/cjs/routes/user.routes.cjs +0 -58
  139. package/dist/cjs/routes/user.routes.cjs.map +0 -1
  140. package/dist/cjs/schemas/dictionary.schema.cjs +0 -73
  141. package/dist/cjs/schemas/dictionary.schema.cjs.map +0 -1
  142. package/dist/cjs/schemas/discussion.schema.cjs +0 -81
  143. package/dist/cjs/schemas/discussion.schema.cjs.map +0 -1
  144. package/dist/cjs/schemas/oAuth2.schema.cjs +0 -49
  145. package/dist/cjs/schemas/oAuth2.schema.cjs.map +0 -1
  146. package/dist/cjs/schemas/organization.schema.cjs +0 -62
  147. package/dist/cjs/schemas/organization.schema.cjs.map +0 -1
  148. package/dist/cjs/schemas/plans.schema.cjs +0 -75
  149. package/dist/cjs/schemas/plans.schema.cjs.map +0 -1
  150. package/dist/cjs/schemas/project.schema.cjs +0 -112
  151. package/dist/cjs/schemas/project.schema.cjs.map +0 -1
  152. package/dist/cjs/schemas/session.schema.cjs +0 -43
  153. package/dist/cjs/schemas/session.schema.cjs.map +0 -1
  154. package/dist/cjs/schemas/tag.schema.cjs +0 -62
  155. package/dist/cjs/schemas/tag.schema.cjs.map +0 -1
  156. package/dist/cjs/schemas/user.schema.cjs +0 -87
  157. package/dist/cjs/schemas/user.schema.cjs.map +0 -1
  158. package/dist/cjs/services/dictionary.service.cjs +0 -176
  159. package/dist/cjs/services/dictionary.service.cjs.map +0 -1
  160. package/dist/cjs/services/email.service.cjs +0 -155
  161. package/dist/cjs/services/email.service.cjs.map +0 -1
  162. package/dist/cjs/services/oAuth2.service.cjs +0 -211
  163. package/dist/cjs/services/oAuth2.service.cjs.map +0 -1
  164. package/dist/cjs/services/organization.service.cjs +0 -106
  165. package/dist/cjs/services/organization.service.cjs.map +0 -1
  166. package/dist/cjs/services/project.service.cjs +0 -89
  167. package/dist/cjs/services/project.service.cjs.map +0 -1
  168. package/dist/cjs/services/projectAccessKey.service.cjs +0 -111
  169. package/dist/cjs/services/projectAccessKey.service.cjs.map +0 -1
  170. package/dist/cjs/services/subscription.service.cjs +0 -184
  171. package/dist/cjs/services/subscription.service.cjs.map +0 -1
  172. package/dist/cjs/services/tag.service.cjs +0 -88
  173. package/dist/cjs/services/tag.service.cjs.map +0 -1
  174. package/dist/cjs/services/user.service.cjs +0 -120
  175. package/dist/cjs/services/user.service.cjs.map +0 -1
  176. package/dist/cjs/types/Routes.cjs +0 -0
  177. package/dist/cjs/types/dictionary.types.cjs +0 -0
  178. package/dist/cjs/types/discussion.types.cjs +0 -0
  179. package/dist/cjs/types/oAuth2.types.cjs +0 -0
  180. package/dist/cjs/types/organization.types.cjs +0 -0
  181. package/dist/cjs/types/plan.types.cjs +0 -0
  182. package/dist/cjs/types/project.types.cjs +0 -0
  183. package/dist/cjs/types/session.types.cjs +0 -0
  184. package/dist/cjs/types/tag.types.cjs +0 -0
  185. package/dist/cjs/types/user.types.cjs +0 -10
  186. package/dist/cjs/types/user.types.cjs.map +0 -1
  187. package/dist/cjs/utils/AI/aiSdk.cjs +0 -94
  188. package/dist/cjs/utils/AI/aiSdk.cjs.map +0 -1
  189. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +0 -201
  190. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +0 -1
  191. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs +0 -150
  192. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs.map +0 -1
  193. package/dist/cjs/utils/AI/auditDictionary/index.cjs +0 -60
  194. package/dist/cjs/utils/AI/auditDictionary/index.cjs.map +0 -1
  195. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs +0 -63
  196. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs.map +0 -1
  197. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs +0 -45
  198. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs.map +0 -1
  199. package/dist/cjs/utils/AI/auditTag/index.cjs +0 -40
  200. package/dist/cjs/utils/AI/auditTag/index.cjs.map +0 -1
  201. package/dist/cjs/utils/AI/autocomplete/index.cjs +0 -41
  202. package/dist/cjs/utils/AI/autocomplete/index.cjs.map +0 -1
  203. package/dist/cjs/utils/AI/customQuery/index.cjs +0 -27
  204. package/dist/cjs/utils/AI/customQuery/index.cjs.map +0 -1
  205. package/dist/cjs/utils/AI/translateJSON/index.cjs +0 -71
  206. package/dist/cjs/utils/AI/translateJSON/index.cjs.map +0 -1
  207. package/dist/cjs/utils/access.cjs +0 -0
  208. package/dist/cjs/utils/accessControl.cjs +0 -133
  209. package/dist/cjs/utils/accessControl.cjs.map +0 -1
  210. package/dist/cjs/utils/auth/getAuth.cjs +0 -218
  211. package/dist/cjs/utils/auth/getAuth.cjs.map +0 -1
  212. package/dist/cjs/utils/cors.cjs +0 -33
  213. package/dist/cjs/utils/cors.cjs.map +0 -1
  214. package/dist/cjs/utils/ensureArrayQueryFilter.cjs +0 -13
  215. package/dist/cjs/utils/ensureArrayQueryFilter.cjs.map +0 -1
  216. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs +0 -16
  217. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs.map +0 -1
  218. package/dist/cjs/utils/errors/ErrorHandler.cjs +0 -76
  219. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +0 -1
  220. package/dist/cjs/utils/errors/ErrorsClass.cjs +0 -54
  221. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +0 -1
  222. package/dist/cjs/utils/errors/errorCodes.cjs +0 -1387
  223. package/dist/cjs/utils/errors/errorCodes.cjs.map +0 -1
  224. package/dist/cjs/utils/errors/index.cjs +0 -8
  225. package/dist/cjs/utils/extractJSON.cjs +0 -61
  226. package/dist/cjs/utils/extractJSON.cjs.map +0 -1
  227. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +0 -94
  228. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +0 -1
  229. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs +0 -65
  230. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs.map +0 -1
  231. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +0 -36
  232. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +0 -1
  233. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +0 -49
  234. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +0 -1
  235. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +0 -53
  236. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +0 -1
  237. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs +0 -57
  238. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs.map +0 -1
  239. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +0 -74
  240. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +0 -1
  241. package/dist/cjs/utils/httpStatusCodes.cjs +0 -401
  242. package/dist/cjs/utils/httpStatusCodes.cjs.map +0 -1
  243. package/dist/cjs/utils/mapper/dictionary.cjs +0 -29
  244. package/dist/cjs/utils/mapper/dictionary.cjs.map +0 -1
  245. package/dist/cjs/utils/mapper/organization.cjs +0 -19
  246. package/dist/cjs/utils/mapper/organization.cjs.map +0 -1
  247. package/dist/cjs/utils/mapper/project.cjs +0 -26
  248. package/dist/cjs/utils/mapper/project.cjs.map +0 -1
  249. package/dist/cjs/utils/mapper/session.cjs +0 -15
  250. package/dist/cjs/utils/mapper/session.cjs.map +0 -1
  251. package/dist/cjs/utils/mapper/tag.cjs +0 -25
  252. package/dist/cjs/utils/mapper/tag.cjs.map +0 -1
  253. package/dist/cjs/utils/mapper/user.cjs +0 -24
  254. package/dist/cjs/utils/mapper/user.cjs.map +0 -1
  255. package/dist/cjs/utils/mergeFunctionTypes.cjs +0 -0
  256. package/dist/cjs/utils/mongoDB/connectDB.cjs +0 -32
  257. package/dist/cjs/utils/mongoDB/connectDB.cjs.map +0 -1
  258. package/dist/cjs/utils/mongoDB/types.cjs +0 -0
  259. package/dist/cjs/utils/oAuth2.cjs +0 -25
  260. package/dist/cjs/utils/oAuth2.cjs.map +0 -1
  261. package/dist/cjs/utils/permissions.cjs +0 -103
  262. package/dist/cjs/utils/permissions.cjs.map +0 -1
  263. package/dist/cjs/utils/plan.cjs +0 -63
  264. package/dist/cjs/utils/plan.cjs.map +0 -1
  265. package/dist/cjs/utils/rateLimiter.cjs +0 -48
  266. package/dist/cjs/utils/rateLimiter.cjs.map +0 -1
  267. package/dist/cjs/utils/removeObjectKeys.cjs +0 -11
  268. package/dist/cjs/utils/removeObjectKeys.cjs.map +0 -1
  269. package/dist/cjs/utils/responseData.cjs +0 -33
  270. package/dist/cjs/utils/responseData.cjs.map +0 -1
  271. package/dist/cjs/utils/validation/validateArray.cjs +0 -31
  272. package/dist/cjs/utils/validation/validateArray.cjs.map +0 -1
  273. package/dist/cjs/utils/validation/validateDictionary.cjs +0 -35
  274. package/dist/cjs/utils/validation/validateDictionary.cjs.map +0 -1
  275. package/dist/cjs/utils/validation/validateEmail.cjs +0 -20
  276. package/dist/cjs/utils/validation/validateEmail.cjs.map +0 -1
  277. package/dist/cjs/utils/validation/validateOrganization.cjs +0 -43
  278. package/dist/cjs/utils/validation/validateOrganization.cjs.map +0 -1
  279. package/dist/cjs/utils/validation/validatePhone.cjs +0 -20
  280. package/dist/cjs/utils/validation/validatePhone.cjs.map +0 -1
  281. package/dist/cjs/utils/validation/validateProject.cjs +0 -55
  282. package/dist/cjs/utils/validation/validateProject.cjs.map +0 -1
  283. package/dist/cjs/utils/validation/validateString.cjs +0 -21
  284. package/dist/cjs/utils/validation/validateString.cjs.map +0 -1
  285. package/dist/cjs/utils/validation/validateTag.cjs +0 -47
  286. package/dist/cjs/utils/validation/validateTag.cjs.map +0 -1
  287. package/dist/cjs/utils/validation/validateUser.cjs +0 -47
  288. package/dist/cjs/utils/validation/validateUser.cjs.map +0 -1
  289. package/dist/cjs/webhooks/stripe.webhook.cjs +0 -116
  290. package/dist/cjs/webhooks/stripe.webhook.cjs.map +0 -1
@@ -1,430 +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_project_service = require('../services/project.service.cjs');
6
- const require_utils_permissions = require('../utils/permissions.cjs');
7
- const require_services_user_service = require('../services/user.service.cjs');
8
- const require_models_session_model = require('../models/session.model.cjs');
9
- const require_utils_plan = require('../utils/plan.cjs');
10
- const require_utils_filtersAndPagination_getProjectFiltersAndPagination = require('../utils/filtersAndPagination/getProjectFiltersAndPagination.cjs');
11
- const require_utils_mapper_project = require('../utils/mapper/project.cjs');
12
- let express_intlayer = require("express-intlayer");
13
-
14
- //#region src/controllers/project.controller.ts
15
- /**
16
- * Retrieves a list of projects based on filters and pagination.
17
- */
18
- const getProjects = async (req, res, _next) => {
19
- const { user, organization, roles } = res.locals;
20
- const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } = require_utils_filtersAndPagination_getProjectFiltersAndPagination.getProjectFiltersAndPagination(req, res);
21
- if (!user) {
22
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
23
- return;
24
- }
25
- if (!organization && !roles.includes("admin")) {
26
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
27
- return;
28
- }
29
- try {
30
- const projects = await require_services_project_service.findProjects(filters, skip, pageSize, sortOptions);
31
- if (!require_utils_permissions.hasPermission(roles, "project:read")({
32
- ...res.locals,
33
- targetProjects: projects
34
- })) {
35
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
36
- return;
37
- }
38
- const totalItems = await require_services_project_service.countProjects(filters);
39
- const responseData = require_utils_responseData.formatPaginatedResponse({
40
- data: require_utils_mapper_project.mapProjectsToAPI(projects),
41
- page,
42
- pageSize,
43
- totalPages: getNumberOfPages(totalItems),
44
- totalItems
45
- });
46
- res.json(responseData);
47
- return;
48
- } catch (error) {
49
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
50
- return;
51
- }
52
- };
53
- /**
54
- * Adds a new project to the database.
55
- */
56
- const addProject = async (req, res, _next) => {
57
- const { organization, user, roles } = res.locals;
58
- const projectData = req.body;
59
- if (!user) {
60
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
61
- return;
62
- }
63
- if (!organization) {
64
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
65
- return;
66
- }
67
- if (!projectData) require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
68
- if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
69
- ...res.locals,
70
- targetOrganizations: [organization]
71
- })) {
72
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
73
- return;
74
- }
75
- const { plan } = organization;
76
- const planType = require_utils_plan.getPlanDetails(plan);
77
- if (planType.numberOfProjects) {
78
- if (await require_services_project_service.countProjects({ organizationId: organization.id }) >= planType.numberOfProjects) {
79
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PLAN_PROJECT_LIMIT_REACHED", { organizationId: organization.id });
80
- return;
81
- }
82
- }
83
- const project = {
84
- membersIds: [user.id],
85
- adminsIds: [user.id],
86
- creatorId: user.id,
87
- organizationId: organization.id,
88
- ...projectData
89
- };
90
- try {
91
- const formattedProject = require_utils_mapper_project.mapProjectToAPI(await require_services_project_service.createProject(project));
92
- const responseData = require_utils_responseData.formatResponse({
93
- message: (0, express_intlayer.t)({
94
- en: "Project created successfully",
95
- fr: "Projet créé avec succès",
96
- es: "Proyecto creado con éxito"
97
- }),
98
- description: (0, express_intlayer.t)({
99
- en: "Your project has been created successfully",
100
- fr: "Votre projet a été créé avec succès",
101
- es: "Su proyecto ha sido creado con éxito"
102
- }),
103
- data: formattedProject
104
- });
105
- res.json(responseData);
106
- return;
107
- } catch (error) {
108
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
109
- return;
110
- }
111
- };
112
- /**
113
- * Updates an existing project in the database.
114
- */
115
- const updateProject = async (req, res, _next) => {
116
- const { organization, project, user, roles } = res.locals;
117
- const projectData = req.body;
118
- if (!user) {
119
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
120
- return;
121
- }
122
- if (!project) {
123
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
124
- return;
125
- }
126
- if (!organization) {
127
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
128
- return;
129
- }
130
- if (String(project.organizationId) !== String(organization.id)) {
131
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_IN_ORGANIZATION");
132
- return;
133
- }
134
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
135
- ...res.locals,
136
- targetProjectIds: [String(project.id)]
137
- })) {
138
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
139
- return;
140
- }
141
- try {
142
- const formattedProject = require_utils_mapper_project.mapProjectToAPI(await require_services_project_service.updateProjectById(project.id, projectData));
143
- const responseData = require_utils_responseData.formatResponse({
144
- message: (0, express_intlayer.t)({
145
- en: "Project updated successfully",
146
- fr: "Projet mis à jour avec succès",
147
- es: "Proyecto actualizado con éxito"
148
- }),
149
- description: (0, express_intlayer.t)({
150
- en: "Your project has been updated successfully",
151
- fr: "Votre projet a été mis à jour avec succès",
152
- es: "Su proyecto ha sido actualizado con éxito"
153
- }),
154
- data: formattedProject
155
- });
156
- res.json(responseData);
157
- return;
158
- } catch (error) {
159
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
160
- return;
161
- }
162
- };
163
- /**
164
- * Update members to the dictionary in the database.
165
- */
166
- const updateProjectMembers = async (req, res, _next) => {
167
- const { user, project, organization, roles } = res.locals;
168
- const { membersIds } = req.body;
169
- if (!user) {
170
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
171
- return;
172
- }
173
- if (!project) {
174
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
175
- return;
176
- }
177
- if (!organization) {
178
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
179
- return;
180
- }
181
- if (membersIds?.length === 0) {
182
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_MUST_HAVE_MEMBER");
183
- return;
184
- }
185
- if (membersIds?.map((el) => el.isAdmin)?.length === 0) {
186
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_MUST_HAVE_ADMIN");
187
- return;
188
- }
189
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
190
- ...res.locals,
191
- targetProjectIds: [String(project.id)]
192
- })) {
193
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
194
- return;
195
- }
196
- try {
197
- const existingUsers = [];
198
- if (membersIds) {
199
- const userIdList = membersIds?.filter((member) => !organization?.membersIds.includes(member.userId)).map((member) => member.userId);
200
- const users = await require_services_user_service.getUsersByIds(userIdList);
201
- if (users) {
202
- const userMap = users.map((user$1) => ({
203
- user: user$1,
204
- isAdmin: membersIds.find((member) => String(member.userId) === String(user$1.id))?.isAdmin ?? false
205
- }));
206
- existingUsers.push(...userMap);
207
- }
208
- }
209
- const formattedMembers = existingUsers.map((user$1) => user$1.user.id);
210
- const formattedAdmin = existingUsers.filter((el) => el.isAdmin).map((user$1) => user$1.user.id);
211
- const formattedProject = require_utils_mapper_project.mapProjectToAPI(await require_services_project_service.updateProjectById(project.id, {
212
- ...project,
213
- membersIds: formattedMembers,
214
- adminsIds: formattedAdmin
215
- }));
216
- const responseData = require_utils_responseData.formatResponse({
217
- message: (0, express_intlayer.t)({
218
- en: "Project members updated successfully",
219
- fr: "Membres du projet mis à jour avec succès",
220
- es: "Miembros del proyecto actualizados con éxito"
221
- }),
222
- description: (0, express_intlayer.t)({
223
- en: "Your project members have been updated successfully",
224
- fr: "Les membres de votre projet ont été mis à jour avec succès",
225
- es: "Los miembros de su proyecto han sido actualizados con éxito"
226
- }),
227
- data: formattedProject
228
- });
229
- res.json(responseData);
230
- return;
231
- } catch (error) {
232
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
233
- return;
234
- }
235
- };
236
- /**
237
- * Pushes a project configuration to the database.
238
- * @param req - Express request object.
239
- * @param res - Express response object.
240
- * @returns Response confirming the deletion.
241
- */
242
- const pushProjectConfiguration = async (req, res, _next) => {
243
- const { user, project, roles } = res.locals;
244
- const projectConfiguration = req.body;
245
- if (!user) {
246
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
247
- return;
248
- }
249
- if (!project) {
250
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
251
- return;
252
- }
253
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
254
- ...res.locals,
255
- targetProjectIds: [String(project.id)]
256
- })) {
257
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
258
- return;
259
- }
260
- try {
261
- const projectObject = await require_services_project_service.getProjectById(project.id);
262
- projectObject.configuration = projectConfiguration;
263
- projectObject.save();
264
- if (!projectObject.configuration) {
265
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_UPDATE_FAILED", { projectId: project.id });
266
- return;
267
- }
268
- const responseData = require_utils_responseData.formatResponse({
269
- message: (0, express_intlayer.t)({
270
- en: "Project configuration updated successfully",
271
- fr: "Configuration du projet mise à jour avec succès",
272
- es: "Configuración del proyecto actualizada con éxito"
273
- }),
274
- description: (0, express_intlayer.t)({
275
- en: "Your project configuration has been updated successfully",
276
- fr: "La configuration du projet a été mise à jour avec succès",
277
- es: "Su configuración del proyecto ha sido actualizada con éxito"
278
- }),
279
- data: projectObject.configuration
280
- });
281
- res.json(responseData);
282
- return;
283
- } catch (error) {
284
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
285
- return;
286
- }
287
- };
288
- /**
289
- * Deletes a project from the database by its ID.
290
- * @param req - Express request object.
291
- * @param res - Express response object.
292
- * @returns Response confirming the deletion.
293
- */
294
- const deleteProject = async (_req, res, _next) => {
295
- const { user, organization, project, session, roles } = res.locals;
296
- if (!user) {
297
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
298
- return;
299
- }
300
- if (!organization) {
301
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
302
- return;
303
- }
304
- if (!project) {
305
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
306
- return;
307
- }
308
- if (typeof session === "undefined") {
309
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
310
- return;
311
- }
312
- if (!require_utils_permissions.hasPermission(roles, "project:admin")({
313
- ...res.locals,
314
- targetProjectIds: [String(project.id)]
315
- })) {
316
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
317
- return;
318
- }
319
- try {
320
- const projectToDelete = await require_services_project_service.getProjectById(project.id);
321
- if (String(projectToDelete.organizationId) !== String(organization.id)) {
322
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_IN_ORGANIZATION");
323
- return;
324
- }
325
- const deletedProject = await require_services_project_service.deleteProjectById(project.id);
326
- if (!deletedProject) {
327
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED", { projectId: project.id });
328
- return;
329
- }
330
- require_logger_index.logger.info(`Project deleted: ${String(deletedProject.id)}`);
331
- const responseData = require_utils_responseData.formatResponse({
332
- message: (0, express_intlayer.t)({
333
- en: "Project deleted successfully",
334
- fr: "Projet supprimé avec succès",
335
- es: "Proyecto eliminado con éxito"
336
- }),
337
- description: (0, express_intlayer.t)({
338
- en: "Your project has been deleted successfully",
339
- fr: "Votre projet a été supprimé avec succès",
340
- es: "Su proyecto ha sido eliminado con éxito"
341
- }),
342
- data: require_utils_mapper_project.mapProjectToAPI(deletedProject)
343
- });
344
- await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: { activeProjectId: null } });
345
- res.json(responseData);
346
- return;
347
- } catch (error) {
348
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
349
- return;
350
- }
351
- };
352
- /**
353
- * Select a project.
354
- */
355
- const selectProject = async (req, res, _next) => {
356
- const { projectId } = req.params;
357
- const { session } = res.locals;
358
- if (!projectId) {
359
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_ID_NOT_FOUND");
360
- return;
361
- }
362
- if (typeof session === "undefined") {
363
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
364
- return;
365
- }
366
- try {
367
- const project = await require_services_project_service.getProjectById(projectId);
368
- await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: { activeProjectId: String(projectId) } });
369
- const responseData = require_utils_responseData.formatResponse({
370
- message: (0, express_intlayer.t)({
371
- en: "Project selected successfully",
372
- fr: "Projet sélectionné avec succès",
373
- es: "Proyecto seleccionado con éxito"
374
- }),
375
- description: (0, express_intlayer.t)({
376
- en: "Your project has been selected successfully",
377
- fr: "Votre projet a été sélectionné avec succès",
378
- es: "Su proyecto ha sido seleccionado con éxito"
379
- }),
380
- data: require_utils_mapper_project.mapProjectToAPI(project)
381
- });
382
- res.json(responseData);
383
- return;
384
- } catch (error) {
385
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
386
- return;
387
- }
388
- };
389
- /**
390
- * Unselect a project.
391
- */
392
- const unselectProject = async (_req, res, _next) => {
393
- const { session } = res.locals;
394
- if (typeof session === "undefined") {
395
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
396
- return;
397
- }
398
- try {
399
- await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: { activeProjectId: null } });
400
- const responseData = require_utils_responseData.formatResponse({
401
- message: (0, express_intlayer.t)({
402
- en: "Project unselected successfully",
403
- fr: "Projet désélectionné avec succès",
404
- es: "Proyecto deseleccionado con éxito"
405
- }),
406
- description: (0, express_intlayer.t)({
407
- en: "Your project has been unselected successfully",
408
- fr: "Votre projet a été désélectionné avec succès",
409
- es: "Su proyecto ha sido deseleccionado con éxito"
410
- }),
411
- data: null
412
- });
413
- res.json(responseData);
414
- return;
415
- } catch (error) {
416
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
417
- return;
418
- }
419
- };
420
-
421
- //#endregion
422
- exports.addProject = addProject;
423
- exports.deleteProject = deleteProject;
424
- exports.getProjects = getProjects;
425
- exports.pushProjectConfiguration = pushProjectConfiguration;
426
- exports.selectProject = selectProject;
427
- exports.unselectProject = unselectProject;
428
- exports.updateProject = updateProject;
429
- exports.updateProjectMembers = updateProjectMembers;
430
- //# sourceMappingURL=project.controller.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project.controller.cjs","names":["getProjectFiltersAndPagination","hasPermission","formatPaginatedResponse","mapProjectsToAPI","getPlanDetails","project: ProjectData","mapProjectToAPI","formatResponse","existingUsers: UserAndAdmin[]","userMap: UserAndAdmin[]","user","formattedMembers: Types.ObjectId[]","formattedAdmin: Types.ObjectId[]","SessionModel"],"sources":["../../../src/controllers/project.controller.ts"],"sourcesContent":["import { logger } from '@logger';\nimport type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { SessionModel } from '@models/session.model';\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 getProjectFiltersAndPagination,\n type ProjectFiltersParams,\n} from '@utils/filtersAndPagination/getProjectFiltersAndPagination';\nimport { mapProjectsToAPI, mapProjectToAPI } from '@utils/mapper/project';\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 type {\n ProjectAPI,\n ProjectConfiguration,\n ProjectCreationData,\n ProjectData,\n} from '@/types/project.types';\nimport type { User } from '@/types/user.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: ResponseWithSession<GetProjectsResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization, roles } = res.locals;\n const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } =\n getProjectFiltersAndPagination(req, res);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!organization && !roles.includes('admin')) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n try {\n const projects = await projectService.findProjects(\n filters,\n skip,\n pageSize,\n sortOptions\n );\n\n if (\n !hasPermission(\n roles,\n 'project:read'\n )({\n ...res.locals,\n targetProjects: projects,\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const totalItems = await projectService.countProjects(filters);\n\n const formattedProjects = mapProjectsToAPI(projects);\n\n const responseData = formatPaginatedResponse<ProjectAPI>({\n data: formattedProjects,\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<ProjectAPI>;\n\n/**\n * Adds a new project to the database.\n */\nexport const addProject = async (\n req: Request<any, any, AddProjectBody>,\n res: ResponseWithSession<AddProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, roles } = res.locals;\n const projectData = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (!projectData) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\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 { plan } = organization;\n\n const planType = getPlanDetails(plan);\n\n if (planType.numberOfProjects) {\n const projectCount = await projectService.countProjects({\n organizationId: organization.id,\n });\n\n if (projectCount >= planType.numberOfProjects) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'PLAN_PROJECT_LIMIT_REACHED',\n {\n organizationId: organization.id,\n }\n );\n return;\n }\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 formattedProject = mapProjectToAPI(newProject);\n\n const responseData = formatResponse<ProjectAPI>({\n message: t({\n en: 'Project created successfully',\n fr: 'Projet créé avec succès',\n es: 'Proyecto creado con éxito',\n }),\n description: t({\n en: 'Your project has been created successfully',\n fr: 'Votre projet a été créé avec succès',\n es: 'Su proyecto ha sido creado con éxito',\n }),\n data: formattedProject,\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 UpdateProjectBody = Partial<ProjectAPI>;\nexport type UpdateProjectResult = ResponseData<ProjectAPI>;\n\n/**\n * Updates an existing project in the database.\n */\nexport const updateProject = async (\n req: Request<any, any, UpdateProjectBody>,\n res: ResponseWithSession<UpdateProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, project, user, roles } = res.locals;\n const projectData = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\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_DEFINED');\n return;\n }\n\n if (String(project.organizationId) !== String(organization.id)) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_IN_ORGANIZATION');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [String(project.id)],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const updatedProject = await projectService.updateProjectById(\n project.id,\n projectData\n );\n\n const formattedProject = mapProjectToAPI(updatedProject);\n\n const responseData = formatResponse<ProjectAPI>({\n message: t({\n en: 'Project updated successfully',\n fr: 'Projet mis à jour avec succès',\n es: 'Proyecto actualizado con éxito',\n }),\n description: t({\n en: 'Your project has been updated successfully',\n fr: 'Votre projet a été mis à jour avec succès',\n es: 'Su proyecto ha sido actualizado con éxito',\n }),\n data: formattedProject,\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 };\nexport type ProjectMemberByIdOption = {\n userId: string | Types.ObjectId;\n isAdmin?: boolean;\n};\n\nexport type UpdateProjectMembersBody = Partial<{\n membersIds: ProjectMemberByIdOption[];\n}>;\nexport type UpdateProjectMembersResult = ResponseData<ProjectAPI>;\n\n/**\n * Update members to the dictionary in the database.\n */\nexport const updateProjectMembers = async (\n req: Request<any, any, UpdateProjectMembersBody>,\n res: ResponseWithSession<UpdateProjectMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, organization, roles } = res.locals;\n const { membersIds } = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\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 if (\n !hasPermission(\n roles,\n 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [String(project.id)],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\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 Types.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: Types.ObjectId[] = existingUsers.map(\n (user) => user.user.id\n );\n const formattedAdmin: Types.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 formattedProject = mapProjectToAPI(updatedOrganization);\n\n const responseData = formatResponse<ProjectAPI>({\n message: t({\n en: 'Project members updated successfully',\n fr: 'Membres du projet mis à jour avec succès',\n es: 'Miembros del proyecto actualizados con éxito',\n }),\n description: t({\n en: 'Your project members have been updated successfully',\n fr: 'Les membres de votre projet ont été mis à jour avec succès',\n es: 'Los miembros de su proyecto han sido actualizados con éxito',\n }),\n data: formattedProject,\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 PushProjectConfigurationBody = ProjectConfiguration;\nexport type PushProjectConfigurationResult = ResponseData<ProjectConfiguration>;\n\n/**\n * Pushes a project configuration to the database.\n * @param req - Express request object.\n * @param res - Express response object.\n * @returns Response confirming the deletion.\n */\nexport const pushProjectConfiguration = async (\n req: Request<any, any, PushProjectConfigurationBody>,\n res: ResponseWithSession<PushProjectConfigurationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, roles } = res.locals;\n const projectConfiguration = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [String(project.id)],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const projectObject = await projectService.getProjectById(project.id);\n projectObject.configuration = projectConfiguration;\n\n projectObject.save();\n\n if (!projectObject.configuration) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_UPDATE_FAILED', {\n projectId: project.id,\n });\n return;\n }\n\n const responseData = formatResponse<ProjectConfiguration>({\n message: t({\n en: 'Project configuration updated successfully',\n fr: 'Configuration du projet mise à jour avec succès',\n es: 'Configuración del proyecto actualizada con éxito',\n }),\n description: t({\n en: 'Your project configuration has been updated successfully',\n fr: 'La configuration du projet a été mise à jour avec succès',\n es: 'Su configuración del proyecto ha sido actualizada con éxito',\n }),\n data: projectObject.configuration,\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<ProjectAPI>;\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: ResponseWithSession<DeleteProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization, project, session, roles } = res.locals;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'project:admin'\n )({\n ...res.locals,\n targetProjectIds: [String(project.id)],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const projectToDelete = await projectService.getProjectById(project.id);\n\n if (String(projectToDelete.organizationId) !== String(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_DEFINED', {\n projectId: project.id,\n });\n\n return;\n }\n\n logger.info(`Project deleted: ${String(deletedProject.id)}`);\n\n const responseData = formatResponse<ProjectAPI>({\n message: t({\n en: 'Project deleted successfully',\n fr: 'Projet supprimé avec succès',\n es: 'Proyecto eliminado con éxito',\n }),\n description: t({\n en: 'Your project has been deleted successfully',\n fr: 'Votre projet a été supprimé avec succès',\n es: 'Su proyecto ha sido eliminado con éxito',\n }),\n data: mapProjectToAPI(deletedProject),\n });\n\n await SessionModel.updateOne(\n { _id: session.id },\n { $set: { activeProjectId: null } }\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 SelectProjectParam = { projectId: string | Types.ObjectId };\nexport type SelectProjectResult = ResponseData<ProjectAPI>;\n\n/**\n * Select a project.\n */\nexport const selectProject = async (\n req: Request<SelectProjectParam>,\n res: ResponseWithSession<SelectProjectResult>,\n _next: NextFunction\n) => {\n const { projectId } = req.params;\n const { session } = res.locals;\n\n if (!projectId) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_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 project = await projectService.getProjectById(projectId);\n\n await SessionModel.updateOne(\n { _id: session.id },\n { $set: { activeProjectId: String(projectId) } }\n );\n\n const responseData = formatResponse<ProjectAPI>({\n message: t({\n en: 'Project selected successfully',\n fr: 'Projet sélectionné avec succès',\n es: 'Proyecto seleccionado con éxito',\n }),\n description: t({\n en: 'Your project has been selected successfully',\n fr: 'Votre projet a été sélectionné avec succès',\n es: 'Su proyecto ha sido seleccionado con éxito',\n }),\n data: mapProjectToAPI(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 = async (\n _req: Request,\n res: ResponseWithSession<UnselectProjectResult>,\n _next: NextFunction\n) => {\n const { session } = res.locals;\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n try {\n await SessionModel.updateOne(\n { _id: session.id },\n { $set: { activeProjectId: null } }\n );\n\n const responseData = formatResponse<null>({\n message: t({\n en: 'Project unselected successfully',\n fr: 'Projet désélectionné avec succès',\n es: 'Proyecto deseleccionado con éxito',\n }),\n description: t({\n en: 'Your project has been unselected successfully',\n fr: 'Votre projet a été désélectionné avec succès',\n es: 'Su proyecto ha sido deseleccionado 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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"}
@@ -1,161 +0,0 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const require_utils_responseData = require('../utils/responseData.cjs');
3
- const require_utils_errors_ErrorHandler = require('../utils/errors/ErrorHandler.cjs');
4
- const require_utils_permissions = require('../utils/permissions.cjs');
5
- const require_services_email_service = require('../services/email.service.cjs');
6
- const require_services_projectAccessKey_service = require('../services/projectAccessKey.service.cjs');
7
- let express_intlayer = require("express-intlayer");
8
-
9
- //#region src/controllers/projectAccessKey.controller.ts
10
- /**
11
- * Adds a new access key to a project.
12
- */
13
- const addNewAccessKey = async (req, res, _next) => {
14
- const { user, project, roles, permissions } = res.locals;
15
- const { grants, name, expiresAt } = req.body;
16
- if (!project) {
17
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
18
- return;
19
- }
20
- if (!user) {
21
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
22
- return;
23
- }
24
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
25
- ...res.locals,
26
- targetProjectIds: [project.id]
27
- })) {
28
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
29
- return;
30
- }
31
- const filteredPermisions = require_utils_permissions.intersectPermissions(permissions, grants);
32
- try {
33
- const newAccessKey = await require_services_projectAccessKey_service.addNewAccessKey({
34
- name,
35
- expiresAt,
36
- grants: filteredPermisions
37
- }, project.id, user);
38
- const responseData = require_utils_responseData.formatResponse({
39
- message: (0, express_intlayer.t)({
40
- en: "Access key created successfully",
41
- es: "Clave de acceso creada con éxito",
42
- fr: "Clé d'accès créée avec succès"
43
- }),
44
- description: (0, express_intlayer.t)({
45
- en: "The access key has been created successfully",
46
- es: "La clave de acceso ha sido creada con éxito",
47
- fr: "La clé d'accès a été créée avec succès"
48
- }),
49
- data: newAccessKey
50
- });
51
- res.json(responseData);
52
- require_services_email_service.sendEmail({
53
- type: "oAuthTokenCreated",
54
- to: user.email,
55
- username: user.name,
56
- applicationName: newAccessKey.name ?? newAccessKey.clientId,
57
- scopes: newAccessKey.grants,
58
- tokenDetailsUrl: `${process.env.CLIENT_URL}/oauth2/token`,
59
- securityLogUrl: `${process.env.CLIENT_URL}/security-log`,
60
- supportUrl: `${process.env.CLIENT_URL}/support`
61
- });
62
- return;
63
- } catch (error) {
64
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
65
- return;
66
- }
67
- };
68
- /**
69
- * Deletes an access key from a project.
70
- */
71
- const deleteAccessKey = async (req, res, _next) => {
72
- const { user, project, roles } = res.locals;
73
- const { clientId } = req.body;
74
- if (!project) {
75
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
76
- return;
77
- }
78
- if (!user) {
79
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
80
- return;
81
- }
82
- if (!clientId) {
83
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "CLIENT_ID_NOT_FOUND");
84
- return;
85
- }
86
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
87
- ...res.locals,
88
- targetProjectIds: [project.id]
89
- })) {
90
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
91
- return;
92
- }
93
- try {
94
- if (!await require_services_projectAccessKey_service.deleteAccessKey(clientId, project, user.id)) {
95
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ACCESS_KEY_NOT_FOUND", { clientId });
96
- return;
97
- }
98
- const responseData = require_utils_responseData.formatResponse({
99
- message: (0, express_intlayer.t)({
100
- en: "Access key deleted successfully",
101
- es: "Clave de acceso eliminada con éxito",
102
- fr: "Clé d'accès supprimée avec succès"
103
- }),
104
- description: (0, express_intlayer.t)({
105
- en: "The access key has been deleted successfully",
106
- es: "La clave de acceso ha sido eliminada con éxito",
107
- fr: "La clé d'accès a été supprimée avec succès"
108
- }),
109
- data: null
110
- });
111
- res.json(responseData);
112
- return;
113
- } catch (error) {
114
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
115
- return;
116
- }
117
- };
118
- /**
119
- * Refreshes an access key from a project.
120
- */
121
- const refreshAccessKey = async (req, res, _next) => {
122
- const { user, project, roles } = res.locals;
123
- const { clientId } = req.body;
124
- if (!project) require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
125
- if (!user) require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
126
- if (!clientId) require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "CLIENT_ID_NOT_FOUND");
127
- if (!require_utils_permissions.hasPermission(roles, "project:write")({
128
- ...res.locals,
129
- targetProjectIds: [project?.id]
130
- })) {
131
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
132
- return;
133
- }
134
- try {
135
- const newAccessKey = await require_services_projectAccessKey_service.refreshAccessKey(clientId, project?.id, user?.id);
136
- const responseData = require_utils_responseData.formatResponse({
137
- message: (0, express_intlayer.t)({
138
- en: "Access key refreshed successfully",
139
- es: "Clave de acceso actualizada con éxito",
140
- fr: "Clé d'accès actualisée avec succès"
141
- }),
142
- description: (0, express_intlayer.t)({
143
- en: "The access key has been refreshed successfully",
144
- es: "La clave de acceso ha sido actualizada con éxito",
145
- fr: "La clé d'accès a été actualisée avec succès"
146
- }),
147
- data: newAccessKey
148
- });
149
- res.json(responseData);
150
- return;
151
- } catch (error) {
152
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
153
- return;
154
- }
155
- };
156
-
157
- //#endregion
158
- exports.addNewAccessKey = addNewAccessKey;
159
- exports.deleteAccessKey = deleteAccessKey;
160
- exports.refreshAccessKey = refreshAccessKey;
161
- //# sourceMappingURL=projectAccessKey.controller.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projectAccessKey.controller.cjs","names":["hasPermission","intersectPermissions","formatResponse"],"sources":["../../../src/controllers/projectAccessKey.controller.ts"],"sourcesContent":["import type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { sendEmail } from '@services/email.service';\nimport * as projectAccessKeyService from '@services/projectAccessKey.service';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport { hasPermission, intersectPermissions } from '@utils/permissions';\nimport { formatResponse, type ResponseData } from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport { t } from 'express-intlayer';\nimport type { AccessKeyData, OAuth2Access } from '@/types/project.types';\n\nexport type AddNewAccessKeyBody = AccessKeyData;\nexport type AddNewAccessKeyResponse = ResponseData<OAuth2Access>;\n\n/**\n * Adds a new access key to a project.\n */\nexport const addNewAccessKey = async (\n req: Request<AddNewAccessKeyBody>,\n res: ResponseWithSession<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, roles, permissions } = res.locals;\n const { grants, name, expiresAt } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_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 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [project.id],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const filteredPermisions = intersectPermissions(permissions, grants);\n\n try {\n const newAccessKey = await projectAccessKeyService.addNewAccessKey(\n {\n name,\n expiresAt,\n grants: filteredPermisions,\n },\n project.id,\n user\n );\n\n const responseData = formatResponse<OAuth2Access>({\n message: t({\n en: 'Access key created successfully',\n es: 'Clave de acceso creada con éxito',\n fr: \"Clé d'accès créée avec succès\",\n }),\n description: t({\n en: 'The access key has been created successfully',\n es: 'La clave de acceso ha sido creada con éxito',\n fr: \"La clé d'accès a été créée avec succès\",\n }),\n data: newAccessKey,\n });\n\n res.json(responseData);\n\n sendEmail({\n type: 'oAuthTokenCreated',\n to: user.email,\n username: user.name,\n applicationName: newAccessKey.name ?? newAccessKey.clientId,\n scopes: newAccessKey.grants,\n tokenDetailsUrl: `${process.env.CLIENT_URL}/oauth2/token`,\n securityLogUrl: `${process.env.CLIENT_URL}/security-log`,\n supportUrl: `${process.env.CLIENT_URL}/support`,\n });\n\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type DeleteAccessKeyBody = { clientId: string };\nexport type DeleteAccessKeyResponse = ResponseData<null>;\n\n/**\n * Deletes an access key from a project.\n */\nexport const deleteAccessKey = async (\n req: Request,\n res: ResponseWithSession<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, roles } = res.locals;\n const { clientId } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (!clientId) {\n ErrorHandler.handleGenericErrorResponse(res, 'CLIENT_ID_NOT_FOUND');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [project.id],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const deletedAccessKey = await projectAccessKeyService.deleteAccessKey(\n clientId,\n project,\n user.id\n );\n\n if (!deletedAccessKey) {\n ErrorHandler.handleGenericErrorResponse(res, 'ACCESS_KEY_NOT_FOUND', {\n clientId,\n });\n return;\n }\n\n const responseData = formatResponse<null>({\n message: t({\n en: 'Access key deleted successfully',\n es: 'Clave de acceso eliminada con éxito',\n fr: \"Clé d'accès supprimée avec succès\",\n }),\n description: t({\n en: 'The access key has been deleted successfully',\n es: 'La clave de acceso ha sido eliminada con éxito',\n fr: \"La clé d'accès a été supprimée avec succès\",\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\nexport type RefreshAccessKeyBody = { clientId: string };\nexport type RefreshAccessKeyResponse = ResponseData<OAuth2Access>;\n\n/**\n * Refreshes an access key from a project.\n */\nexport const refreshAccessKey = async (\n req: Request<RefreshAccessKeyBody>,\n res: ResponseWithSession<RefreshAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, roles } = res.locals;\n const { clientId } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n }\n\n if (!clientId) {\n ErrorHandler.handleGenericErrorResponse(res, 'CLIENT_ID_NOT_FOUND');\n }\n\n if (\n !hasPermission(\n roles,\n 'project:write'\n )({\n ...res.locals,\n targetProjectIds: [project?.id],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const newAccessKey = await projectAccessKeyService.refreshAccessKey(\n clientId,\n project?.id,\n user?.id\n );\n\n const responseData = formatResponse<OAuth2Access>({\n message: t({\n en: 'Access key refreshed successfully',\n es: 'Clave de acceso actualizada con éxito',\n fr: \"Clé d'accès actualisée avec succès\",\n }),\n description: t({\n en: 'The access key has been refreshed successfully',\n es: 'La clave de acceso ha sido actualizada con éxito',\n fr: \"La clé d'accès a été actualisée avec succès\",\n }),\n data: newAccessKey,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,kBAAkB,OAC7B,KACA,KACA,UACkB;CAClB,MAAM,EAAE,MAAM,SAAS,OAAO,gBAAgB,IAAI;CAClD,MAAM,EAAE,QAAQ,MAAM,cAAc,IAAI;AAExC,KAAI,CAAC,SAAS;AACZ,iDAAa,2BAA2B,KAAK,sBAAsB;AACnE;;AAGF,KAAI,CAAC,MAAM;AACT,iDAAa,2BAA2B,KAAK,mBAAmB;AAChE;;AAGF,KACE,CAACA,wCACC,OACA,gBACD,CAAC;EACA,GAAG,IAAI;EACP,kBAAkB,CAAC,QAAQ,GAAG;EAC/B,CAAC,EACF;AACA,iDAAa,2BAA2B,KAAK,oBAAoB;AACjE;;CAGF,MAAM,qBAAqBC,+CAAqB,aAAa,OAAO;AAEpE,KAAI;EACF,MAAM,eAAe,gEACnB;GACE;GACA;GACA,QAAQ;GACT,EACD,QAAQ,IACR,KACD;EAED,MAAM,eAAeC,0CAA6B;GAChD,iCAAW;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,qCAAe;IACb,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,MAAM;GACP,CAAC;AAEF,MAAI,KAAK,aAAa;AAEtB,2CAAU;GACR,MAAM;GACN,IAAI,KAAK;GACT,UAAU,KAAK;GACf,iBAAiB,aAAa,QAAQ,aAAa;GACnD,QAAQ,aAAa;GACrB,iBAAiB,GAAG,QAAQ,IAAI,WAAW;GAC3C,gBAAgB,GAAG,QAAQ,IAAI,WAAW;GAC1C,YAAY,GAAG,QAAQ,IAAI,WAAW;GACvC,CAAC;AAEF;UACO,OAAO;AACd,iDAAa,uBAAuB,KAAK,MAAkB;AAC3D;;;;;;AAUJ,MAAa,kBAAkB,OAC7B,KACA,KACA,UACkB;CAClB,MAAM,EAAE,MAAM,SAAS,UAAU,IAAI;CACrC,MAAM,EAAE,aAAa,IAAI;AAEzB,KAAI,CAAC,SAAS;AACZ,iDAAa,2BAA2B,KAAK,sBAAsB;AACnE;;AAGF,KAAI,CAAC,MAAM;AACT,iDAAa,2BAA2B,KAAK,mBAAmB;AAChE;;AAGF,KAAI,CAAC,UAAU;AACb,iDAAa,2BAA2B,KAAK,sBAAsB;AACnE;;AAGF,KACE,CAACF,wCACC,OACA,gBACD,CAAC;EACA,GAAG,IAAI;EACP,kBAAkB,CAAC,QAAQ,GAAG;EAC/B,CAAC,EACF;AACA,iDAAa,2BAA2B,KAAK,oBAAoB;AACjE;;AAGF,KAAI;AAOF,MAAI,CANqB,gEACvB,UACA,SACA,KAAK,GACN,EAEsB;AACrB,kDAAa,2BAA2B,KAAK,wBAAwB,EACnE,UACD,CAAC;AACF;;EAGF,MAAM,eAAeE,0CAAqB;GACxC,iCAAW;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,qCAAe;IACb,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,MAAM;GACP,CAAC;AAEF,MAAI,KAAK,aAAa;AACtB;UACO,OAAO;AACd,iDAAa,uBAAuB,KAAK,MAAkB;AAC3D;;;;;;AAUJ,MAAa,mBAAmB,OAC9B,KACA,KACA,UACkB;CAClB,MAAM,EAAE,MAAM,SAAS,UAAU,IAAI;CACrC,MAAM,EAAE,aAAa,IAAI;AAEzB,KAAI,CAAC,QACH,gDAAa,2BAA2B,KAAK,sBAAsB;AAGrE,KAAI,CAAC,KACH,gDAAa,2BAA2B,KAAK,mBAAmB;AAGlE,KAAI,CAAC,SACH,gDAAa,2BAA2B,KAAK,sBAAsB;AAGrE,KACE,CAACF,wCACC,OACA,gBACD,CAAC;EACA,GAAG,IAAI;EACP,kBAAkB,CAAC,SAAS,GAAG;EAChC,CAAC,EACF;AACA,iDAAa,2BAA2B,KAAK,oBAAoB;AACjE;;AAGF,KAAI;EACF,MAAM,eAAe,iEACnB,UACA,SAAS,IACT,MAAM,GACP;EAED,MAAM,eAAeE,0CAA6B;GAChD,iCAAW;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,qCAAe;IACb,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,MAAM;GACP,CAAC;AAEF,MAAI,KAAK,aAAa;AACtB;UACO,OAAO;AACd,iDAAa,uBAAuB,KAAK,MAAkB;AAC3D"}