@meridianjs/meridian 1.31.0 → 2.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 (171) hide show
  1. package/dist/api/admin/events/route.d.ts.map +1 -1
  2. package/dist/api/admin/events/route.js +15 -8
  3. package/dist/api/admin/events/route.js.map +1 -1
  4. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -1
  5. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +34 -31
  6. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
  7. package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -1
  8. package/dist/api/admin/issues/[id]/attachments/route.js +47 -22
  9. package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -1
  10. package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
  11. package/dist/api/admin/issues/[id]/comments/route.js +20 -17
  12. package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
  13. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
  14. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +63 -60
  15. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
  16. package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -1
  17. package/dist/api/admin/issues/[id]/time-logs/route.js +42 -17
  18. package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -1
  19. package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -1
  20. package/dist/api/admin/issues/[id]/time-logs/timer/route.js +49 -24
  21. package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -1
  22. package/dist/api/admin/issues/route.d.ts.map +1 -1
  23. package/dist/api/admin/issues/route.js +2 -7
  24. package/dist/api/admin/issues/route.js.map +1 -1
  25. package/dist/api/admin/my/tasks/route.d.ts.map +1 -1
  26. package/dist/api/admin/my/tasks/route.js +16 -24
  27. package/dist/api/admin/my/tasks/route.js.map +1 -1
  28. package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
  29. package/dist/api/admin/projects/[id]/access/route.js +15 -2
  30. package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
  31. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts +4 -0
  32. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts.map +1 -0
  33. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js +105 -0
  34. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js.map +1 -0
  35. package/dist/api/admin/projects/[id]/access-requests/route.d.ts +5 -0
  36. package/dist/api/admin/projects/[id]/access-requests/route.d.ts.map +1 -0
  37. package/dist/api/admin/projects/[id]/access-requests/route.js +138 -0
  38. package/dist/api/admin/projects/[id]/access-requests/route.js.map +1 -0
  39. package/dist/api/admin/projects/[id]/health/[updateId]/route.d.ts.map +1 -1
  40. package/dist/api/admin/projects/[id]/health/[updateId]/route.js +83 -73
  41. package/dist/api/admin/projects/[id]/health/[updateId]/route.js.map +1 -1
  42. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.d.ts.map +1 -1
  43. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js +68 -65
  44. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js.map +1 -1
  45. package/dist/api/admin/projects/[id]/health/route.d.ts.map +1 -1
  46. package/dist/api/admin/projects/[id]/health/route.js +33 -30
  47. package/dist/api/admin/projects/[id]/health/route.js.map +1 -1
  48. package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -1
  49. package/dist/api/admin/projects/[id]/share/route.js +44 -39
  50. package/dist/api/admin/projects/[id]/share/route.js.map +1 -1
  51. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -1
  52. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +77 -72
  53. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -1
  54. package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -1
  55. package/dist/api/admin/projects/[id]/statuses/reorder/route.js +20 -17
  56. package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -1
  57. package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -1
  58. package/dist/api/admin/projects/[id]/statuses/route.js +23 -20
  59. package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
  60. package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -1
  61. package/dist/api/admin/projects/[id]/task-lists/route.js +22 -19
  62. package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -1
  63. package/dist/api/admin/projects/route.d.ts.map +1 -1
  64. package/dist/api/admin/projects/route.js +58 -40
  65. package/dist/api/admin/projects/route.js.map +1 -1
  66. package/dist/api/admin/reporting/members/route.d.ts.map +1 -1
  67. package/dist/api/admin/reporting/members/route.js +2 -6
  68. package/dist/api/admin/reporting/members/route.js.map +1 -1
  69. package/dist/api/admin/reporting/time-logs/route.d.ts.map +1 -1
  70. package/dist/api/admin/reporting/time-logs/route.js +11 -26
  71. package/dist/api/admin/reporting/time-logs/route.js.map +1 -1
  72. package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -1
  73. package/dist/api/admin/task-lists/[id]/route.js +44 -39
  74. package/dist/api/admin/task-lists/[id]/route.js.map +1 -1
  75. package/dist/api/admin/time-logs/active-timer/route.d.ts.map +1 -1
  76. package/dist/api/admin/time-logs/active-timer/route.js +14 -11
  77. package/dist/api/admin/time-logs/active-timer/route.js.map +1 -1
  78. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts +1 -0
  79. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts.map +1 -1
  80. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js +35 -15
  81. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js.map +1 -1
  82. package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts.map +1 -1
  83. package/dist/api/admin/workspaces/[id]/access-requests/route.js +5 -19
  84. package/dist/api/admin/workspaces/[id]/access-requests/route.js.map +1 -1
  85. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.d.ts.map +1 -1
  86. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js +1 -15
  87. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js.map +1 -1
  88. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.d.ts.map +1 -1
  89. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js +1 -15
  90. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js.map +1 -1
  91. package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
  92. package/dist/api/admin/workspaces/[id]/invitations/route.js +49 -65
  93. package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
  94. package/dist/api/admin/workspaces/[id]/logo/route.d.ts.map +1 -1
  95. package/dist/api/admin/workspaces/[id]/logo/route.js +1 -15
  96. package/dist/api/admin/workspaces/[id]/logo/route.js.map +1 -1
  97. package/dist/api/admin/workspaces/[id]/members/[userId]/route.d.ts.map +1 -1
  98. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js +1 -19
  99. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js.map +1 -1
  100. package/dist/api/admin/workspaces/[id]/members/batch/route.d.ts.map +1 -1
  101. package/dist/api/admin/workspaces/[id]/members/batch/route.js +48 -56
  102. package/dist/api/admin/workspaces/[id]/members/batch/route.js.map +1 -1
  103. package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
  104. package/dist/api/admin/workspaces/[id]/members/route.js +43 -60
  105. package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
  106. package/dist/api/admin/workspaces/[id]/route.d.ts.map +1 -1
  107. package/dist/api/admin/workspaces/[id]/route.js +3 -22
  108. package/dist/api/admin/workspaces/[id]/route.js.map +1 -1
  109. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.d.ts.map +1 -1
  110. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.js +1 -19
  111. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.js.map +1 -1
  112. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.d.ts.map +1 -1
  113. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.js +1 -19
  114. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.js.map +1 -1
  115. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.d.ts.map +1 -1
  116. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.js +1 -19
  117. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.js.map +1 -1
  118. package/dist/api/admin/workspaces/[id]/teams/route.d.ts.map +1 -1
  119. package/dist/api/admin/workspaces/[id]/teams/route.js +1 -19
  120. package/dist/api/admin/workspaces/[id]/teams/route.js.map +1 -1
  121. package/dist/api/admin/workspaces/my-access-requests/route.d.ts +3 -0
  122. package/dist/api/admin/workspaces/my-access-requests/route.d.ts.map +1 -0
  123. package/dist/api/admin/workspaces/my-access-requests/route.js +20 -0
  124. package/dist/api/admin/workspaces/my-access-requests/route.js.map +1 -0
  125. package/dist/api/admin/workspaces/route.d.ts.map +1 -1
  126. package/dist/api/admin/workspaces/route.js +49 -34
  127. package/dist/api/admin/workspaces/route.js.map +1 -1
  128. package/dist/api/admin/workspaces/search/route.d.ts.map +1 -1
  129. package/dist/api/admin/workspaces/search/route.js +5 -2
  130. package/dist/api/admin/workspaces/search/route.js.map +1 -1
  131. package/dist/api/auth/_apply-pending-invites.d.ts +12 -0
  132. package/dist/api/auth/_apply-pending-invites.d.ts.map +1 -0
  133. package/dist/api/auth/_apply-pending-invites.js +68 -0
  134. package/dist/api/auth/_apply-pending-invites.js.map +1 -0
  135. package/dist/api/auth/google/callback/route.d.ts.map +1 -1
  136. package/dist/api/auth/google/callback/route.js +20 -0
  137. package/dist/api/auth/google/callback/route.js.map +1 -1
  138. package/dist/api/auth/invite/[token]/route.d.ts.map +1 -1
  139. package/dist/api/auth/invite/[token]/route.js +2 -9
  140. package/dist/api/auth/invite/[token]/route.js.map +1 -1
  141. package/dist/api/auth/register/route.d.ts.map +1 -1
  142. package/dist/api/auth/register/route.js +16 -0
  143. package/dist/api/auth/register/route.js.map +1 -1
  144. package/dist/api/utils/assign-default-role.d.ts +6 -0
  145. package/dist/api/utils/assign-default-role.d.ts.map +1 -0
  146. package/dist/api/utils/assign-default-role.js +23 -0
  147. package/dist/api/utils/assign-default-role.js.map +1 -0
  148. package/dist/api/utils/project-access.d.ts +9 -0
  149. package/dist/api/utils/project-access.d.ts.map +1 -1
  150. package/dist/api/utils/project-access.js +27 -0
  151. package/dist/api/utils/project-access.js.map +1 -1
  152. package/dist/api/utils/workspace-access.d.ts +17 -0
  153. package/dist/api/utils/workspace-access.d.ts.map +1 -0
  154. package/dist/api/utils/workspace-access.js +72 -0
  155. package/dist/api/utils/workspace-access.js.map +1 -0
  156. package/dist/subscribers/project-access-request-resolved.d.ts +12 -0
  157. package/dist/subscribers/project-access-request-resolved.d.ts.map +1 -0
  158. package/dist/subscribers/project-access-request-resolved.js +55 -0
  159. package/dist/subscribers/project-access-request-resolved.js.map +1 -0
  160. package/dist/subscribers/project-access-requested.d.ts +11 -0
  161. package/dist/subscribers/project-access-requested.d.ts.map +1 -0
  162. package/dist/subscribers/project-access-requested.js +12 -0
  163. package/dist/subscribers/project-access-requested.js.map +1 -0
  164. package/dist/subscribers/workspace-access-request-resolved.d.ts +12 -0
  165. package/dist/subscribers/workspace-access-request-resolved.d.ts.map +1 -0
  166. package/dist/subscribers/workspace-access-request-resolved.js +60 -0
  167. package/dist/subscribers/workspace-access-request-resolved.js.map +1 -0
  168. package/dist/subscribers/workspace-access-requested.d.ts.map +1 -1
  169. package/dist/subscribers/workspace-access-requested.js +1 -0
  170. package/dist/subscribers/workspace-access-requested.js.map +1 -1
  171. package/package.json +19 -19
@@ -1,37 +1,62 @@
1
+ import { requirePermission } from "@meridianjs/auth";
1
2
  import { sseManager } from "@meridianjs/framework";
3
+ import { hasProjectAccess } from "../../../../../utils/project-access.js";
4
+ async function assertIssueAccess(req, res) {
5
+ const issueService = req.scope.resolve("issueModuleService");
6
+ const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
7
+ if (!issue) {
8
+ res.status(404).json({ error: { message: "Issue not found" } });
9
+ return false;
10
+ }
11
+ if (issue.project_id) {
12
+ const projectService = req.scope.resolve("projectModuleService");
13
+ const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
14
+ if (project && !await hasProjectAccess(req, project)) {
15
+ res.status(403).json({ error: { message: "Forbidden" } });
16
+ return false;
17
+ }
18
+ }
19
+ return true;
20
+ }
2
21
  export const GET = async (req, res) => {
22
+ if (!await assertIssueAccess(req, res))
23
+ return;
3
24
  const issueService = req.scope.resolve("issueModuleService");
4
25
  const active = await issueService.getActiveTimer(req.params.id, req.user?.id ?? "system");
5
26
  res.json({ active_timer: active ?? null });
6
27
  };
7
28
  export const POST = async (req, res) => {
8
- const issueService = req.scope.resolve("issueModuleService");
9
- const { action } = req.body;
10
- if (action !== "start" && action !== "stop") {
11
- res.status(400).json({ error: { message: "action must be 'start' or 'stop'." } });
12
- return;
13
- }
14
- if (action === "start") {
15
- const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
16
- if (!issue) {
17
- res.status(404).json({ error: { message: "Issue not found." } });
29
+ requirePermission("issue:update")(req, res, async () => {
30
+ if (!await assertIssueAccess(req, res))
31
+ return;
32
+ const issueService = req.scope.resolve("issueModuleService");
33
+ const { action } = req.body;
34
+ if (action !== "start" && action !== "stop") {
35
+ res.status(400).json({ error: { message: "action must be 'start' or 'stop'." } });
18
36
  return;
19
37
  }
20
- const { entry, stoppedEntry } = await issueService.startTimer(req.params.id, req.user?.id ?? "system", issue.workspace_id, issue.project_id ?? undefined);
21
- sseManager.broadcast(issue.workspace_id, "timer.started", { issue_id: req.params.id, user_id: req.user?.id ?? "system" });
22
- if (stoppedEntry) {
23
- sseManager.broadcast(issue.workspace_id, "timer.stopped", { issue_id: stoppedEntry.issue_id, user_id: req.user?.id ?? "system" });
38
+ if (action === "start") {
39
+ const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
40
+ if (!issue) {
41
+ res.status(404).json({ error: { message: "Issue not found." } });
42
+ return;
43
+ }
44
+ const { entry, stoppedEntry } = await issueService.startTimer(req.params.id, req.user?.id ?? "system", issue.workspace_id, issue.project_id ?? undefined);
45
+ sseManager.broadcast(issue.workspace_id, "timer.started", { issue_id: req.params.id, user_id: req.user?.id ?? "system" });
46
+ if (stoppedEntry) {
47
+ sseManager.broadcast(issue.workspace_id, "timer.stopped", { issue_id: stoppedEntry.issue_id, user_id: req.user?.id ?? "system" });
48
+ }
49
+ res.status(201).json({ time_log: entry, stopped_timer: stoppedEntry ?? null });
50
+ return;
24
51
  }
25
- res.status(201).json({ time_log: entry, stopped_timer: stoppedEntry ?? null });
26
- return;
27
- }
28
- const entry = await issueService.stopTimer(req.params.id, req.user?.id ?? "system");
29
- if (entry) {
30
- const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
31
- if (issue) {
32
- sseManager.broadcast(issue.workspace_id, "timer.stopped", { issue_id: req.params.id, user_id: req.user?.id ?? "system" });
52
+ const entry = await issueService.stopTimer(req.params.id, req.user?.id ?? "system");
53
+ if (entry) {
54
+ const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
55
+ if (issue) {
56
+ sseManager.broadcast(issue.workspace_id, "timer.stopped", { issue_id: req.params.id, user_id: req.user?.id ?? "system" });
57
+ }
33
58
  }
34
- }
35
- res.json({ time_log: entry });
59
+ res.json({ time_log: entry });
60
+ });
36
61
  };
37
62
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAEzE,KAAK,UAAU,iBAAiB,CAAC,GAAQ,EAAE,GAAa;IACtD,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAA;QAC/D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;QACvE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACxF,IAAI,OAAO,IAAI,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;YACzD,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAM;IAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAA;IACzF,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAM;QAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;QAC3B,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,EAAE,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YACxF,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC,CAAA;YACzJ,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAA;YACzH,IAAI,YAAY,EAAE,CAAC;gBACjB,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAA;YACnI,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,IAAI,IAAI,EAAE,CAAC,CAAA;YAC9E,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAA;QACnF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAC/E,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAA;YAC3H,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/issues/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAKrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwHhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAuDrE,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/issues/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAMrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAkHhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAuDrE,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { requirePermission } from "@meridianjs/auth";
2
2
  import { createIssueWorkflow } from "../../../workflows/create-issue.js";
3
3
  import { hasProjectAccess } from "../../utils/project-access.js";
4
+ import { getAccessibleWorkspaceIds } from "../../utils/workspace-access.js";
4
5
  export const GET = async (req, res) => {
5
6
  const issueService = req.scope.resolve("issueModuleService");
6
7
  const maxLimit = req.query.project_id ? 1000 : 200;
@@ -61,18 +62,12 @@ export const GET = async (req, res) => {
61
62
  else {
62
63
  // No project scope — restrict to projects the caller can access
63
64
  const projectService = req.scope.resolve("projectModuleService");
64
- const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
65
65
  const userId = req.user?.id;
66
66
  const roles = req.user?.roles ?? [];
67
67
  const isPrivileged = roles.includes("super-admin") || roles.includes("admin");
68
68
  let accessibleProjectIds;
69
69
  if (isPrivileged) {
70
- const workspaceService = req.scope.resolve("workspaceModuleService");
71
- const [allWorkspaces] = await workspaceService.listAndCountWorkspaces({}, { limit: 1000 });
72
- const memberWsIds = new Set(await workspaceMemberService.getWorkspaceIdsForUser(userId));
73
- const allowedWsIds = allWorkspaces
74
- .filter((ws) => !ws.is_private || memberWsIds.has(ws.id))
75
- .map((ws) => ws.id);
70
+ const allowedWsIds = await getAccessibleWorkspaceIds(req);
76
71
  if (allowedWsIds.length === 0) {
77
72
  res.json({ issues: [], count: 0, limit, offset });
78
73
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/issues/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/issues/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/my/tasks/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuGhD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/my/tasks/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAiGhD,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { getAccessibleWorkspaceIds } from "../../../utils/workspace-access.js";
1
2
  export const GET = async (req, res) => {
2
3
  const issueService = req.scope.resolve("issueModuleService");
3
4
  const projectService = req.scope.resolve("projectModuleService");
@@ -8,14 +9,7 @@ export const GET = async (req, res) => {
8
9
  res.status(401).json({ error: { message: "Unauthorized" } });
9
10
  return;
10
11
  }
11
- // Determine accessible workspaces: public ones + private ones where user is a member
12
- const workspaceService = req.scope.resolve("workspaceModuleService");
13
- const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
14
- const [allWorkspaces] = await workspaceService.listAndCountWorkspaces({}, { limit: 1000 });
15
- const memberWsIds = new Set(await workspaceMemberService.getWorkspaceIdsForUser(userId));
16
- let accessibleWsIds = allWorkspaces
17
- .filter((ws) => !ws.is_private || memberWsIds.has(ws.id))
18
- .map((ws) => ws.id);
12
+ let accessibleWsIds = await getAccessibleWorkspaceIds(req);
19
13
  // If caller passed workspace_id filter, intersect with accessible IDs
20
14
  if (req.query.workspace_id) {
21
15
  const requested = req.query.workspace_id.split(",").filter(Boolean);
@@ -27,17 +21,18 @@ export const GET = async (req, res) => {
27
21
  return;
28
22
  }
29
23
  const wsFilter = accessibleWsIds.length === 1 ? accessibleWsIds[0] : { $in: accessibleWsIds };
30
- // Fetch issues assigned to this user within accessible workspaces
31
- let [issues, count] = await issueService.listAndCountIssues({ workspace_id: wsFilter, assignee_ids: { $contains: userId } }, { limit: 500, offset: 0, orderBy: { updated_at: "DESC" } });
32
- // Apply optional filters
24
+ // Build DB filters push priority/type into query instead of post-filtering
25
+ const issueFilters = { workspace_id: wsFilter, assignee_ids: { $contains: userId } };
33
26
  if (req.query.priority) {
34
27
  const priorities = req.query.priority.split(",").filter(Boolean);
35
- issues = issues.filter((i) => priorities.includes(i.priority));
28
+ issueFilters.priority = priorities.length === 1 ? priorities[0] : { $in: priorities };
36
29
  }
37
30
  if (req.query.type) {
38
31
  const types = req.query.type.split(",").filter(Boolean);
39
- issues = issues.filter((i) => types.includes(i.type));
32
+ issueFilters.type = types.length === 1 ? types[0] : { $in: types };
40
33
  }
34
+ // Fetch issues assigned to this user within accessible workspaces
35
+ let [issues, count] = await issueService.listAndCountIssues(issueFilters, { limit: 500, offset: 0, orderBy: { updated_at: "DESC" } });
41
36
  // Collect unique project IDs for enrichment
42
37
  const projectIds = [...new Set(issues.map((i) => i.project_id))];
43
38
  // Batch-fetch projects and their statuses
@@ -48,19 +43,16 @@ export const GET = async (req, res) => {
48
43
  for (const p of projects) {
49
44
  projectMap.set(p.id, { name: p.name, identifier: p.identifier });
50
45
  }
51
- // Fetch statuses for all projects
52
- for (const pid of projectIds) {
53
- try {
54
- const statuses = await projectService.listProjectStatuss({ project_id: pid }, { limit: 50 });
55
- for (const s of statuses) {
56
- // Key by project_id + status_key for lookup
57
- statusMap.set(`${pid}:${s.key}`, { name: s.name, color: s.color, category: s.category });
58
- }
59
- }
60
- catch {
61
- // Project may not have custom statuses
46
+ // Batch-fetch statuses for all projects in one query
47
+ try {
48
+ const allStatuses = await projectService.listProjectStatuss({ project_id: projectIds.length === 1 ? projectIds[0] : { $in: projectIds } }, { limit: projectIds.length * 50 });
49
+ for (const s of allStatuses) {
50
+ statusMap.set(`${s.project_id}:${s.key}`, { name: s.name, color: s.color, category: s.category });
62
51
  }
63
52
  }
53
+ catch {
54
+ // Projects may not have custom statuses
55
+ }
64
56
  }
65
57
  // Enrich issues
66
58
  const enriched = issues.map((issue) => {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/my/tasks/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAEvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAE5C,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAA;QAC5D,OAAM;IACR,CAAC;IAED,qFAAqF;IACrF,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;IAC3E,MAAM,sBAAsB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAQ,CAAA;IACvF,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;IAChG,IAAI,eAAe,GAAc,aAAuB;SACrD,MAAM,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAE1B,sEAAsE;IACtE,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAI,GAAG,CAAC,KAAK,CAAC,YAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAA;QAC9C,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAA;IAE7F,kEAAkE;IAClE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,kBAAkB,CACzD,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAC/D,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAC3D,CAAA;IAED,yBAAyB;IACzB,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,UAAU,GAAI,GAAG,CAAC,KAAK,CAAC,QAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC5E,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,GAAI,GAAG,CAAC,KAAK,CAAC,IAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACnE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,4CAA4C;IAC5C,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAa,CAAA;IAEjF,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgD,CAAA;IAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6D,CAAA;IAEtF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAC1D,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAC3B,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAC7B,CAAA;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,kCAAkC;QAClC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC5F,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,4CAA4C;oBAC5C,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC1F,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QACnE,OAAO;YACL,GAAG,KAAK;YACR,QAAQ,EAAE,IAAI,IAAI,IAAI;YACtB,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;SACjF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,yCAAyC;IACzC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,UAAU,GAAI,GAAG,CAAC,KAAK,CAAC,QAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrF,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACnG,OAAM;IACR,CAAC;IAED,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAA;IACvB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AACpF,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/my/tasks/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwDhD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuEhD,CAAA"}
@@ -28,11 +28,24 @@ export const GET = async (req, res) => {
28
28
  const teamEntries = await projectMemberService.listProjectTeamIds(projectId);
29
29
  // Batch-fetch all member users in a single query
30
30
  const userMap = await userService.listUsersByIds(members.map((m) => m.user_id));
31
+ // Resolve app role names for all members
32
+ let appRoleMap = new Map();
33
+ try {
34
+ const appRoleService = req.scope.resolve("appRoleModuleService");
35
+ const roleIds = [...new Set([...userMap.values()].map((u) => u.app_role_id).filter(Boolean))];
36
+ if (roleIds.length > 0) {
37
+ const [roles] = await appRoleService.listAndCountAppRoles({ id: roleIds }, { limit: roleIds.length });
38
+ for (const r of roles)
39
+ appRoleMap.set(r.id, r.name);
40
+ }
41
+ }
42
+ catch { /* app-role module may not be loaded */ }
31
43
  const enrichedMembers = members.map((m) => {
32
44
  const user = userMap.get(m.user_id) ?? null;
45
+ const appRoleName = user?.app_role_id ? (appRoleMap.get(user.app_role_id) ?? null) : null;
33
46
  return user
34
- ? { id: m.id, user_id: m.user_id, role: m.role, user: { id: user.id, email: user.email, first_name: user.first_name, last_name: user.last_name } }
35
- : { id: m.id, user_id: m.user_id, role: m.role, user: null };
47
+ ? { id: m.id, user_id: m.user_id, role: m.role, app_role_name: appRoleName, user: { id: user.id, email: user.email, first_name: user.first_name, last_name: user.last_name, app_role_id: user.app_role_id ?? null } }
48
+ : { id: m.id, user_id: m.user_id, role: m.role, app_role_name: null, user: null };
36
49
  });
37
50
  const enrichedTeams = await Promise.all(teamEntries.map(async (t) => {
38
51
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
+ export declare const PATCH: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/access-requests/[requestId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAIrD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAuBvE,CAAA;AAED,eAAO,MAAM,KAAK,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAiFtE,CAAA"}
@@ -0,0 +1,105 @@
1
+ import { resolveProjectAndAccess } from "../../../../../utils/project-access.js";
2
+ // Owner cancels their own pending request
3
+ export const DELETE = async (req, res, next) => {
4
+ try {
5
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
6
+ const request = await projectMemberService.getAccessRequest(req.params.requestId);
7
+ if (!request || request.project_id !== req.params.id) {
8
+ res.status(404).json({ error: { message: "Access request not found" } });
9
+ return;
10
+ }
11
+ if (request.user_id !== req.user?.id) {
12
+ res.status(403).json({ error: { message: "Forbidden — can only cancel your own request" } });
13
+ return;
14
+ }
15
+ if (request.status !== "pending") {
16
+ res.status(409).json({ error: { message: "Request is no longer pending" } });
17
+ return;
18
+ }
19
+ await projectMemberService.deleteAccessRequest(req.params.requestId);
20
+ res.status(204).end();
21
+ }
22
+ catch (err) {
23
+ next(err);
24
+ }
25
+ };
26
+ export const PATCH = async (req, res, next) => {
27
+ try {
28
+ const result = await resolveProjectAndAccess(req, res);
29
+ if (!result)
30
+ return;
31
+ if (!result.isAuthorized) {
32
+ res.status(403).json({ error: { message: "Forbidden — project manager or admin role required" } });
33
+ return;
34
+ }
35
+ const { project } = result;
36
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
37
+ const { action } = req.body;
38
+ if (action !== "approve" && action !== "deny") {
39
+ res.status(400).json({ error: { message: "action must be 'approve' or 'deny'" } });
40
+ return;
41
+ }
42
+ const request = await projectMemberService.getAccessRequest(req.params.requestId);
43
+ if (!request || request.project_id !== project.id) {
44
+ res.status(404).json({ error: { message: "Access request not found" } });
45
+ return;
46
+ }
47
+ if (request.status !== "pending") {
48
+ res.status(409).json({ error: { message: "Request is no longer pending" } });
49
+ return;
50
+ }
51
+ if (action === "approve") {
52
+ await projectMemberService.ensureProjectMember(project.id, request.user_id, "member");
53
+ }
54
+ const updated = await projectMemberService.updateAccessRequestStatus(request.id, action === "approve" ? "approved" : "denied");
55
+ // Activity log
56
+ try {
57
+ const activityService = req.scope.resolve("activityModuleService");
58
+ await activityService.createActivity({
59
+ entity_type: "project", entity_id: project.id,
60
+ actor_id: req.user?.id ?? "system",
61
+ action: action === "approve" ? "access_request_approved" : "access_request_denied",
62
+ workspace_id: project.workspace_id,
63
+ changes: { user_id: request.user_id },
64
+ });
65
+ }
66
+ catch { }
67
+ // Notify requesting user
68
+ try {
69
+ const notificationService = req.scope.resolve("notificationModuleService");
70
+ await notificationService.createNotification({
71
+ user_id: request.user_id,
72
+ entity_type: "project_access_request",
73
+ entity_id: request.id,
74
+ action: action === "approve" ? "access_approved" : "access_denied",
75
+ message: action === "approve"
76
+ ? `Your request to join "${project.name}" was approved.`
77
+ : `Your request to join "${project.name}" was denied.`,
78
+ workspace_id: project.workspace_id,
79
+ metadata: {
80
+ project_id: project.id,
81
+ project_name: project.name,
82
+ },
83
+ }).catch(() => { });
84
+ }
85
+ catch {
86
+ // Non-fatal
87
+ }
88
+ const eventBus = req.scope.resolve("eventBus");
89
+ eventBus.emit({
90
+ name: "project.access_request_resolved",
91
+ data: {
92
+ project_id: project.id,
93
+ project_name: project.name,
94
+ workspace_id: project.workspace_id,
95
+ user_id: request.user_id,
96
+ action,
97
+ },
98
+ }).catch(() => { });
99
+ res.json({ access_request: updated });
100
+ }
101
+ catch (err) {
102
+ next(err);
103
+ }
104
+ };
105
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/access-requests/[requestId]/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const GET: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
+ export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
5
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access-requests/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAkCpE,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBA6FrE,CAAA;AAGD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAgBvE,CAAA"}
@@ -0,0 +1,138 @@
1
+ import { resolveProjectAndAccess } from "../../../../utils/project-access.js";
2
+ export const GET = async (req, res, next) => {
3
+ try {
4
+ const result = await resolveProjectAndAccess(req, res);
5
+ if (!result)
6
+ return;
7
+ if (!result.isAuthorized) {
8
+ res.status(403).json({ error: { message: "Forbidden — project manager or admin role required" } });
9
+ return;
10
+ }
11
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
12
+ const userService = req.scope.resolve("userModuleService");
13
+ const requests = await projectMemberService.listPendingAccessRequests(req.params.id);
14
+ const userMap = await userService.listUsersByIds(requests.map((r) => r.user_id));
15
+ const enriched = requests.map((r) => ({
16
+ id: r.id,
17
+ project_id: r.project_id,
18
+ user_id: r.user_id,
19
+ message: r.message,
20
+ status: r.status,
21
+ created_at: r.created_at,
22
+ user: userMap.get(r.user_id)
23
+ ? (() => {
24
+ const u = userMap.get(r.user_id);
25
+ return { id: u.id, email: u.email, first_name: u.first_name, last_name: u.last_name };
26
+ })()
27
+ : null,
28
+ }));
29
+ res.json({ requests: enriched });
30
+ }
31
+ catch (err) {
32
+ next(err);
33
+ }
34
+ };
35
+ export const POST = async (req, res, next) => {
36
+ try {
37
+ const projectService = req.scope.resolve("projectModuleService");
38
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
39
+ const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
40
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
41
+ if (!project) {
42
+ res.status(404).json({ error: { message: "Project not found" } });
43
+ return;
44
+ }
45
+ const userId = req.user?.id;
46
+ // Must be a workspace member to request project access
47
+ const wsMembership = await workspaceMemberService.getMembership(project.workspace_id, userId);
48
+ if (!wsMembership) {
49
+ res.status(403).json({ error: { message: "Forbidden — must be a workspace member" } });
50
+ return;
51
+ }
52
+ // Must not already be a project member
53
+ const members = await projectMemberService.listProjectMembers(project.id);
54
+ if (members.some((m) => m.user_id === userId)) {
55
+ res.status(409).json({ error: { message: "Already a member of this project" } });
56
+ return;
57
+ }
58
+ // Must not already have a pending request
59
+ const existing = await projectMemberService.getPendingRequest(project.id, userId);
60
+ if (existing) {
61
+ res.status(409).json({ error: { message: "Access request already pending" } });
62
+ return;
63
+ }
64
+ const { message } = req.body;
65
+ const access_request = await projectMemberService.createAccessRequest({
66
+ project_id: project.id,
67
+ user_id: userId,
68
+ message: message?.trim() || null,
69
+ });
70
+ // Notify project managers
71
+ try {
72
+ const notificationService = req.scope.resolve("notificationModuleService");
73
+ const userService = req.scope.resolve("userModuleService");
74
+ const requester = await userService.retrieveUser(userId).catch(() => null);
75
+ const requesterName = requester
76
+ ? `${requester.first_name ?? ""} ${requester.last_name ?? ""}`.trim() || requester.email
77
+ : "Someone";
78
+ const managers = members.filter((m) => m.role === "manager");
79
+ for (const manager of managers) {
80
+ await notificationService.createNotification({
81
+ user_id: manager.user_id,
82
+ entity_type: "project_access_request",
83
+ entity_id: access_request.id,
84
+ action: "access_requested",
85
+ message: `${requesterName} requested access to "${project.name}"`,
86
+ workspace_id: project.workspace_id,
87
+ metadata: {
88
+ requesting_user_id: userId,
89
+ requesting_user_name: requesterName,
90
+ project_id: project.id,
91
+ project_name: project.name,
92
+ },
93
+ }).catch(() => { });
94
+ }
95
+ }
96
+ catch {
97
+ // Non-fatal
98
+ }
99
+ try {
100
+ const activityService = req.scope.resolve("activityModuleService");
101
+ await activityService.createActivity({
102
+ entity_type: "project", entity_id: project.id,
103
+ actor_id: userId,
104
+ action: "access_requested",
105
+ workspace_id: project.workspace_id,
106
+ changes: { user_id: userId },
107
+ });
108
+ }
109
+ catch { }
110
+ const eventBus = req.scope.resolve("eventBus");
111
+ eventBus.emit({
112
+ name: "project.access_requested",
113
+ data: { project_id: project.id, workspace_id: project.workspace_id, user_id: userId, request_id: access_request.id },
114
+ }).catch(() => { });
115
+ res.status(201).json({ access_request });
116
+ }
117
+ catch (err) {
118
+ next(err);
119
+ }
120
+ };
121
+ // User cancels their own pending request (no requestId needed)
122
+ export const DELETE = async (req, res, next) => {
123
+ try {
124
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
125
+ const userId = req.user?.id;
126
+ const existing = await projectMemberService.getPendingRequest(req.params.id, userId);
127
+ if (!existing) {
128
+ res.status(404).json({ error: { message: "No pending access request found" } });
129
+ return;
130
+ }
131
+ await projectMemberService.deleteAccessRequest(existing.id);
132
+ res.status(204).end();
133
+ }
134
+ catch (err) {
135
+ next(err);
136
+ }
137
+ };
138
+ //# sourceMappingURL=route.js.map