@intlayer/backend 3.0.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/dist/cjs/controllers/dictionary.controller.cjs +50 -18
  2. package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
  3. package/dist/cjs/controllers/organization.controller.cjs +71 -12
  4. package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
  5. package/dist/cjs/controllers/project.controller.cjs +117 -31
  6. package/dist/cjs/controllers/project.controller.cjs.map +1 -1
  7. package/dist/cjs/controllers/projectAccessKey.controller.cjs +30 -10
  8. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
  9. package/dist/cjs/controllers/sessionAuth.controller.cjs +16 -7
  10. package/dist/cjs/controllers/sessionAuth.controller.cjs.map +1 -1
  11. package/dist/cjs/controllers/user.controller.cjs +9 -17
  12. package/dist/cjs/controllers/user.controller.cjs.map +1 -1
  13. package/dist/cjs/export.cjs.map +1 -1
  14. package/dist/cjs/index.cjs +3 -2
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/middlewares/oAuth2.middleware.cjs +10 -0
  17. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +1 -1
  18. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +49 -7
  19. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +1 -1
  20. package/dist/cjs/{middlewares/admin.middleware.cjs → models/plan.moddel.cjs} +9 -22
  21. package/dist/cjs/models/plan.moddel.cjs.map +1 -0
  22. package/dist/cjs/schemas/plans.schema.cjs +62 -0
  23. package/dist/cjs/schemas/plans.schema.cjs.map +1 -0
  24. package/dist/cjs/schemas/project.schema.cjs +14 -1
  25. package/dist/cjs/schemas/project.schema.cjs.map +1 -1
  26. package/dist/cjs/schemas/user.schema.cjs +4 -0
  27. package/dist/cjs/schemas/user.schema.cjs.map +1 -1
  28. package/dist/cjs/services/dictionary.service.cjs.map +1 -1
  29. package/dist/cjs/services/oAuth2.service.cjs +16 -8
  30. package/dist/cjs/services/oAuth2.service.cjs.map +1 -1
  31. package/dist/cjs/services/organization.service.cjs +8 -0
  32. package/dist/cjs/services/organization.service.cjs.map +1 -1
  33. package/dist/cjs/services/plans.service.cjs +72 -0
  34. package/dist/cjs/services/plans.service.cjs.map +1 -0
  35. package/dist/cjs/services/project.service.cjs +8 -2
  36. package/dist/cjs/services/project.service.cjs.map +1 -1
  37. package/dist/cjs/services/projectAccessKey.service.cjs +42 -10
  38. package/dist/cjs/services/projectAccessKey.service.cjs.map +1 -1
  39. package/dist/cjs/services/sessionAuth.service.cjs.map +1 -1
  40. package/dist/cjs/services/subscription.service.cjs +118 -0
  41. package/dist/cjs/services/subscription.service.cjs.map +1 -0
  42. package/dist/cjs/services/user.service.cjs.map +1 -1
  43. package/dist/cjs/types/dictionary.types.cjs.map +1 -1
  44. package/dist/cjs/types/organization.types.cjs.map +1 -1
  45. package/dist/cjs/types/plan.types.cjs +17 -0
  46. package/dist/cjs/types/plan.types.cjs.map +1 -0
  47. package/dist/cjs/types/project.types.cjs.map +1 -1
  48. package/dist/cjs/types/user.types.cjs.map +1 -1
  49. package/dist/cjs/utils/errors/ErrorHandler.cjs +1 -1
  50. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +1 -1
  51. package/dist/cjs/utils/errors/errorCodes.cjs +222 -1
  52. package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
  53. package/dist/cjs/utils/mapper/organization.cjs.map +1 -1
  54. package/dist/cjs/utils/mapper/project.cjs +19 -3
  55. package/dist/cjs/utils/mapper/project.cjs.map +1 -1
  56. package/dist/cjs/utils/mapper/user.cjs.map +1 -1
  57. package/dist/cjs/utils/plan.cjs +70 -0
  58. package/dist/cjs/utils/plan.cjs.map +1 -0
  59. package/dist/cjs/webhooks/stripe.cjs +94 -0
  60. package/dist/cjs/webhooks/stripe.cjs.map +1 -0
  61. package/dist/esm/controllers/dictionary.controller.mjs +50 -18
  62. package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
  63. package/dist/esm/controllers/organization.controller.mjs +71 -12
  64. package/dist/esm/controllers/organization.controller.mjs.map +1 -1
  65. package/dist/esm/controllers/project.controller.mjs +117 -31
  66. package/dist/esm/controllers/project.controller.mjs.map +1 -1
  67. package/dist/esm/controllers/projectAccessKey.controller.mjs +30 -10
  68. package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
  69. package/dist/esm/controllers/sessionAuth.controller.mjs +16 -7
  70. package/dist/esm/controllers/sessionAuth.controller.mjs.map +1 -1
  71. package/dist/esm/controllers/user.controller.mjs +9 -17
  72. package/dist/esm/controllers/user.controller.mjs.map +1 -1
  73. package/dist/esm/export.mjs.map +1 -1
  74. package/dist/esm/index.mjs +6 -4
  75. package/dist/esm/index.mjs.map +1 -1
  76. package/dist/esm/middlewares/oAuth2.middleware.mjs +10 -0
  77. package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -1
  78. package/dist/esm/middlewares/sessionAuth.middleware.mjs +48 -6
  79. package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -1
  80. package/dist/esm/models/plan.moddel.mjs +7 -0
  81. package/dist/esm/models/plan.moddel.mjs.map +1 -0
  82. package/dist/esm/schemas/plans.schema.mjs +38 -0
  83. package/dist/esm/schemas/plans.schema.mjs.map +1 -0
  84. package/dist/esm/schemas/project.schema.mjs +13 -1
  85. package/dist/esm/schemas/project.schema.mjs.map +1 -1
  86. package/dist/esm/schemas/user.schema.mjs +4 -0
  87. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  88. package/dist/esm/services/dictionary.service.mjs.map +1 -1
  89. package/dist/esm/services/oAuth2.service.mjs +16 -8
  90. package/dist/esm/services/oAuth2.service.mjs.map +1 -1
  91. package/dist/esm/services/organization.service.mjs +7 -0
  92. package/dist/esm/services/organization.service.mjs.map +1 -1
  93. package/dist/esm/services/plans.service.mjs +44 -0
  94. package/dist/esm/services/plans.service.mjs.map +1 -0
  95. package/dist/esm/services/project.service.mjs +8 -2
  96. package/dist/esm/services/project.service.mjs.map +1 -1
  97. package/dist/esm/services/projectAccessKey.service.mjs +42 -10
  98. package/dist/esm/services/projectAccessKey.service.mjs.map +1 -1
  99. package/dist/esm/services/sessionAuth.service.mjs.map +1 -1
  100. package/dist/esm/services/subscription.service.mjs +95 -0
  101. package/dist/esm/services/subscription.service.mjs.map +1 -0
  102. package/dist/esm/services/user.service.mjs.map +1 -1
  103. package/dist/esm/types/plan.types.mjs +1 -0
  104. package/dist/esm/types/plan.types.mjs.map +1 -0
  105. package/dist/esm/utils/errors/ErrorHandler.mjs +1 -1
  106. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
  107. package/dist/esm/utils/errors/errorCodes.mjs +222 -1
  108. package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
  109. package/dist/esm/utils/mapper/organization.mjs.map +1 -1
  110. package/dist/esm/utils/mapper/project.mjs +17 -2
  111. package/dist/esm/utils/mapper/project.mjs.map +1 -1
  112. package/dist/esm/utils/mapper/user.mjs.map +1 -1
  113. package/dist/esm/utils/plan.mjs +45 -0
  114. package/dist/esm/utils/plan.mjs.map +1 -0
  115. package/dist/esm/webhooks/stripe.mjs +70 -0
  116. package/dist/esm/webhooks/stripe.mjs.map +1 -0
  117. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  118. package/dist/types/controllers/organization.controller.d.ts.map +1 -1
  119. package/dist/types/controllers/project.controller.d.ts +9 -7
  120. package/dist/types/controllers/project.controller.d.ts.map +1 -1
  121. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  122. package/dist/types/controllers/sessionAuth.controller.d.ts +4 -4
  123. package/dist/types/controllers/sessionAuth.controller.d.ts.map +1 -1
  124. package/dist/types/controllers/user.controller.d.ts.map +1 -1
  125. package/dist/types/export.d.ts +1 -0
  126. package/dist/types/export.d.ts.map +1 -1
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -1
  129. package/dist/types/middlewares/sessionAuth.middleware.d.ts +13 -7
  130. package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
  131. package/dist/types/models/dictionary.model.d.ts +1 -1
  132. package/dist/types/models/oAuth2.model.d.ts +1 -1
  133. package/dist/types/models/organization.model.d.ts +1 -1
  134. package/dist/types/models/plan.moddel.d.ts +11 -0
  135. package/dist/types/models/plan.moddel.d.ts.map +1 -0
  136. package/dist/types/models/project.model.d.ts +1 -1
  137. package/dist/types/schemas/dictionary.schema.d.ts +2 -2
  138. package/dist/types/schemas/oAuth2.schema.d.ts +2 -2
  139. package/dist/types/schemas/organization.schema.d.ts +2 -2
  140. package/dist/types/schemas/plans.schema.d.ts +16 -0
  141. package/dist/types/schemas/plans.schema.d.ts.map +1 -0
  142. package/dist/types/schemas/project.schema.d.ts +12 -3
  143. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  144. package/dist/types/schemas/user.schema.d.ts +2 -2
  145. package/dist/types/schemas/user.schema.d.ts.map +1 -1
  146. package/dist/types/services/dictionary.service.d.ts +9 -9
  147. package/dist/types/services/dictionary.service.d.ts.map +1 -1
  148. package/dist/types/services/oAuth2.service.d.ts +7 -5
  149. package/dist/types/services/oAuth2.service.d.ts.map +1 -1
  150. package/dist/types/services/organization.service.d.ts +12 -6
  151. package/dist/types/services/organization.service.d.ts.map +1 -1
  152. package/dist/types/services/plans.service.d.ts +35 -0
  153. package/dist/types/services/plans.service.d.ts.map +1 -0
  154. package/dist/types/services/project.service.d.ts +6 -6
  155. package/dist/types/services/project.service.d.ts.map +1 -1
  156. package/dist/types/services/projectAccessKey.service.d.ts +4 -4
  157. package/dist/types/services/projectAccessKey.service.d.ts.map +1 -1
  158. package/dist/types/services/sessionAuth.service.d.ts +9 -9
  159. package/dist/types/services/sessionAuth.service.d.ts.map +1 -1
  160. package/dist/types/services/subscription.service.d.ts +7 -0
  161. package/dist/types/services/subscription.service.d.ts.map +1 -0
  162. package/dist/types/services/user.service.d.ts +11 -19
  163. package/dist/types/services/user.service.d.ts.map +1 -1
  164. package/dist/types/types/dictionary.types.d.ts +2 -2
  165. package/dist/types/types/dictionary.types.d.ts.map +1 -1
  166. package/dist/types/types/organization.types.d.ts +2 -2
  167. package/dist/types/types/organization.types.d.ts.map +1 -1
  168. package/dist/types/types/plan.types.d.ts +19 -0
  169. package/dist/types/types/plan.types.d.ts.map +1 -0
  170. package/dist/types/types/project.types.d.ts +13 -2
  171. package/dist/types/types/project.types.d.ts.map +1 -1
  172. package/dist/types/types/user.types.d.ts +2 -1
  173. package/dist/types/types/user.types.d.ts.map +1 -1
  174. package/dist/types/utils/errors/errorCodes.d.ts +221 -0
  175. package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
  176. package/dist/types/utils/mapper/organization.d.ts +1 -1
  177. package/dist/types/utils/mapper/organization.d.ts.map +1 -1
  178. package/dist/types/utils/mapper/project.d.ts +10 -1
  179. package/dist/types/utils/mapper/project.d.ts.map +1 -1
  180. package/dist/types/utils/mapper/user.d.ts +1 -1
  181. package/dist/types/utils/mapper/user.d.ts.map +1 -1
  182. package/dist/types/utils/plan.d.ts +17 -0
  183. package/dist/types/utils/plan.d.ts.map +1 -0
  184. package/dist/types/webhooks/stripe.d.ts +3 -0
  185. package/dist/types/webhooks/stripe.d.ts.map +1 -0
  186. package/package.json +25 -23
  187. package/dist/cjs/middlewares/admin.middleware.cjs.map +0 -1
  188. package/dist/esm/middlewares/admin.middleware.mjs +0 -20
  189. package/dist/esm/middlewares/admin.middleware.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/plan.ts"],"sourcesContent":["import { Plan } from '@/types/plan.types';\n\n/**\n * Retrieves the plan type based on the price ID.\n * @param priceId - The price ID to retrieve the plan type from.\n * @returns The plan type and period.\n */\nexport const retrievePlanInformation = (\n priceId: string\n): Pick<Plan, 'period' | 'type'> => {\n switch (priceId) {\n case process.env.STRIPE_PREMIUM_YEARLY_PRICE_ID!:\n return { period: 'YEARLY', type: 'PREMIUM' };\n case process.env.STRIPE_PREMIUM_MONTHLY_PRICE_ID!:\n return { period: 'MONTHLY', type: 'PREMIUM' };\n case process.env.STRIPE_PREMIUM_ENTERPRISE_YEARLY_PRICE_ID!:\n return { period: 'YEARLY', type: 'ENTERPRISE' };\n case process.env.STRIPE_PREMIUM_ENTERPRISE_MONTHLY_PRICE_ID!:\n return { period: 'MONTHLY', type: 'ENTERPRISE' };\n default:\n return { period: 'MONTHLY', type: 'FREE' };\n }\n};\n\ntype PlanDetails = {\n numberOfOrganizationUsers?: number;\n numberOfProjects?: number;\n totalStorage?: number;\n SeoAI: boolean;\n contentAI: boolean;\n};\n\nconst planDetails: Record<Plan['type'], PlanDetails> = {\n ['FREE']: {\n numberOfOrganizationUsers: 1,\n numberOfProjects: 1,\n totalStorage: 100, // 100 MB\n SeoAI: false,\n contentAI: false,\n },\n ['PREMIUM']: {\n numberOfOrganizationUsers: 20,\n numberOfProjects: 10,\n totalStorage: 500, // 500 MB\n SeoAI: false,\n contentAI: true,\n },\n ['ENTERPRISE']: {\n numberOfOrganizationUsers: undefined,\n numberOfProjects: undefined,\n totalStorage: undefined,\n SeoAI: true,\n contentAI: true,\n },\n};\n\nexport const getPLanDetails = (planType: Plan['type']): PlanDetails =>\n planDetails[planType];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,0BAA0B,CACrC,YACkC;AAClC,UAAQ,SAAS;AAAA,IACf,KAAK,QAAQ,IAAI;AACf,aAAO,EAAE,QAAQ,UAAU,MAAM,UAAU;AAAA,IAC7C,KAAK,QAAQ,IAAI;AACf,aAAO,EAAE,QAAQ,WAAW,MAAM,UAAU;AAAA,IAC9C,KAAK,QAAQ,IAAI;AACf,aAAO,EAAE,QAAQ,UAAU,MAAM,aAAa;AAAA,IAChD,KAAK,QAAQ,IAAI;AACf,aAAO,EAAE,QAAQ,WAAW,MAAM,aAAa;AAAA,IACjD;AACE,aAAO,EAAE,QAAQ,WAAW,MAAM,OAAO;AAAA,EAC7C;AACF;AAUA,MAAM,cAAiD;AAAA,EACrD,CAAC,MAAM,GAAG;AAAA,IACR,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,cAAc;AAAA;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,CAAC,SAAS,GAAG;AAAA,IACX,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,cAAc;AAAA;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,CAAC,YAAY,GAAG;AAAA,IACd,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAEO,MAAM,iBAAiB,CAAC,aAC7B,YAAY,QAAQ;","names":[]}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var stripe_exports = {};
20
+ __export(stripe_exports, {
21
+ stripeWebhook: () => stripeWebhook
22
+ });
23
+ module.exports = __toCommonJS(stripe_exports);
24
+ var import_logger = require('./../logger/index.cjs');
25
+ var import_subscription = require('./../services/subscription.service.cjs');
26
+ var import_stripe = require("stripe");
27
+ const stripeWebhook = async (request, response) => {
28
+ const stripe = new import_stripe.Stripe(process.env.STRIPE_SECRET_KEY);
29
+ const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;
30
+ const sig = request.headers["stripe-signature"];
31
+ let event;
32
+ try {
33
+ event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);
34
+ } catch (err) {
35
+ response.status(400).send(`Webhook Error: ${err.message}`);
36
+ return;
37
+ }
38
+ console.log(`Unhandled event type ${event.type}`);
39
+ switch (event.type) {
40
+ case "checkout.session.async_payment_failed": {
41
+ const checkoutSessionAsyncPaymentFailed = event.data.object;
42
+ break;
43
+ }
44
+ case "checkout.session.async_payment_succeeded": {
45
+ const checkoutSessionAsyncPaymentSucceeded = event.data.object;
46
+ break;
47
+ }
48
+ case "checkout.session.completed": {
49
+ const checkoutSessionCompleted = event.data.object;
50
+ const session = await stripe.checkout.sessions.retrieve(
51
+ checkoutSessionCompleted.id,
52
+ {
53
+ expand: ["line_items"]
54
+ }
55
+ );
56
+ const customerId = session.customer;
57
+ if (!customerId) {
58
+ import_logger.logger.error("No customer ID found", session);
59
+ return;
60
+ }
61
+ const customer = await stripe.customers.retrieve(customerId);
62
+ const priceId = session.line_items?.data[0]?.price?.id;
63
+ const userEmail = customer.email;
64
+ await (0, import_subscription.addSubscription)(priceId, customerId, userEmail);
65
+ break;
66
+ }
67
+ case "checkout.session.expired": {
68
+ const checkoutSessionExpired = event.data.object;
69
+ console.log("checkoutSessionExpired", checkoutSessionExpired);
70
+ const session = await stripe.checkout.sessions.retrieve(
71
+ checkoutSessionExpired.id,
72
+ {
73
+ expand: ["line_items"]
74
+ }
75
+ );
76
+ console.log("session", session);
77
+ const customerId = session.customer;
78
+ if (!customerId) {
79
+ import_logger.logger.error("No customer ID found", session);
80
+ return;
81
+ }
82
+ break;
83
+ }
84
+ // ... handle other event types
85
+ default:
86
+ console.log(`Unhandled event type ${event.type}`);
87
+ }
88
+ response.send();
89
+ };
90
+ // Annotate the CommonJS export names for ESM import in node:
91
+ 0 && (module.exports = {
92
+ stripeWebhook
93
+ });
94
+ //# sourceMappingURL=stripe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webhooks/stripe.ts"],"sourcesContent":["// The library needs to be configured with your account's secret key.\n// Ensure the key is kept out of any version control system you might be using.\nimport { logger } from '@logger';\nimport { addSubscription } from '@services/subscription.service';\nimport { type Request, type Response } from 'express';\nimport { Stripe } from 'stripe';\n\nexport const stripeWebhook = async (request: Request, response: Response) => {\n const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n // This is your Stripe CLI webhook secret for testing your endpoint locally.\n const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET!;\n\n const sig = request.headers['stripe-signature']!;\n\n let event;\n\n try {\n event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);\n } catch (err) {\n response.status(400).send(`Webhook Error: ${(err as Error).message}`);\n return;\n }\n\n // Handle the event\n console.log(`Unhandled event type ${event.type}`);\n\n // Handle the event\n switch (event.type) {\n case 'checkout.session.async_payment_failed': {\n const checkoutSessionAsyncPaymentFailed = event.data.object;\n // Then define and call a function to handle the event checkout.session.async_payment_failed\n break;\n }\n case 'checkout.session.async_payment_succeeded': {\n const checkoutSessionAsyncPaymentSucceeded = event.data.object;\n // Then define and call a function to handle the event checkout.session.async_payment_succeeded\n break;\n }\n case 'checkout.session.completed': {\n const checkoutSessionCompleted = event.data.object;\n // Then define and call a function to handle the event checkout.session.completed\n\n const session = await stripe.checkout.sessions.retrieve(\n checkoutSessionCompleted.id,\n {\n expand: ['line_items'],\n }\n );\n\n const customerId = session.customer as string;\n\n if (!customerId) {\n logger.error('No customer ID found', session);\n return;\n }\n\n const customer = await stripe.customers.retrieve(customerId);\n\n const priceId = session.line_items?.data[0]?.price?.id;\n\n const userEmail = (customer as unknown as { email: string }).email;\n\n await addSubscription(priceId!, customerId, userEmail);\n\n break;\n }\n case 'checkout.session.expired': {\n const checkoutSessionExpired = event.data.object;\n // Then define and call a function to handle the event checkout.session.expired\n\n console.log('checkoutSessionExpired', checkoutSessionExpired);\n\n const session = await stripe.checkout.sessions.retrieve(\n checkoutSessionExpired.id,\n {\n expand: ['line_items'],\n }\n );\n console.log('session', session);\n\n const customerId = session.customer as string;\n\n if (!customerId) {\n logger.error('No customer ID found', session);\n return;\n }\n\n // const customer = await stripe.customers.retrieve(customerId);\n\n // const userEmail = (customer as unknown as { email: string }).email;\n\n // await cancelSubscription({});\n\n break;\n }\n // ... handle other event types\n default:\n console.log(`Unhandled event type ${event.type}`);\n }\n\n // Return a 200 response to acknowledge receipt of the event\n response.send();\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAuB;AACvB,0BAAgC;AAEhC,oBAAuB;AAEhB,MAAM,gBAAgB,OAAO,SAAkB,aAAuB;AAC3E,QAAM,SAAS,IAAI,qBAAO,QAAQ,IAAI,iBAAkB;AAExD,QAAM,iBAAiB,QAAQ,IAAI;AAEnC,QAAM,MAAM,QAAQ,QAAQ,kBAAkB;AAE9C,MAAI;AAEJ,MAAI;AACF,YAAQ,OAAO,SAAS,eAAe,QAAQ,MAAM,KAAK,cAAc;AAAA,EAC1E,SAAS,KAAK;AACZ,aAAS,OAAO,GAAG,EAAE,KAAK,kBAAmB,IAAc,OAAO,EAAE;AACpE;AAAA,EACF;AAGA,UAAQ,IAAI,wBAAwB,MAAM,IAAI,EAAE;AAGhD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,yCAAyC;AAC5C,YAAM,oCAAoC,MAAM,KAAK;AAErD;AAAA,IACF;AAAA,IACA,KAAK,4CAA4C;AAC/C,YAAM,uCAAuC,MAAM,KAAK;AAExD;AAAA,IACF;AAAA,IACA,KAAK,8BAA8B;AACjC,YAAM,2BAA2B,MAAM,KAAK;AAG5C,YAAM,UAAU,MAAM,OAAO,SAAS,SAAS;AAAA,QAC7C,yBAAyB;AAAA,QACzB;AAAA,UACE,QAAQ,CAAC,YAAY;AAAA,QACvB;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ;AAE3B,UAAI,CAAC,YAAY;AACf,6BAAO,MAAM,wBAAwB,OAAO;AAC5C;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,OAAO,UAAU,SAAS,UAAU;AAE3D,YAAM,UAAU,QAAQ,YAAY,KAAK,CAAC,GAAG,OAAO;AAEpD,YAAM,YAAa,SAA0C;AAE7D,gBAAM,qCAAgB,SAAU,YAAY,SAAS;AAErD;AAAA,IACF;AAAA,IACA,KAAK,4BAA4B;AAC/B,YAAM,yBAAyB,MAAM,KAAK;AAG1C,cAAQ,IAAI,0BAA0B,sBAAsB;AAE5D,YAAM,UAAU,MAAM,OAAO,SAAS,SAAS;AAAA,QAC7C,uBAAuB;AAAA,QACvB;AAAA,UACE,QAAQ,CAAC,YAAY;AAAA,QACvB;AAAA,MACF;AACA,cAAQ,IAAI,WAAW,OAAO;AAE9B,YAAM,aAAa,QAAQ;AAE3B,UAAI,CAAC,YAAY;AACf,6BAAO,MAAM,wBAAwB,OAAO;AAC5C;AAAA,MACF;AAQA;AAAA,IACF;AAAA;AAAA,IAEA;AACE,cAAQ,IAAI,wBAAwB,MAAM,IAAI,EAAE;AAAA,EACpD;AAGA,WAAS,KAAK;AAChB;","names":[]}
@@ -10,14 +10,18 @@ import {
10
10
  formatResponse
11
11
  } from './../utils/responseData.mjs';
12
12
  const getDictionaries = async (req, res, _next) => {
13
- const { user, project } = res.locals;
13
+ const { user, project, dictionaryRights } = res.locals;
14
14
  const { filters, pageSize, skip, page, getNumberOfPages } = getDictionaryFiltersAndPagination(req);
15
15
  if (!project) {
16
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
16
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
17
17
  return;
18
18
  }
19
19
  if (!user) {
20
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
20
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
21
+ return;
22
+ }
23
+ if (!dictionaryRights?.read) {
24
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_READ");
21
25
  return;
22
26
  }
23
27
  try {
@@ -45,9 +49,13 @@ const getDictionaries = async (req, res, _next) => {
45
49
  }
46
50
  };
47
51
  const getDictionariesKeys = async (_req, res, _next) => {
48
- const { project } = res.locals;
52
+ const { project, dictionaryRights } = res.locals;
49
53
  if (!project) {
50
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
54
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
55
+ return;
56
+ }
57
+ if (!dictionaryRights?.read) {
58
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_READ");
51
59
  return;
52
60
  }
53
61
  try {
@@ -65,15 +73,19 @@ const getDictionariesKeys = async (_req, res, _next) => {
65
73
  }
66
74
  };
67
75
  const getDictionaryByKey = async (req, res, _next) => {
68
- const { project, user } = res.locals;
76
+ const { project, user, dictionaryRights } = res.locals;
69
77
  const { dictionaryKey } = req.params;
70
78
  const { version } = req.query;
71
79
  if (!project) {
72
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
80
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
73
81
  return;
74
82
  }
75
83
  if (!user) {
76
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
84
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
85
+ return;
86
+ }
87
+ if (!dictionaryRights?.read) {
88
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_READ");
77
89
  return;
78
90
  }
79
91
  try {
@@ -100,24 +112,28 @@ const getDictionaryByKey = async (req, res, _next) => {
100
112
  }
101
113
  };
102
114
  const addDictionary = async (req, res, _next) => {
103
- const { project, user } = res.locals;
115
+ const { project, user, dictionaryRights } = res.locals;
104
116
  const dictionaryData = req.body;
105
117
  if (!dictionaryData) {
106
118
  ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_DATA_NOT_FOUND");
107
119
  return;
108
120
  }
109
121
  if (!project) {
110
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
122
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
111
123
  return;
112
124
  }
113
125
  if (!user) {
114
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
126
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
115
127
  return;
116
128
  }
117
129
  if (!dictionaryData.projectIds.includes(String(project._id))) {
118
130
  ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_PROJECT_MISMATCH");
119
131
  return;
120
132
  }
133
+ if (!dictionaryRights?.admin) {
134
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_ADMIN");
135
+ return;
136
+ }
121
137
  const dictionary = {
122
138
  key: dictionaryData.key,
123
139
  title: dictionaryData.title,
@@ -141,7 +157,7 @@ const addDictionary = async (req, res, _next) => {
141
157
  }
142
158
  };
143
159
  const pushDictionaries = async (req, res, _next) => {
144
- const { project, user } = res.locals;
160
+ const { project, user, dictionaryRights } = res.locals;
145
161
  const dictionaryData = req.body.dictionaries;
146
162
  const dictionariesKeys = dictionaryData.map((dictionary) => dictionary.key);
147
163
  if (typeof dictionaryData === "object" && Array.isArray(dictionaryData) && dictionaryData.length === 0) {
@@ -152,11 +168,19 @@ const pushDictionaries = async (req, res, _next) => {
152
168
  return;
153
169
  }
154
170
  if (!project) {
155
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
171
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
156
172
  return;
157
173
  }
158
174
  if (!user) {
159
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
175
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
176
+ return;
177
+ }
178
+ if (!dictionaryRights?.write) {
179
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_WRITE");
180
+ return;
181
+ }
182
+ if (!dictionaryRights?.admin) {
183
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_ADMIN");
160
184
  return;
161
185
  }
162
186
  try {
@@ -236,14 +260,14 @@ const pushDictionaries = async (req, res, _next) => {
236
260
  }
237
261
  };
238
262
  const updateDictionary = async (req, res, _next) => {
239
- const { project } = res.locals;
263
+ const { project, dictionaryRights } = res.locals;
240
264
  const dictionaryData = req.body;
241
265
  if (!dictionaryData) {
242
266
  ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_DATA_NOT_FOUND");
243
267
  return;
244
268
  }
245
269
  if (!project) {
246
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
270
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
247
271
  return;
248
272
  }
249
273
  if (!dictionaryData.projectIds?.includes(String(project._id))) {
@@ -254,6 +278,10 @@ const updateDictionary = async (req, res, _next) => {
254
278
  ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_ID_NOT_FOUND");
255
279
  return;
256
280
  }
281
+ if (!dictionaryRights?.write) {
282
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_WRITE");
283
+ return;
284
+ }
257
285
  try {
258
286
  const updatedDictionary = await dictionaryService.updateDictionaryById(
259
287
  dictionaryData._id,
@@ -271,14 +299,18 @@ const updateDictionary = async (req, res, _next) => {
271
299
  }
272
300
  };
273
301
  const deleteDictionary = async (req, res, _next) => {
274
- const { project } = res.locals;
302
+ const { project, dictionaryRights } = res.locals;
275
303
  const { dictionaryId } = req.params;
276
304
  if (!dictionaryId) {
277
305
  ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_ID_NOT_FOUND");
278
306
  return;
279
307
  }
280
308
  if (!project) {
281
- ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
309
+ ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
310
+ return;
311
+ }
312
+ if (!dictionaryRights?.admin) {
313
+ ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_ADMIN");
282
314
  return;
283
315
  }
284
316
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/controllers/dictionary.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type Dictionary as LocalDictionary } from '@intlayer/core';\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as dictionaryService from '@services/dictionary.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport {\n type DictionaryFiltersParams,\n getDictionaryFiltersAndPagination,\n} from '@utils/filtersAndPagination/getDictionaryFiltersAndPagination';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport { mapDictionaryToAPI } from '@utils/mapper/dictionary';\nimport {\n formatPaginatedResponse,\n type ResponseData,\n type PaginatedResponse,\n formatResponse,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type {\n Dictionary,\n DictionaryAPI,\n DictionaryCreationData,\n DictionaryData,\n} from '@/types/dictionary.types';\n\nexport type GetDictionariesParams =\n FiltersAndPagination<DictionaryFiltersParams>;\nexport type GetDictionariesResult = PaginatedResponse<DictionaryAPI>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const getDictionaries = async (\n req: Request<GetDictionariesParams>,\n res: ResponseWithInformation<GetDictionariesResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getDictionaryFiltersAndPagination(req);\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const dictionaries = await dictionaryService.findDictionaries(\n filters,\n skip,\n pageSize\n );\n const totalItems = await dictionaryService.countDictionaries(filters);\n\n const dictionariesAPI = dictionaries.map((el) =>\n mapDictionaryToAPI(el, project._id)\n );\n\n const responseData = formatPaginatedResponse<DictionaryAPI>({\n data: dictionariesAPI,\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 GetDictionariesKeysResult = ResponseData<string[]>;\n\n/**\n * Retrieves a list of dictionaries keys based on filters and pagination.\n */\nexport const getDictionariesKeys = async (\n _req: Request,\n res: ResponseWithInformation<GetDictionariesKeysResult>,\n _next: NextFunction\n) => {\n const { project } = res.locals;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n try {\n const dictionariesKeys = await dictionaryService.getDictionariesKeys(\n project._id\n );\n\n const responseData = formatResponse<string[]>({\n data: dictionariesKeys,\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 GetDictionaryParams = { dictionaryKey: string };\nexport type GetDictionaryQuery = { version?: number };\nexport type GetDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const getDictionaryByKey = async (\n req: Request<GetDictionaryParams>,\n res: ResponseWithInformation<GetDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user } = res.locals;\n const { dictionaryKey } = req.params;\n const { version } = req.query as GetDictionaryQuery;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const dictionaries = await dictionaryService.getDictionaryByKey(\n dictionaryKey,\n project._id\n );\n\n if (!dictionaries.projectIds.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'DICTIONARY_PROJECT_MISMATCH'\n );\n return;\n }\n\n const apiResult = mapDictionaryToAPI(dictionaries, project._id, version);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 AddDictionaryBody = DictionaryCreationData;\nexport type AddDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Adds a new dictionary to the database.\n */\nexport const addDictionary = async (\n req: Request<any, any, AddDictionaryBody>,\n res: ResponseWithInformation<AddDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user } = res.locals;\n const dictionaryData = req.body;\n\n if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!dictionaryData.projectIds.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_PROJECT_MISMATCH');\n return;\n }\n\n const dictionary: DictionaryData = {\n key: dictionaryData.key,\n title: dictionaryData.title,\n description: dictionaryData.description,\n content: [dictionaryData.content],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryData.filePath ?? '' },\n projectIds: dictionaryData.projectIds ?? [String(project._id)],\n };\n\n try {\n const newDictionary = await dictionaryService.createDictionary(dictionary);\n\n const apiResult = mapDictionaryToAPI(newDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 PushDictionariesBody = { dictionaries: LocalDictionary[] };\ntype PushDictionariesResultData = {\n newDictionaries: string[];\n updatedDictionaries: string[];\n error: { dictionaryId: string; message: string }[];\n};\nexport type PushDictionariesResult = ResponseData<PushDictionariesResultData>;\n\n/**\n * Check each dictionaries, add the new ones and update the existing ones.\n * @param req - Express request object.\n * @param res - Express response object.\n * @returns Response containing the created dictionary.\n */\nexport const pushDictionaries = async (\n req: Request<any, any, PushDictionariesBody>,\n res: ResponseWithInformation<PushDictionariesResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user } = res.locals;\n const dictionaryData = req.body.dictionaries;\n const dictionariesKeys = dictionaryData.map((dictionary) => dictionary.key);\n\n if (\n typeof dictionaryData === 'object' &&\n Array.isArray(dictionaryData) &&\n dictionaryData.length === 0\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARIES_NOT_PROVIDED');\n return;\n } else if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n try {\n const { existingDictionariesKey, newDictionariesKey } =\n await dictionaryService.getExistingDictionaryKey(\n dictionariesKeys,\n project._id\n );\n\n const existingDictionaries = dictionaryData.filter((dictionary) =>\n existingDictionariesKey.includes(dictionary.key)\n );\n const newDictionaries = dictionaryData.filter((dictionary) =>\n newDictionariesKey.includes(dictionary.key)\n );\n\n const result: PushDictionariesResultData = {\n newDictionaries: [],\n updatedDictionaries: [],\n error: [],\n };\n\n for (const dictionaryDataEl of newDictionaries) {\n const dictionary: DictionaryData = {\n title: dictionaryDataEl.title,\n description: dictionaryDataEl.description,\n content: [dictionaryDataEl.content],\n projectIds: [String(project._id)],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryDataEl.filePath ?? '' },\n key: dictionaryDataEl.key,\n };\n\n try {\n const newDictionary =\n await dictionaryService.createDictionary(dictionary);\n result.newDictionaries.push(newDictionary.key);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n }\n\n if (existingDictionariesKey.length >= 0) {\n const existingDictionariesDB =\n await dictionaryService.getDictionariesByKeys(\n existingDictionariesKey,\n project._id\n );\n\n for (const dictionaryDataEl of existingDictionaries) {\n const existingDictionaryDB = existingDictionariesDB.find(\n (dictionaryDB) => dictionaryDB.key === dictionaryDataEl.key\n )!;\n\n const dictionary: DictionaryData = {\n ...existingDictionaryDB,\n ...dictionaryDataEl,\n content: [\n ...(existingDictionaryDB.content ?? []),\n dictionaryDataEl.content,\n ],\n projectIds: [String(project._id)],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryDataEl.filePath ?? '' },\n key: dictionaryDataEl.key,\n };\n\n try {\n const newDictionary = await dictionaryService.updateDictionaryByKey(\n dictionaryDataEl.key,\n dictionary,\n project._id\n );\n result.updatedDictionaries.push(newDictionary.key);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n }\n }\n\n const responseData = formatResponse<PushDictionariesResultData>({\n data: result,\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 UpdateDictionaryBody = Partial<Dictionary>;\nexport type UpdateDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Updates an existing dictionary in the database.\n */\nexport const updateDictionary = async (\n req: Request<any, any, UpdateDictionaryBody>,\n res: ResponseWithInformation<UpdateDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const dictionaryData = req.body;\n\n if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n if (!dictionaryData.projectIds?.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_PROJECT_MISMATCH');\n return;\n }\n\n if (typeof dictionaryData._id === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_ID_NOT_FOUND');\n return;\n }\n\n try {\n const updatedDictionary = await dictionaryService.updateDictionaryById(\n dictionaryData._id,\n dictionaryData\n );\n\n const apiResult = mapDictionaryToAPI(updatedDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 DeleteDictionaryParam = { dictionaryId: string };\nexport type DeleteDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Deletes a dictionary from the database by its ID.\n */\nexport const deleteDictionary = async (\n req: Request<DeleteDictionaryParam>,\n res: ResponseWithInformation<DeleteDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const { dictionaryId } = req.params as Partial<DeleteDictionaryParam>;\n\n if (!dictionaryId) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_ID_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n try {\n const dictionaryToDelete =\n await dictionaryService.getDictionaryById(dictionaryId);\n\n if (!dictionaryToDelete.projectIds.includes(project._id)) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'DICTIONARY_PROJECT_MISMATCH'\n );\n return;\n }\n\n const deletedDictionary =\n await dictionaryService.deleteDictionaryById(dictionaryId);\n\n if (!deletedDictionary) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_NOT_FOUND', {\n dictionaryId,\n });\n return;\n }\n\n logger.info(`Dictionary deleted: ${String(deletedDictionary._id)}`);\n\n const apiResult = mapDictionaryToAPI(deletedDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/controllers/dictionary.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type Dictionary as LocalDictionary } from '@intlayer/core';\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as dictionaryService from '@services/dictionary.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport {\n type DictionaryFiltersParams,\n getDictionaryFiltersAndPagination,\n} from '@utils/filtersAndPagination/getDictionaryFiltersAndPagination';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport { mapDictionaryToAPI } from '@utils/mapper/dictionary';\nimport {\n formatPaginatedResponse,\n type ResponseData,\n type PaginatedResponse,\n formatResponse,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type {\n Dictionary,\n DictionaryAPI,\n DictionaryCreationData,\n DictionaryData,\n} from '@/types/dictionary.types';\n\nexport type GetDictionariesParams =\n FiltersAndPagination<DictionaryFiltersParams>;\nexport type GetDictionariesResult = PaginatedResponse<DictionaryAPI>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const getDictionaries = async (\n req: Request<GetDictionariesParams>,\n res: ResponseWithInformation<GetDictionariesResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, dictionaryRights } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getDictionaryFiltersAndPagination(req);\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n if (!dictionaryRights?.read) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_READ');\n return;\n }\n\n try {\n const dictionaries = await dictionaryService.findDictionaries(\n filters,\n skip,\n pageSize\n );\n const totalItems = await dictionaryService.countDictionaries(filters);\n\n const dictionariesAPI = dictionaries.map((el) =>\n mapDictionaryToAPI(el, project._id)\n );\n\n const responseData = formatPaginatedResponse<DictionaryAPI>({\n data: dictionariesAPI,\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 GetDictionariesKeysResult = ResponseData<string[]>;\n\n/**\n * Retrieves a list of dictionaries keys based on filters and pagination.\n */\nexport const getDictionariesKeys = async (\n _req: Request,\n res: ResponseWithInformation<GetDictionariesKeysResult>,\n _next: NextFunction\n) => {\n const { project, dictionaryRights } = res.locals;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n if (!dictionaryRights?.read) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_READ');\n return;\n }\n\n try {\n const dictionariesKeys = await dictionaryService.getDictionariesKeys(\n project._id\n );\n\n const responseData = formatResponse<string[]>({\n data: dictionariesKeys,\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 GetDictionaryParams = { dictionaryKey: string };\nexport type GetDictionaryQuery = { version?: number };\nexport type GetDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const getDictionaryByKey = async (\n req: Request<GetDictionaryParams>,\n res: ResponseWithInformation<GetDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user, dictionaryRights } = res.locals;\n const { dictionaryKey } = req.params;\n const { version } = req.query as GetDictionaryQuery;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n if (!dictionaryRights?.read) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_READ');\n return;\n }\n\n try {\n const dictionaries = await dictionaryService.getDictionaryByKey(\n dictionaryKey,\n project._id\n );\n\n if (!dictionaries.projectIds.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'DICTIONARY_PROJECT_MISMATCH'\n );\n return;\n }\n\n const apiResult = mapDictionaryToAPI(dictionaries, project._id, version);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 AddDictionaryBody = DictionaryCreationData;\nexport type AddDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Adds a new dictionary to the database.\n */\nexport const addDictionary = async (\n req: Request<any, any, AddDictionaryBody>,\n res: ResponseWithInformation<AddDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user, dictionaryRights } = res.locals;\n const dictionaryData = req.body;\n\n if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\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 (!dictionaryData.projectIds.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_PROJECT_MISMATCH');\n return;\n }\n\n if (!dictionaryRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_ADMIN');\n return;\n }\n\n const dictionary: DictionaryData = {\n key: dictionaryData.key,\n title: dictionaryData.title,\n description: dictionaryData.description,\n content: [dictionaryData.content],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryData.filePath ?? '' },\n projectIds: dictionaryData.projectIds ?? [String(project._id)],\n };\n\n try {\n const newDictionary = await dictionaryService.createDictionary(dictionary);\n\n const apiResult = mapDictionaryToAPI(newDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 PushDictionariesBody = { dictionaries: LocalDictionary[] };\ntype PushDictionariesResultData = {\n newDictionaries: string[];\n updatedDictionaries: string[];\n error: { dictionaryId: string; message: string }[];\n};\nexport type PushDictionariesResult = ResponseData<PushDictionariesResultData>;\n\n/**\n * Check each dictionaries, add the new ones and update the existing ones.\n * @param req - Express request object.\n * @param res - Express response object.\n * @returns Response containing the created dictionary.\n */\nexport const pushDictionaries = async (\n req: Request<any, any, PushDictionariesBody>,\n res: ResponseWithInformation<PushDictionariesResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, user, dictionaryRights } = res.locals;\n const dictionaryData = req.body.dictionaries;\n const dictionariesKeys = dictionaryData.map((dictionary) => dictionary.key);\n\n if (\n typeof dictionaryData === 'object' &&\n Array.isArray(dictionaryData) &&\n dictionaryData.length === 0\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARIES_NOT_PROVIDED');\n return;\n } else if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\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 (!dictionaryRights?.write) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_WRITE');\n return;\n }\n\n if (!dictionaryRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_ADMIN');\n return;\n }\n\n try {\n const { existingDictionariesKey, newDictionariesKey } =\n await dictionaryService.getExistingDictionaryKey(\n dictionariesKeys,\n project._id\n );\n\n const existingDictionaries = dictionaryData.filter((dictionary) =>\n existingDictionariesKey.includes(dictionary.key)\n );\n const newDictionaries = dictionaryData.filter((dictionary) =>\n newDictionariesKey.includes(dictionary.key)\n );\n\n const result: PushDictionariesResultData = {\n newDictionaries: [],\n updatedDictionaries: [],\n error: [],\n };\n\n for (const dictionaryDataEl of newDictionaries) {\n const dictionary: DictionaryData = {\n title: dictionaryDataEl.title,\n description: dictionaryDataEl.description,\n content: [dictionaryDataEl.content],\n projectIds: [String(project._id)],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryDataEl.filePath ?? '' },\n key: dictionaryDataEl.key,\n };\n\n try {\n const newDictionary =\n await dictionaryService.createDictionary(dictionary);\n result.newDictionaries.push(newDictionary.key);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n }\n\n if (existingDictionariesKey.length >= 0) {\n const existingDictionariesDB =\n await dictionaryService.getDictionariesByKeys(\n existingDictionariesKey,\n project._id\n );\n\n for (const dictionaryDataEl of existingDictionaries) {\n const existingDictionaryDB = existingDictionariesDB.find(\n (dictionaryDB) => dictionaryDB.key === dictionaryDataEl.key\n )!;\n\n const dictionary: DictionaryData = {\n ...existingDictionaryDB,\n ...dictionaryDataEl,\n content: [\n ...(existingDictionaryDB.content ?? []),\n dictionaryDataEl.content,\n ],\n projectIds: [String(project._id)],\n creatorId: user._id,\n filePath: { [String(project._id)]: dictionaryDataEl.filePath ?? '' },\n key: dictionaryDataEl.key,\n };\n\n try {\n const newDictionary = await dictionaryService.updateDictionaryByKey(\n dictionaryDataEl.key,\n dictionary,\n project._id\n );\n result.updatedDictionaries.push(newDictionary.key);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n }\n }\n }\n\n const responseData = formatResponse<PushDictionariesResultData>({\n data: result,\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 UpdateDictionaryBody = Partial<Dictionary>;\nexport type UpdateDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Updates an existing dictionary in the database.\n */\nexport const updateDictionary = async (\n req: Request<any, any, UpdateDictionaryBody>,\n res: ResponseWithInformation<UpdateDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, dictionaryRights } = res.locals;\n const dictionaryData = req.body;\n\n if (!dictionaryData) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_DATA_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (!dictionaryData.projectIds?.includes(String(project._id))) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_PROJECT_MISMATCH');\n return;\n }\n\n if (typeof dictionaryData._id === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_ID_NOT_FOUND');\n return;\n }\n\n if (!dictionaryRights?.write) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_WRITE');\n return;\n }\n\n try {\n const updatedDictionary = await dictionaryService.updateDictionaryById(\n dictionaryData._id,\n dictionaryData\n );\n\n const apiResult = mapDictionaryToAPI(updatedDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\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 DeleteDictionaryParam = { dictionaryId: string };\nexport type DeleteDictionaryResult = ResponseData<DictionaryAPI>;\n\n/**\n * Deletes a dictionary from the database by its ID.\n */\nexport const deleteDictionary = async (\n req: Request<DeleteDictionaryParam>,\n res: ResponseWithInformation<DeleteDictionaryResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, dictionaryRights } = res.locals;\n const { dictionaryId } = req.params as Partial<DeleteDictionaryParam>;\n\n if (!dictionaryId) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_ID_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED');\n return;\n }\n\n if (!dictionaryRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_ADMIN');\n return;\n }\n\n try {\n const dictionaryToDelete =\n await dictionaryService.getDictionaryById(dictionaryId);\n\n if (!dictionaryToDelete.projectIds.includes(project._id)) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'DICTIONARY_PROJECT_MISMATCH'\n );\n return;\n }\n\n const deletedDictionary =\n await dictionaryService.deleteDictionaryById(dictionaryId);\n\n if (!deletedDictionary) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_NOT_FOUND', {\n dictionaryId,\n });\n return;\n }\n\n logger.info(`Dictionary deleted: ${String(deletedDictionary._id)}`);\n\n const apiResult = mapDictionaryToAPI(deletedDictionary, project._id);\n\n const responseData = formatResponse<DictionaryAPI>({\n data: apiResult,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
@@ -1,22 +1,31 @@
1
1
  import { logger } from './../logger/index.mjs';
2
2
  import { sessionAuthRoutes } from './../routes/sessionAuth.routes.mjs';
3
3
  import { sendEmail } from './../services/email.service.mjs';
4
+ import { getPlan } from './../services/plans.service.mjs';
4
5
  import * as sessionAuthService from './../services/sessionAuth.service.mjs';
5
6
  import * as userService from './../services/user.service.mjs';
6
7
  import { ErrorHandler } from './../utils/errors/index.mjs';
7
8
  import {
8
9
  getOrganizationFiltersAndPagination
9
10
  } from './../utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs';
11
+ import { getPLanDetails } from './../utils/plan.mjs';
10
12
  import {
11
13
  formatPaginatedResponse,
12
14
  formatResponse
13
15
  } from './../utils/responseData.mjs';
14
16
  import * as organizationService from './../services/organization.service.mjs';
15
17
  const getOrganizations = async (req, res, _next) => {
16
- const { user } = res.locals;
18
+ const { user, organizationRights } = res.locals;
17
19
  const { filters, pageSize, skip, page, getNumberOfPages } = getOrganizationFiltersAndPagination(req);
18
20
  if (!user) {
19
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
21
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
22
+ return;
23
+ }
24
+ if (!organizationRights?.read) {
25
+ ErrorHandler.handleGenericErrorResponse(
26
+ res,
27
+ "ORGANIZATION_RIGHTS_NOT_READ"
28
+ );
20
29
  return;
21
30
  }
22
31
  const restrictedFilter = {
@@ -45,7 +54,15 @@ const getOrganizations = async (req, res, _next) => {
45
54
  }
46
55
  };
47
56
  const getOrganization = async (req, res, _next) => {
57
+ const { organizationRights } = res.locals;
48
58
  const { organizationId } = req.params;
59
+ if (!organizationRights?.read) {
60
+ ErrorHandler.handleGenericErrorResponse(
61
+ res,
62
+ "ORGANIZATION_RIGHTS_NOT_READ"
63
+ );
64
+ return;
65
+ }
49
66
  if (!organizationId) {
50
67
  ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
51
68
  return;
@@ -67,7 +84,7 @@ const addOrganization = async (req, res, _next) => {
67
84
  ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
68
85
  }
69
86
  if (!user) {
70
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
87
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
71
88
  return;
72
89
  }
73
90
  try {
@@ -86,14 +103,21 @@ const addOrganization = async (req, res, _next) => {
86
103
  }
87
104
  };
88
105
  const updateOrganization = async (req, res, _next) => {
89
- const { isOrganizationAdmin, organization } = res.locals;
106
+ const { isOrganizationAdmin, organization, organizationRights } = res.locals;
90
107
  const organizationFields = req.body;
91
108
  if (!organizationFields) {
92
109
  ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
93
110
  return;
94
111
  }
95
112
  if (!organization) {
96
- ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
113
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
114
+ return;
115
+ }
116
+ if (!organizationRights?.write) {
117
+ ErrorHandler.handleGenericErrorResponse(
118
+ res,
119
+ "ORGANIZATION_RIGHTS_NOT_WRITE"
120
+ );
97
121
  return;
98
122
  }
99
123
  if (!isOrganizationAdmin) {
@@ -119,14 +143,14 @@ const updateOrganization = async (req, res, _next) => {
119
143
  }
120
144
  };
121
145
  const addOrganizationMember = async (req, res, _next) => {
122
- const { organization, isOrganizationAdmin, user } = res.locals;
146
+ const { organization, isOrganizationAdmin, user, organizationRights } = res.locals;
123
147
  const { userEmail } = req.body;
124
148
  if (!organization) {
125
- ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
149
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
126
150
  return;
127
151
  }
128
152
  if (!user) {
129
- ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
153
+ ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
130
154
  return;
131
155
  }
132
156
  if (!isOrganizationAdmin) {
@@ -136,6 +160,27 @@ const addOrganizationMember = async (req, res, _next) => {
136
160
  );
137
161
  return;
138
162
  }
163
+ if (!organizationRights?.admin) {
164
+ ErrorHandler.handleGenericErrorResponse(
165
+ res,
166
+ "ORGANIZATION_RIGHTS_NOT_ADMIN"
167
+ );
168
+ return;
169
+ }
170
+ const plan = await getPlan({ organizationId: organization._id });
171
+ if (!plan) {
172
+ ErrorHandler.handleGenericErrorResponse(res, "PLAN_NOT_FOUND", {
173
+ organizationId: organization._id
174
+ });
175
+ return;
176
+ }
177
+ const planType = getPLanDetails(plan.type);
178
+ if (planType.numberOfOrganizationUsers && organization.membersIds.length >= planType.numberOfOrganizationUsers) {
179
+ ErrorHandler.handleGenericErrorResponse(res, "PLAN_USER_LIMIT_REACHED", {
180
+ organizationId: organization._id
181
+ });
182
+ return;
183
+ }
139
184
  try {
140
185
  let newMember = await userService.getUserByEmail(userEmail);
141
186
  if (!newMember) {
@@ -174,10 +219,10 @@ const addOrganizationMember = async (req, res, _next) => {
174
219
  }
175
220
  };
176
221
  const updateOrganizationMembers = async (req, res, _next) => {
177
- const { organization, isOrganizationAdmin } = res.locals;
222
+ const { organization, organizationRights, isOrganizationAdmin } = res.locals;
178
223
  const { membersIds } = req.body;
179
224
  if (!organization) {
180
- ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
225
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
181
226
  return;
182
227
  }
183
228
  if (!isOrganizationAdmin) {
@@ -187,6 +232,13 @@ const updateOrganizationMembers = async (req, res, _next) => {
187
232
  );
188
233
  return;
189
234
  }
235
+ if (!organizationRights?.write) {
236
+ ErrorHandler.handleGenericErrorResponse(
237
+ res,
238
+ "ORGANIZATION_RIGHTS_NOT_WRITE"
239
+ );
240
+ return;
241
+ }
190
242
  if (membersIds?.length === 0) {
191
243
  ErrorHandler.handleGenericErrorResponse(
192
244
  res,
@@ -239,9 +291,9 @@ const updateOrganizationMembers = async (req, res, _next) => {
239
291
  }
240
292
  };
241
293
  const deleteOrganization = async (_req, res, _next) => {
242
- const { isOrganizationAdmin, organization } = res.locals;
294
+ const { isOrganizationAdmin, organization, organizationRights } = res.locals;
243
295
  if (!organization) {
244
- ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
296
+ ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
245
297
  return;
246
298
  }
247
299
  if (!isOrganizationAdmin) {
@@ -251,6 +303,13 @@ const deleteOrganization = async (_req, res, _next) => {
251
303
  );
252
304
  return;
253
305
  }
306
+ if (!organizationRights?.admin) {
307
+ ErrorHandler.handleGenericErrorResponse(
308
+ res,
309
+ "ORGANIZATION_RIGHTS_NOT_ADMIN"
310
+ );
311
+ return;
312
+ }
254
313
  try {
255
314
  const deletedOrganization = await organizationService.deleteOrganizationById(organization._id);
256
315
  if (!deletedOrganization) {