@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
@@ -38,21 +38,28 @@ __export(project_controller_exports, {
38
38
  });
39
39
  module.exports = __toCommonJS(project_controller_exports);
40
40
  var import_logger = require('./../logger/index.cjs');
41
+ var import_plans = require('./../services/plans.service.cjs');
41
42
  var projectService = __toESM(require('./../services/project.service.cjs'), 1);
42
43
  var sessionAuthService = __toESM(require('./../services/sessionAuth.service.cjs'), 1);
43
44
  var userService = __toESM(require('./../services/user.service.cjs'), 1);
44
45
  var import_errors = require('./../utils/errors/index.cjs');
45
46
  var import_getProjectFiltersAndPagination = require('./../utils/filtersAndPagination/getProjectFiltersAndPagination.cjs');
47
+ var import_project = require('./../utils/mapper/project.cjs');
48
+ var import_plan = require('./../utils/plan.cjs');
46
49
  var import_responseData = require('./../utils/responseData.cjs');
47
50
  const getProjects = async (req, res, _next) => {
48
- const { user, organization } = res.locals;
51
+ const { user, organization, projectRights } = res.locals;
49
52
  const { filters, pageSize, skip, page, getNumberOfPages } = (0, import_getProjectFiltersAndPagination.getProjectFiltersAndPagination)(req);
50
53
  if (!user) {
51
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
54
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
52
55
  return;
53
56
  }
54
57
  if (!organization) {
55
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
58
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
59
+ return;
60
+ }
61
+ if (!projectRights?.read) {
62
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_READ");
56
63
  return;
57
64
  }
58
65
  const restrictedFilter = {
@@ -67,8 +74,13 @@ const getProjects = async (req, res, _next) => {
67
74
  pageSize
68
75
  );
69
76
  const totalItems = await projectService.countProjects(filters);
77
+ const formattedProjects = (0, import_project.mapProjectsToAPI)(
78
+ projects,
79
+ user,
80
+ res.locals.isProjectAdmin
81
+ );
70
82
  const responseData = (0, import_responseData.formatPaginatedResponse)({
71
- data: projects,
83
+ data: formattedProjects,
72
84
  page,
73
85
  pageSize,
74
86
  totalPages: getNumberOfPages(totalItems),
@@ -82,14 +94,14 @@ const getProjects = async (req, res, _next) => {
82
94
  }
83
95
  };
84
96
  const addProject = async (req, res, _next) => {
85
- const { organization, user, isOrganizationAdmin } = res.locals;
97
+ const { organization, user, isOrganizationAdmin, projectRights } = res.locals;
86
98
  const projectData = req.body;
87
99
  if (!user) {
88
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
100
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
89
101
  return;
90
102
  }
91
103
  if (!organization) {
92
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
104
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
93
105
  return;
94
106
  }
95
107
  if (!isOrganizationAdmin) {
@@ -98,9 +110,37 @@ const addProject = async (req, res, _next) => {
98
110
  "USER_IS_NOT_ADMIN_OF_ORGANIZATION"
99
111
  );
100
112
  }
113
+ if (!projectRights?.admin) {
114
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_WRITE");
115
+ return;
116
+ }
101
117
  if (!projectData) {
102
118
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
103
119
  }
120
+ const plan = await (0, import_plans.getPlan)({ organizationId: organization._id });
121
+ if (!plan) {
122
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PLAN_NOT_FOUND", {
123
+ organizationId: organization._id
124
+ });
125
+ return;
126
+ }
127
+ const planType = (0, import_plan.getPLanDetails)(plan.type);
128
+ if (planType.numberOfProjects) {
129
+ const projectCount = await projectService.countProjects({
130
+ organizationId: organization._id
131
+ });
132
+ if (projectCount >= planType.numberOfProjects) {
133
+ import_errors.ErrorHandler.handleGenericErrorResponse(
134
+ res,
135
+ "PLAN_PROJECT_LIMIT_REACHED",
136
+ {
137
+ organizationId: organization._id
138
+ }
139
+ );
140
+ return;
141
+ }
142
+ return;
143
+ }
104
144
  const project = {
105
145
  membersIds: [user._id],
106
146
  adminsIds: [user._id],
@@ -110,7 +150,8 @@ const addProject = async (req, res, _next) => {
110
150
  };
111
151
  try {
112
152
  const newProject = await projectService.createProject(project);
113
- const responseData = (0, import_responseData.formatResponse)({ data: newProject });
153
+ const formattedProject = (0, import_project.mapProjectToAPI)(newProject, user, true);
154
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedProject });
114
155
  res.json(responseData);
115
156
  return;
116
157
  } catch (error) {
@@ -119,22 +160,34 @@ const addProject = async (req, res, _next) => {
119
160
  }
120
161
  };
121
162
  const updateProject = async (req, res, _next) => {
122
- const { organization } = res.locals;
123
- const project = req.body;
163
+ const { organization, projectRights, project, user, isProjectAdmin } = res.locals;
164
+ const projectData = req.body;
165
+ if (!user) {
166
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
167
+ return;
168
+ }
124
169
  if (!project) {
125
170
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_DATA_NOT_FOUND");
126
171
  return;
127
172
  }
128
173
  if (!organization) {
129
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
174
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
130
175
  return;
131
176
  }
132
- if (project.organizationId !== organization._id) {
133
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_IN_ORGANIZATION");
177
+ if (!isProjectAdmin) {
178
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_ADMIN");
134
179
  return;
135
180
  }
136
- if (typeof project._id === "undefined") {
137
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_ID_NOT_FOUND");
181
+ if (!projectRights?.write) {
182
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_WRITE");
183
+ return;
184
+ }
185
+ if (typeof project._id !== projectData._id) {
186
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_ID_MISMATCH");
187
+ return;
188
+ }
189
+ if (project.organizationId !== organization._id) {
190
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_IN_ORGANIZATION");
138
191
  return;
139
192
  }
140
193
  try {
@@ -142,7 +195,12 @@ const updateProject = async (req, res, _next) => {
142
195
  project._id,
143
196
  project
144
197
  );
145
- const responseData = (0, import_responseData.formatResponse)({ data: updatedProject });
198
+ const formattedProject = (0, import_project.mapProjectToAPI)(
199
+ updatedProject,
200
+ user,
201
+ isProjectAdmin
202
+ );
203
+ const responseData = (0, import_responseData.formatResponse)({ data: formattedProject });
146
204
  res.json(responseData);
147
205
  return;
148
206
  } catch (error) {
@@ -151,10 +209,14 @@ const updateProject = async (req, res, _next) => {
151
209
  }
152
210
  };
153
211
  const updateProjectMembers = async (req, res, _next) => {
154
- const { project, isProjectAdmin, organization } = res.locals;
212
+ const { user, project, isProjectAdmin, organization, projectRights } = res.locals;
155
213
  const { membersIds } = req.body;
214
+ if (!user) {
215
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
216
+ return;
217
+ }
156
218
  if (!project) {
157
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
219
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
158
220
  return;
159
221
  }
160
222
  if (!isProjectAdmin) {
@@ -164,8 +226,12 @@ const updateProjectMembers = async (req, res, _next) => {
164
226
  );
165
227
  return;
166
228
  }
229
+ if (!projectRights?.admin) {
230
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_ADMIN");
231
+ return;
232
+ }
167
233
  if (!organization) {
168
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
234
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
169
235
  return;
170
236
  }
171
237
  if (membersIds?.length === 0) {
@@ -187,19 +253,19 @@ const updateProjectMembers = async (req, res, _next) => {
187
253
  ).map((member) => member.userId);
188
254
  const users = await userService.getUsersByIds(userIdList);
189
255
  if (users) {
190
- const userMap = users.map((user) => ({
191
- user,
256
+ const userMap = users.map((user2) => ({
257
+ user: user2,
192
258
  isAdmin: membersIds.find(
193
- (member) => String(member.userId) === String(user._id)
259
+ (member) => String(member.userId) === String(user2._id)
194
260
  )?.isAdmin ?? false
195
261
  }));
196
262
  existingUsers.push(...userMap);
197
263
  }
198
264
  }
199
265
  const formattedMembers = existingUsers.map(
200
- (user) => user.user._id
266
+ (user2) => user2.user._id
201
267
  );
202
- const formattedAdmin = existingUsers.filter((el) => el.isAdmin).map((user) => user.user._id);
268
+ const formattedAdmin = existingUsers.filter((el) => el.isAdmin).map((user2) => user2.user._id);
203
269
  const updatedOrganization = await projectService.updateProjectById(
204
270
  project._id,
205
271
  {
@@ -208,8 +274,13 @@ const updateProjectMembers = async (req, res, _next) => {
208
274
  adminsIds: formattedAdmin
209
275
  }
210
276
  );
277
+ const formattedProject = (0, import_project.mapProjectToAPI)(
278
+ updatedOrganization,
279
+ user,
280
+ isProjectAdmin
281
+ );
211
282
  const responseData = (0, import_responseData.formatResponse)({
212
- data: updatedOrganization
283
+ data: formattedProject
213
284
  });
214
285
  res.json(responseData);
215
286
  return;
@@ -218,14 +289,22 @@ const updateProjectMembers = async (req, res, _next) => {
218
289
  return;
219
290
  }
220
291
  };
221
- const deleteProject = async (req, res, _next) => {
222
- const { organization, project } = res.locals;
292
+ const deleteProject = async (_req, res, _next) => {
293
+ const { user, organization, project, projectRights, isProjectAdmin } = res.locals;
294
+ if (!user) {
295
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
296
+ return;
297
+ }
223
298
  if (!organization) {
224
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
299
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
225
300
  return;
226
301
  }
227
302
  if (!project) {
228
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
303
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
304
+ return;
305
+ }
306
+ if (!projectRights?.admin) {
307
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_ADMIN");
229
308
  return;
230
309
  }
231
310
  try {
@@ -239,13 +318,20 @@ const deleteProject = async (req, res, _next) => {
239
318
  }
240
319
  const deletedProject = await projectService.deleteProjectById(project._id);
241
320
  if (!deletedProject) {
242
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND", {
321
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED", {
243
322
  projectId: project._id
244
323
  });
245
324
  return;
246
325
  }
247
326
  import_logger.logger.info(`Project deleted: ${String(deletedProject._id)}`);
248
- const responseData = (0, import_responseData.formatResponse)({ data: deletedProject });
327
+ const formattedProject = (0, import_project.mapProjectToAPI)(
328
+ deletedProject,
329
+ user,
330
+ isProjectAdmin
331
+ );
332
+ const responseData = (0, import_responseData.formatResponse)({
333
+ data: formattedProject
334
+ });
249
335
  res.json(responseData);
250
336
  return;
251
337
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/controllers/project.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as projectService from '@services/project.service';\nimport * as sessionAuthService from '@services/sessionAuth.service';\nimport * as userService from '@services/user.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getProjectFiltersAndPagination,\n type ProjectFilters,\n type ProjectFiltersParams,\n} from '@utils/filtersAndPagination/getProjectFiltersAndPagination';\nimport {\n formatPaginatedResponse,\n type ResponseData,\n type PaginatedResponse,\n formatResponse,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type { ObjectId } from 'mongoose';\nimport { User } from 'oauth2-server';\nimport type {\n Project,\n ProjectAPI,\n ProjectCreationData,\n ProjectData,\n} from '@/types/project.types';\n\nexport type GetProjectsParams = FiltersAndPagination<ProjectFiltersParams>;\nexport type GetProjectsResult = PaginatedResponse<ProjectAPI>;\n\n/**\n * Retrieves a list of projects based on filters and pagination.\n */\nexport const getProjects = async (\n req: Request<GetProjectsParams>,\n res: ResponseWithInformation<GetProjectsResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getProjectFiltersAndPagination(req);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n const restrictedFilter: ProjectFilters = {\n ...filters,\n membersIds: { $in: [...(filters.membersIds ?? []), String(user._id)] },\n organizationId: String(organization._id),\n };\n\n try {\n const projects = await projectService.findProjects(\n restrictedFilter,\n skip,\n pageSize\n );\n const totalItems = await projectService.countProjects(filters);\n\n const responseData = formatPaginatedResponse<ProjectAPI>({\n data: projects,\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AddProjectBody = ProjectCreationData;\nexport type AddProjectResult = ResponseData<Project>;\n\n/**\n * Adds a new project to the database.\n */\nexport const addProject = async (\n req: Request<any, any, AddProjectBody>,\n res: ResponseWithInformation<AddProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, isOrganizationAdmin } = res.locals;\n const projectData = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n }\n\n if (!projectData) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\n }\n\n const project: ProjectData = {\n membersIds: [user._id],\n adminsIds: [user._id],\n creatorId: user._id,\n organizationId: organization._id,\n ...projectData,\n };\n\n try {\n const newProject = await projectService.createProject(project);\n\n const responseData = formatResponse<Project>({ data: newProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UpdateProjectBody = Partial<Project>;\nexport type UpdateProjectResult = ResponseData<Project>;\n\n/**\n * Updates an existing project in the database.\n */\nexport const updateProject = async (\n req: Request<any, any, UpdateProjectBody>,\n res: ResponseWithInformation<UpdateProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization } = res.locals;\n const project = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (project.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_IN_ORGANIZATION');\n return;\n }\n\n if (typeof project._id === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const updatedProject = await projectService.updateProjectById(\n project._id,\n project\n );\n\n const responseData = formatResponse<Project>({ data: updatedProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\ntype UserAndAdmin = { user: User; isAdmin: boolean };\nexport type ProjectMemberByIdOption = {\n userId: string | ObjectId;\n isAdmin?: boolean;\n};\n\nexport type UpdateProjectMembersBody = Partial<{\n membersIds: ProjectMemberByIdOption[];\n}>;\nexport type UpdateProjectMembersResult = ResponseData<Project>;\n\n/**\n * Update members to the dictionary in the database.\n */\nexport const updateProjectMembers = async (\n req: Request<any, any, UpdateProjectMembersBody>,\n res: ResponseWithInformation<UpdateProjectMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project, isProjectAdmin, organization } = res.locals;\n const { membersIds } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n if (!isProjectAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_PROJECT'\n );\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (membersIds?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_MUST_HAVE_MEMBER');\n return;\n }\n\n if (membersIds?.map((el) => el.isAdmin)?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_MUST_HAVE_ADMIN');\n return;\n }\n\n try {\n const existingUsers: UserAndAdmin[] = [];\n\n if (membersIds) {\n const userIdList = membersIds\n ?.filter(\n (member) =>\n // Remove members that are not in the organization\n !organization?.membersIds.includes(member.userId as ObjectId)\n )\n .map((member) => member.userId);\n\n const users = await userService.getUsersByIds(userIdList);\n\n if (users) {\n const userMap: UserAndAdmin[] = users.map((user) => ({\n user,\n isAdmin:\n membersIds.find(\n (member) => String(member.userId) === String(user._id)\n )?.isAdmin ?? false,\n }));\n\n existingUsers.push(...userMap);\n }\n }\n\n const formattedMembers: ObjectId[] = existingUsers.map(\n (user) => user.user._id\n );\n const formattedAdmin: ObjectId[] = existingUsers\n .filter((el) => el.isAdmin)\n .map((user) => user.user._id);\n\n const updatedOrganization = await projectService.updateProjectById(\n project._id,\n {\n ...project,\n membersIds: formattedMembers,\n adminsIds: formattedAdmin,\n }\n );\n\n const responseData = formatResponse<Project>({\n data: updatedOrganization,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type DeleteProjectResult = ResponseData<Project>;\n\n/**\n * Deletes a project from the database by its ID.\n * @param req - Express request object.\n * @param res - Express response object.\n * @returns Response confirming the deletion.\n */\nexport const deleteProject = async (\n req: Request,\n res: ResponseWithInformation<DeleteProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, project } = res.locals;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n return;\n }\n\n try {\n const projectToDelete = await projectService.getProjectById(project._id);\n\n if (projectToDelete.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'PROJECT_NOT_IN_ORGANIZATION'\n );\n return;\n }\n\n const deletedProject = await projectService.deleteProjectById(project._id);\n\n if (!deletedProject) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND', {\n projectId: project._id,\n });\n\n return;\n }\n\n logger.info(`Project deleted: ${String(deletedProject._id)}`);\n\n const responseData = formatResponse<Project>({ data: deletedProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type SelectProjectParam = { projectId: ObjectId | string };\nexport type SelectProjectResult = ResponseData<Project>;\n\n/**\n * Select a project.\n */\nexport const selectProject = async (\n req: Request<SelectProjectParam>,\n res: ResponseWithInformation<SelectProjectResult>,\n _next: NextFunction\n) => {\n const { projectId } = req.params;\n\n if (!projectId) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const project = await projectService.getProjectById(projectId);\n\n sessionAuthService.setProjectAuth(res, project);\n\n const responseData = formatResponse<Project>({\n data: project,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UnselectProjectResult = ResponseData<null>;\n\n/**\n * Unselect a project.\n */\nexport const unselectProject = (\n _req: Request,\n res: ResponseWithInformation<UnselectProjectResult>,\n _next: NextFunction\n) => {\n try {\n sessionAuthService.clearProjectAuth(res);\n\n const responseData = formatResponse<null>({\n data: null,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/controllers/project.controller.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport { getPlan } from '@services/plans.service';\nimport * as projectService from '@services/project.service';\nimport * as sessionAuthService from '@services/sessionAuth.service';\nimport * as userService from '@services/user.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getProjectFiltersAndPagination,\n type ProjectFilters,\n type ProjectFiltersParams,\n} from '@utils/filtersAndPagination/getProjectFiltersAndPagination';\nimport { mapProjectsToAPI, mapProjectToAPI } from '@utils/mapper/project';\nimport { getPLanDetails } from '@utils/plan';\nimport {\n formatPaginatedResponse,\n type ResponseData,\n type PaginatedResponse,\n formatResponse,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport type { ObjectId } from 'mongoose';\nimport { User } from 'oauth2-server';\nimport type {\n Project,\n ProjectAPI,\n ProjectCreationData,\n ProjectData,\n} from '@/types/project.types';\n\nexport type GetProjectsParams = FiltersAndPagination<ProjectFiltersParams>;\nexport type GetProjectsResult = PaginatedResponse<ProjectAPI>;\n\n/**\n * Retrieves a list of projects based on filters and pagination.\n */\nexport const getProjects = async (\n req: Request<GetProjectsParams>,\n res: ResponseWithInformation<GetProjectsResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization, projectRights } = res.locals;\n const { filters, pageSize, skip, page, getNumberOfPages } =\n getProjectFiltersAndPagination(req);\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 (!projectRights?.read) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_READ');\n return;\n }\n\n const restrictedFilter: ProjectFilters = {\n ...filters,\n membersIds: { $in: [...(filters.membersIds ?? []), String(user._id)] },\n organizationId: String(organization._id),\n };\n\n try {\n const projects = await projectService.findProjects(\n restrictedFilter,\n skip,\n pageSize\n );\n const totalItems = await projectService.countProjects(filters);\n\n const formattedProjects = mapProjectsToAPI(\n projects,\n user,\n res.locals.isProjectAdmin\n );\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: ResponseWithInformation<AddProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, isOrganizationAdmin, projectRights } = 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 (!isOrganizationAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_ORGANIZATION'\n );\n }\n\n if (!projectRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_WRITE');\n return;\n }\n\n if (!projectData) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_DATA_NOT_FOUND');\n }\n\n const plan = await getPlan({ organizationId: organization._id });\n\n if (!plan) {\n ErrorHandler.handleGenericErrorResponse(res, 'PLAN_NOT_FOUND', {\n organizationId: organization._id,\n });\n return;\n }\n\n const planType = getPLanDetails(plan.type);\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 return;\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, user, true);\n\n const responseData = formatResponse<ProjectAPI>({ data: formattedProject });\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<ProjectData> & { _id: string };\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: ResponseWithInformation<UpdateProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, projectRights, project, user, isProjectAdmin } =\n 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 (!isProjectAdmin) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_ADMIN');\n return;\n }\n\n if (!projectRights?.write) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_WRITE');\n return;\n }\n\n if (typeof project._id !== projectData._id) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_MISMATCH');\n return;\n }\n\n if (project.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_IN_ORGANIZATION');\n return;\n }\n\n try {\n const updatedProject = await projectService.updateProjectById(\n project._id,\n project\n );\n\n const formattedProject = mapProjectToAPI(\n updatedProject,\n user,\n isProjectAdmin\n );\n\n const responseData = formatResponse<ProjectAPI>({ data: formattedProject });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\ntype UserAndAdmin = { user: User; isAdmin: boolean };\nexport type ProjectMemberByIdOption = {\n userId: string | ObjectId;\n isAdmin?: boolean;\n};\n\nexport type UpdateProjectMembersBody = Partial<{\n membersIds: ProjectMemberByIdOption[];\n}>;\nexport type UpdateProjectMembersResult = ResponseData<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: ResponseWithInformation<UpdateProjectMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, isProjectAdmin, organization, projectRights } =\n 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 (!isProjectAdmin) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'USER_IS_NOT_ADMIN_OF_PROJECT'\n );\n return;\n }\n\n if (!projectRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_ADMIN');\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 try {\n const existingUsers: UserAndAdmin[] = [];\n\n if (membersIds) {\n const userIdList = membersIds\n ?.filter(\n (member) =>\n // Remove members that are not in the organization\n !organization?.membersIds.includes(member.userId as ObjectId)\n )\n .map((member) => member.userId);\n\n const users = await userService.getUsersByIds(userIdList);\n\n if (users) {\n const userMap: UserAndAdmin[] = users.map((user) => ({\n user,\n isAdmin:\n membersIds.find(\n (member) => String(member.userId) === String(user._id)\n )?.isAdmin ?? false,\n }));\n\n existingUsers.push(...userMap);\n }\n }\n\n const formattedMembers: ObjectId[] = existingUsers.map(\n (user) => user.user._id\n );\n const formattedAdmin: ObjectId[] = existingUsers\n .filter((el) => el.isAdmin)\n .map((user) => user.user._id);\n\n const updatedOrganization = await projectService.updateProjectById(\n project._id,\n {\n ...project,\n membersIds: formattedMembers,\n adminsIds: formattedAdmin,\n }\n );\n\n const formattedProject = mapProjectToAPI(\n updatedOrganization,\n user,\n isProjectAdmin\n );\n\n const responseData = formatResponse<ProjectAPI>({\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 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: ResponseWithInformation<DeleteProjectResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, organization, project, projectRights, isProjectAdmin } =\n 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 (!projectRights?.admin) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_ADMIN');\n return;\n }\n\n try {\n const projectToDelete = await projectService.getProjectById(project._id);\n\n if (projectToDelete.organizationId !== organization._id) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'PROJECT_NOT_IN_ORGANIZATION'\n );\n return;\n }\n\n const deletedProject = await projectService.deleteProjectById(project._id);\n\n if (!deletedProject) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_DEFINED', {\n projectId: project._id,\n });\n\n return;\n }\n\n logger.info(`Project deleted: ${String(deletedProject._id)}`);\n\n const formattedProject = mapProjectToAPI(\n deletedProject,\n user,\n isProjectAdmin\n );\n\n const responseData = formatResponse<ProjectAPI>({\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 SelectProjectParam = { projectId: ObjectId | string };\nexport type SelectProjectResult = ResponseData<Project>;\n\n/**\n * Select a project.\n */\nexport const selectProject = async (\n req: Request<SelectProjectParam>,\n res: ResponseWithInformation<SelectProjectResult>,\n _next: NextFunction\n) => {\n const { projectId } = req.params;\n\n if (!projectId) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const project = await projectService.getProjectById(projectId);\n\n sessionAuthService.setProjectAuth(res, project);\n\n const responseData = formatResponse<Project>({\n data: project,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UnselectProjectResult = ResponseData<null>;\n\n/**\n * Unselect a project.\n */\nexport const unselectProject = (\n _req: Request,\n res: ResponseWithInformation<UnselectProjectResult>,\n _next: NextFunction\n) => {\n try {\n sessionAuthService.clearProjectAuth(res);\n\n const responseData = formatResponse<null>({\n data: null,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":["user"]}
@@ -37,20 +37,38 @@ var projectAccessKeyService = __toESM(require('./../services/projectAccessKey.se
37
37
  var import_errors = require('./../utils/errors/index.cjs');
38
38
  var import_responseData = require('./../utils/responseData.cjs');
39
39
  const addNewAccessKey = async (req, res, _next) => {
40
- const { user, project } = res.locals;
40
+ const { user, project, organizationRights, projectRights, dictionaryRights } = res.locals;
41
41
  if (!project) {
42
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
42
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
43
43
  return;
44
44
  }
45
45
  if (!user) {
46
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
46
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
47
+ return;
48
+ }
49
+ if (!organizationRights) {
50
+ import_errors.ErrorHandler.handleGenericErrorResponse(
51
+ res,
52
+ "ORGANIZATION_RIGHTS_NOT_READ"
53
+ );
54
+ return;
55
+ }
56
+ if (!projectRights) {
57
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_RIGHTS_NOT_READ");
58
+ return;
59
+ }
60
+ if (!dictionaryRights) {
61
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "DICTIONARY_RIGHTS_NOT_READ");
47
62
  return;
48
63
  }
49
64
  try {
50
65
  const newAccessKey = await projectAccessKeyService.addNewAccessKey(
51
66
  req.body,
52
67
  project._id,
53
- user
68
+ user,
69
+ organizationRights,
70
+ projectRights,
71
+ dictionaryRights
54
72
  );
55
73
  const responseData = (0, import_responseData.formatResponse)({
56
74
  data: newAccessKey
@@ -66,11 +84,11 @@ const deleteAccessKey = async (req, res, _next) => {
66
84
  const { user, project } = res.locals;
67
85
  const { clientId } = req.body;
68
86
  if (!project) {
69
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
87
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
70
88
  return;
71
89
  }
72
90
  if (!user) {
73
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
91
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
74
92
  return;
75
93
  }
76
94
  if (!clientId) {
@@ -80,7 +98,8 @@ const deleteAccessKey = async (req, res, _next) => {
80
98
  try {
81
99
  const deletedAccessKey = await projectAccessKeyService.deleteAccessKey(
82
100
  clientId,
83
- project
101
+ project,
102
+ user._id
84
103
  );
85
104
  if (!deletedAccessKey) {
86
105
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "ACCESS_KEY_NOT_FOUND", {
@@ -102,10 +121,10 @@ const refreshAccessKey = async (req, res, _next) => {
102
121
  const { user, project } = res.locals;
103
122
  const { clientId } = req.body;
104
123
  if (!project) {
105
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_FOUND");
124
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "PROJECT_NOT_DEFINED");
106
125
  }
107
126
  if (!user) {
108
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
127
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
109
128
  }
110
129
  if (!clientId) {
111
130
  import_errors.ErrorHandler.handleGenericErrorResponse(res, "CLIENT_ID_NOT_FOUND");
@@ -113,7 +132,8 @@ const refreshAccessKey = async (req, res, _next) => {
113
132
  try {
114
133
  const newAccessKey = await projectAccessKeyService.refreshAccessKey(
115
134
  clientId,
116
- project._id
135
+ project._id,
136
+ user._id
117
137
  );
118
138
  const responseData = (0, import_responseData.formatResponse)({
119
139
  data: newAccessKey
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/controllers/projectAccessKey.controller.ts"],"sourcesContent":["import type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as projectAccessKeyService from '@services/projectAccessKey.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport { type ResponseData, formatResponse } from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\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: ResponseWithInformation<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = res.locals;\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 newAccessKey = await projectAccessKeyService.addNewAccessKey(\n req.body,\n project._id,\n user\n );\n\n const responseData = formatResponse<OAuth2Access>({\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\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: ResponseWithInformation<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = res.locals;\n const { clientId } = req.body;\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 (!clientId) {\n ErrorHandler.handleGenericErrorResponse(res, 'CLIENT_ID_NOT_FOUND');\n return;\n }\n\n try {\n const deletedAccessKey = await projectAccessKeyService.deleteAccessKey(\n clientId,\n project\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 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: ResponseWithInformation<RefreshAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = res.locals;\n const { clientId } = req.body;\n\n if (!project) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_NOT_FOUND');\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n }\n\n if (!clientId) {\n ErrorHandler.handleGenericErrorResponse(res, 'CLIENT_ID_NOT_FOUND');\n }\n\n try {\n const newAccessKey = await projectAccessKeyService.refreshAccessKey(\n clientId,\n project!._id\n );\n\n const responseData = formatResponse<OAuth2Access>({\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8BAAyC;AACzC,oBAAuC;AACvC,0BAAkD;AAU3C,MAAM,kBAAkB,OAC7B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,IAAI;AAE9B,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,mBAAmB;AAChE;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,gBAAgB;AAC7D;AAAA,EACF;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,wBAAwB;AAAA,MACjD,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM,mBAAe,oCAA6B;AAAA,MAChD,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;AAQO,MAAM,kBAAkB,OAC7B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,IAAI;AAC9B,QAAM,EAAE,SAAS,IAAI,IAAI;AAEzB,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,mBAAmB;AAChE;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,gBAAgB;AAC7D;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,+BAAa,2BAA2B,KAAK,qBAAqB;AAClE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,mBAAmB,MAAM,wBAAwB;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB;AACrB,iCAAa,2BAA2B,KAAK,wBAAwB;AAAA,QACnE;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,mBAAe,oCAAqB;AAAA,MACxC,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;AAQO,MAAM,mBAAmB,OAC9B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,IAAI;AAC9B,QAAM,EAAE,SAAS,IAAI,IAAI;AAEzB,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,mBAAmB;AAAA,EAClE;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,gBAAgB;AAAA,EAC/D;AAEA,MAAI,CAAC,UAAU;AACb,+BAAa,2BAA2B,KAAK,qBAAqB;AAAA,EACpE;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,wBAAwB;AAAA,MACjD;AAAA,MACA,QAAS;AAAA,IACX;AAEA,UAAM,mBAAe,oCAA6B;AAAA,MAChD,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/controllers/projectAccessKey.controller.ts"],"sourcesContent":["import type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as projectAccessKeyService from '@services/projectAccessKey.service';\nimport { AppError, ErrorHandler } from '@utils/errors';\nimport { type ResponseData, formatResponse } from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\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: ResponseWithInformation<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project, organizationRights, projectRights, dictionaryRights } =\n res.locals;\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 (!organizationRights) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_RIGHTS_NOT_READ'\n );\n return;\n }\n\n if (!projectRights) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECT_RIGHTS_NOT_READ');\n return;\n }\n\n if (!dictionaryRights) {\n ErrorHandler.handleGenericErrorResponse(res, 'DICTIONARY_RIGHTS_NOT_READ');\n return;\n }\n\n try {\n const newAccessKey = await projectAccessKeyService.addNewAccessKey(\n req.body,\n project._id,\n user,\n organizationRights,\n projectRights,\n dictionaryRights\n );\n\n const responseData = formatResponse<OAuth2Access>({\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\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: ResponseWithInformation<AddNewAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = 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 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 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: ResponseWithInformation<RefreshAccessKeyResponse>,\n _next: NextFunction\n): Promise<void> => {\n const { user, project } = 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 try {\n const newAccessKey = await projectAccessKeyService.refreshAccessKey(\n clientId,\n project!._id,\n user!._id\n );\n\n const responseData = formatResponse<OAuth2Access>({\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,8BAAyC;AACzC,oBAAuC;AACvC,0BAAkD;AAU3C,MAAM,kBAAkB,OAC7B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,SAAS,oBAAoB,eAAe,iBAAiB,IACzE,IAAI;AAEN,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,qBAAqB;AAClE;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,kBAAkB;AAC/D;AAAA,EACF;AAEA,MAAI,CAAC,oBAAoB;AACvB,+BAAa;AAAA,MACX;AAAA,MACA;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,eAAe;AAClB,+BAAa,2BAA2B,KAAK,yBAAyB;AACtE;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB;AACrB,+BAAa,2BAA2B,KAAK,4BAA4B;AACzE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,wBAAwB;AAAA,MACjD,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,mBAAe,oCAA6B;AAAA,MAChD,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;AAQO,MAAM,kBAAkB,OAC7B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,IAAI;AAC9B,QAAM,EAAE,SAAS,IAAI,IAAI;AAEzB,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,qBAAqB;AAClE;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,kBAAkB;AAC/D;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,+BAAa,2BAA2B,KAAK,qBAAqB;AAClE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,mBAAmB,MAAM,wBAAwB;AAAA,MACrD;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,CAAC,kBAAkB;AACrB,iCAAa,2BAA2B,KAAK,wBAAwB;AAAA,QACnE;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,mBAAe,oCAAqB;AAAA,MACxC,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;AAQO,MAAM,mBAAmB,OAC9B,KACA,KACA,UACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,IAAI;AAC9B,QAAM,EAAE,SAAS,IAAI,IAAI;AAEzB,MAAI,CAAC,SAAS;AACZ,+BAAa,2BAA2B,KAAK,qBAAqB;AAAA,EACpE;AAEA,MAAI,CAAC,MAAM;AACT,+BAAa,2BAA2B,KAAK,kBAAkB;AAAA,EACjE;AAEA,MAAI,CAAC,UAAU;AACb,+BAAa,2BAA2B,KAAK,qBAAqB;AAAA,EACpE;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,wBAAwB;AAAA,MACjD;AAAA,MACA,QAAS;AAAA,MACT,KAAM;AAAA,IACR;AAEA,UAAM,mBAAe,oCAA6B;AAAA,MAChD,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,YAAY;AACrB;AAAA,EACF,SAAS,OAAO;AACd,+BAAa,uBAAuB,KAAK,KAAiB;AAC1D;AAAA,EACF;AACF;","names":[]}
@@ -51,6 +51,8 @@ var userService = __toESM(require('./../services/user.service.cjs'), 1);
51
51
  var import_CSRF = require('./../utils/CSRF.cjs');
52
52
  var import_errors = require('./../utils/errors/index.cjs');
53
53
  var import_httpStatusCodes = require('./../utils/httpStatusCodes.cjs');
54
+ var import_organization = require('./../utils/mapper/organization.cjs');
55
+ var import_project = require('./../utils/mapper/project.cjs');
54
56
  var import_user = require('./../utils/mapper/user.cjs');
55
57
  var import_responseData = require('./../utils/responseData.cjs');
56
58
  var import_mongoose = require("mongoose");
@@ -152,7 +154,7 @@ const loginEmailPassword = async (req, res, _next) => {
152
154
  const logOut = async (_req, res, _next) => {
153
155
  const { user } = res.locals;
154
156
  if (!user) {
155
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
157
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
156
158
  return;
157
159
  }
158
160
  await sessionAuthService.clearUserAuth(res);
@@ -166,7 +168,7 @@ const updatePassword = async (req, res, _next) => {
166
168
  const { oldPassword, newPassword } = req.body;
167
169
  let { user } = res.locals;
168
170
  if (!user) {
169
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
171
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
170
172
  return;
171
173
  }
172
174
  try {
@@ -207,12 +209,14 @@ const validEmail = async (req, res, _next) => {
207
209
  return;
208
210
  }
209
211
  if (!organization) {
210
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
212
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
211
213
  return;
212
214
  }
213
215
  const user = await userService.getUserById(userId);
214
216
  if (!user) {
215
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND", { userId });
217
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED", {
218
+ userId
219
+ });
216
220
  return;
217
221
  }
218
222
  await sessionAuthService.activateUser(user._id, secret);
@@ -301,13 +305,13 @@ const resetPassword = async (req, res, _next) => {
301
305
  const getSessionInformation = async (req, res, _next) => {
302
306
  const { session_token: sessionToken } = req.query;
303
307
  let { user } = res.locals;
304
- const { organization, project } = res.locals;
308
+ const { organization, project, isOrganizationAdmin, isProjectAdmin } = res.locals;
305
309
  try {
306
310
  if (sessionToken) {
307
311
  user = await userService.getUserBySession(sessionToken);
308
312
  }
309
313
  if (!user) {
310
- import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
314
+ import_errors.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
311
315
  return;
312
316
  }
313
317
  const session = user.session;
@@ -320,7 +324,12 @@ const getSessionInformation = async (req, res, _next) => {
320
324
  role: "user"
321
325
  };
322
326
  const responseData = (0, import_responseData.formatResponse)({
323
- data: { session, user: formattedUser, organization, project }
327
+ data: {
328
+ session,
329
+ user: formattedUser,
330
+ organization: organization?._id ? (0, import_organization.mapOrganizationToAPI)(organization, isOrganizationAdmin) : null,
331
+ project: project?._id ? (0, import_project.mapProjectToAPI)(project, user, isProjectAdmin) : null
332
+ }
324
333
  });
325
334
  res.json(responseData);
326
335
  return;