@meridianjs/meridian 0.1.13 → 0.1.14

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 (135) hide show
  1. package/dist/api/admin/issues/[id]/activities/route.d.ts.map +1 -1
  2. package/dist/api/admin/issues/[id]/activities/route.js +15 -0
  3. package/dist/api/admin/issues/[id]/activities/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 +27 -2
  6. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
  7. package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
  8. package/dist/api/admin/issues/[id]/comments/route.js +22 -0
  9. package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
  10. package/dist/api/admin/issues/[id]/route.d.ts +3 -3
  11. package/dist/api/admin/issues/[id]/route.d.ts.map +1 -1
  12. package/dist/api/admin/issues/[id]/route.js +75 -56
  13. package/dist/api/admin/issues/[id]/route.js.map +1 -1
  14. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
  15. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +12 -2
  16. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
  17. package/dist/api/admin/issues/route.d.ts +2 -2
  18. package/dist/api/admin/issues/route.d.ts.map +1 -1
  19. package/dist/api/admin/issues/route.js +28 -23
  20. package/dist/api/admin/issues/route.js.map +1 -1
  21. package/dist/api/admin/notifications/[id]/read/route.d.ts.map +1 -1
  22. package/dist/api/admin/notifications/[id]/read/route.js +11 -2
  23. package/dist/api/admin/notifications/[id]/read/route.js.map +1 -1
  24. package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
  25. package/dist/api/admin/projects/[id]/access/route.js +5 -0
  26. package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
  27. package/dist/api/admin/projects/[id]/members/[userId]/route.d.ts +2 -2
  28. package/dist/api/admin/projects/[id]/members/[userId]/route.d.ts.map +1 -1
  29. package/dist/api/admin/projects/[id]/members/[userId]/route.js +16 -11
  30. package/dist/api/admin/projects/[id]/members/[userId]/route.js.map +1 -1
  31. package/dist/api/admin/projects/[id]/members/route.d.ts +2 -2
  32. package/dist/api/admin/projects/[id]/members/route.d.ts.map +1 -1
  33. package/dist/api/admin/projects/[id]/members/route.js +31 -26
  34. package/dist/api/admin/projects/[id]/members/route.js.map +1 -1
  35. package/dist/api/admin/projects/[id]/route.d.ts +3 -3
  36. package/dist/api/admin/projects/[id]/route.d.ts.map +1 -1
  37. package/dist/api/admin/projects/[id]/route.js +40 -30
  38. package/dist/api/admin/projects/[id]/route.js.map +1 -1
  39. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -1
  40. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +19 -0
  41. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -1
  42. package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -1
  43. package/dist/api/admin/projects/[id]/statuses/reorder/route.js +10 -0
  44. package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -1
  45. package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -1
  46. package/dist/api/admin/projects/[id]/statuses/route.js +9 -0
  47. package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
  48. package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -1
  49. package/dist/api/admin/projects/[id]/task-lists/route.js +21 -0
  50. package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -1
  51. package/dist/api/admin/projects/[id]/teams/[teamId]/route.d.ts +2 -2
  52. package/dist/api/admin/projects/[id]/teams/[teamId]/route.d.ts.map +1 -1
  53. package/dist/api/admin/projects/[id]/teams/[teamId]/route.js +16 -11
  54. package/dist/api/admin/projects/[id]/teams/[teamId]/route.js.map +1 -1
  55. package/dist/api/admin/projects/[id]/teams/route.d.ts +2 -2
  56. package/dist/api/admin/projects/[id]/teams/route.d.ts.map +1 -1
  57. package/dist/api/admin/projects/[id]/teams/route.js +20 -15
  58. package/dist/api/admin/projects/[id]/teams/route.js.map +1 -1
  59. package/dist/api/admin/projects/route.d.ts +2 -2
  60. package/dist/api/admin/projects/route.d.ts.map +1 -1
  61. package/dist/api/admin/projects/route.js +29 -24
  62. package/dist/api/admin/projects/route.js.map +1 -1
  63. package/dist/api/admin/roles/[id]/route.d.ts +3 -3
  64. package/dist/api/admin/roles/[id]/route.d.ts.map +1 -1
  65. package/dist/api/admin/roles/[id]/route.js +30 -20
  66. package/dist/api/admin/roles/[id]/route.js.map +1 -1
  67. package/dist/api/admin/roles/route.d.ts +2 -2
  68. package/dist/api/admin/roles/route.d.ts.map +1 -1
  69. package/dist/api/admin/roles/route.js +18 -13
  70. package/dist/api/admin/roles/route.js.map +1 -1
  71. package/dist/api/admin/sprints/[id]/route.d.ts +3 -3
  72. package/dist/api/admin/sprints/[id]/route.d.ts.map +1 -1
  73. package/dist/api/admin/sprints/[id]/route.js +64 -34
  74. package/dist/api/admin/sprints/[id]/route.js.map +1 -1
  75. package/dist/api/admin/sprints/route.d.ts +2 -2
  76. package/dist/api/admin/sprints/route.d.ts.map +1 -1
  77. package/dist/api/admin/sprints/route.js +18 -13
  78. package/dist/api/admin/sprints/route.js.map +1 -1
  79. package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -1
  80. package/dist/api/admin/task-lists/[id]/route.js +35 -2
  81. package/dist/api/admin/task-lists/[id]/route.js.map +1 -1
  82. package/dist/api/admin/users/[id]/role/route.d.ts +2 -2
  83. package/dist/api/admin/users/[id]/role/route.d.ts.map +1 -1
  84. package/dist/api/admin/users/[id]/role/route.js +22 -17
  85. package/dist/api/admin/users/[id]/role/route.js.map +1 -1
  86. package/dist/api/admin/users/[id]/sessions/route.d.ts +2 -2
  87. package/dist/api/admin/users/[id]/sessions/route.d.ts.map +1 -1
  88. package/dist/api/admin/users/[id]/sessions/route.js +9 -4
  89. package/dist/api/admin/users/[id]/sessions/route.js.map +1 -1
  90. package/dist/api/admin/users/route.d.ts +2 -2
  91. package/dist/api/admin/users/route.d.ts.map +1 -1
  92. package/dist/api/admin/users/route.js +15 -7
  93. package/dist/api/admin/users/route.js.map +1 -1
  94. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.d.ts.map +1 -1
  95. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js +18 -0
  96. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js.map +1 -1
  97. package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
  98. package/dist/api/admin/workspaces/[id]/invitations/route.js +16 -0
  99. package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
  100. package/dist/api/admin/workspaces/[id]/members/[userId]/route.d.ts +3 -3
  101. package/dist/api/admin/workspaces/[id]/members/[userId]/route.d.ts.map +1 -1
  102. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js +30 -20
  103. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js.map +1 -1
  104. package/dist/api/admin/workspaces/[id]/members/route.d.ts +2 -2
  105. package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
  106. package/dist/api/admin/workspaces/[id]/members/route.js +21 -16
  107. package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
  108. package/dist/api/admin/workspaces/[id]/route.d.ts +2 -2
  109. package/dist/api/admin/workspaces/[id]/route.d.ts.map +1 -1
  110. package/dist/api/admin/workspaces/[id]/route.js +23 -8
  111. package/dist/api/admin/workspaces/[id]/route.js.map +1 -1
  112. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.d.ts +2 -2
  113. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.d.ts.map +1 -1
  114. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.js +9 -4
  115. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/[userId]/route.js.map +1 -1
  116. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.d.ts +2 -2
  117. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.d.ts.map +1 -1
  118. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.js +19 -14
  119. package/dist/api/admin/workspaces/[id]/teams/[teamId]/members/route.js.map +1 -1
  120. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.d.ts +3 -3
  121. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.d.ts.map +1 -1
  122. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.js +28 -18
  123. package/dist/api/admin/workspaces/[id]/teams/[teamId]/route.js.map +1 -1
  124. package/dist/api/admin/workspaces/[id]/teams/route.d.ts +2 -2
  125. package/dist/api/admin/workspaces/[id]/teams/route.d.ts.map +1 -1
  126. package/dist/api/admin/workspaces/[id]/teams/route.js +18 -13
  127. package/dist/api/admin/workspaces/[id]/teams/route.js.map +1 -1
  128. package/dist/api/admin/workspaces/route.d.ts +2 -2
  129. package/dist/api/admin/workspaces/route.d.ts.map +1 -1
  130. package/dist/api/admin/workspaces/route.js +22 -17
  131. package/dist/api/admin/workspaces/route.js.map +1 -1
  132. package/dist/workflows/create-invitation.d.ts.map +1 -1
  133. package/dist/workflows/create-invitation.js +0 -1
  134. package/dist/workflows/create-invitation.js.map +1 -1
  135. package/package.json +1 -1
@@ -1,3 +1,3 @@
1
- import type { Response } from "express";
2
- export declare const POST: (req: any, res: Response) => Promise<void>;
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
3
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/members/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAoCjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/members/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAwCrE,CAAA"}
@@ -1,33 +1,38 @@
1
1
  import { requirePermission } from "@meridianjs/auth";
2
- export const POST = async (req, res) => {
2
+ export const POST = async (req, res, next) => {
3
3
  requirePermission("project:manage_access")(req, res, async () => {
4
- const projectMemberService = req.scope.resolve("projectMemberModuleService");
5
- const projectService = req.scope.resolve("projectModuleService");
6
- const eventBus = req.scope.resolve("eventBus");
7
- const { user_id, role } = req.body;
8
- if (!user_id) {
9
- res.status(400).json({ error: { message: "user_id is required" } });
10
- return;
4
+ try {
5
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
6
+ const projectService = req.scope.resolve("projectModuleService");
7
+ const eventBus = req.scope.resolve("eventBus");
8
+ const { user_id, role } = req.body;
9
+ if (!user_id) {
10
+ res.status(400).json({ error: { message: "user_id is required" } });
11
+ return;
12
+ }
13
+ const projectRef = req.params.id;
14
+ const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
15
+ (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
16
+ if (!project) {
17
+ res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
18
+ return;
19
+ }
20
+ await projectMemberService.ensureProjectMember(project.id, user_id, role ?? "member");
21
+ await eventBus.emit({
22
+ name: "project.member_added",
23
+ data: {
24
+ project_id: project.id,
25
+ project_name: project.name,
26
+ workspace_id: project.workspace_id,
27
+ user_id,
28
+ actor_id: req.user?.id ?? "system",
29
+ },
30
+ }).catch(() => { });
31
+ res.status(201).json({ ok: true });
11
32
  }
12
- const projectRef = req.params.id;
13
- const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
14
- (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
15
- if (!project) {
16
- res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
17
- return;
33
+ catch (err) {
34
+ next(err);
18
35
  }
19
- await projectMemberService.ensureProjectMember(project.id, user_id, role ?? "member");
20
- await eventBus.emit({
21
- name: "project.member_added",
22
- data: {
23
- project_id: project.id,
24
- project_name: project.name,
25
- workspace_id: project.workspace_id,
26
- user_id,
27
- actor_id: req.user?.id ?? "system",
28
- },
29
- }).catch(() => { });
30
- res.status(201).json({ ok: true });
31
36
  });
32
37
  };
33
38
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/members/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;QACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;QACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;QACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;YACnE,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;QAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QAED,MAAM,oBAAoB,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAA;QAErF,MAAM,QAAQ,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE;gBACJ,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,YAAY,EAAE,OAAO,CAAC,IAAI;gBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO;gBACP,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ;aACnC;SACF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAElB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/members/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACxE,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;YACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;YACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;YACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;YAElC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;YAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YACpF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;gBACjF,OAAM;YACR,CAAC;YAED,MAAM,oBAAoB,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAA;YAErF,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,sBAAsB;gBAC5B,IAAI,EAAE;oBACJ,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,YAAY,EAAE,OAAO,CAAC,IAAI;oBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,OAAO;oBACP,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ;iBACnC;aACF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAElB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
- import type { Response } from "express";
1
+ import type { Response, NextFunction } from "express";
2
2
  export declare const GET: (req: any, res: Response) => Promise<void>;
3
- export declare const PUT: (req: any, res: Response) => Promise<void>;
4
- export declare const DELETE: (req: any, res: Response) => Promise<void>;
3
+ export declare const PUT: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
5
5
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/projects/[id]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAWhD,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAqBhD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAMnD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/projects/[id]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAIrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAWhD,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAyBpE,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAUvE,CAAA"}
@@ -13,40 +13,50 @@ export const GET = async (req, res) => {
13
13
  }
14
14
  res.json({ project });
15
15
  };
16
- export const PUT = async (req, res) => {
16
+ export const PUT = async (req, res, next) => {
17
17
  requirePermission("project:update")(req, res, async () => {
18
- const projectService = req.scope.resolve("projectModuleService");
19
- const activityService = req.scope.resolve("activityModuleService");
20
- const { name, description, status, visibility, icon, color, metadata } = req.body;
21
- const updates = {};
22
- if (name !== undefined)
23
- updates.name = name;
24
- if (description !== undefined)
25
- updates.description = description;
26
- if (status !== undefined)
27
- updates.status = status;
28
- if (visibility !== undefined)
29
- updates.visibility = visibility;
30
- if (icon !== undefined)
31
- updates.icon = icon;
32
- if (color !== undefined)
33
- updates.color = color;
34
- if (metadata !== undefined)
35
- updates.metadata = metadata;
36
- const project = await projectService.updateProject(req.params.id, updates);
37
- await activityService.recordActivity({
38
- entity_type: "project", entity_id: req.params.id,
39
- actor_id: req.user?.id ?? "system", action: "updated", workspace_id: project.workspace_id,
40
- changes: Object.fromEntries(Object.keys(updates).map(k => [k, { to: updates[k] }])),
41
- }).catch(() => { });
42
- res.json({ project });
18
+ try {
19
+ const projectService = req.scope.resolve("projectModuleService");
20
+ const activityService = req.scope.resolve("activityModuleService");
21
+ const { name, description, status, visibility, icon, color, metadata } = req.body;
22
+ const updates = {};
23
+ if (name !== undefined)
24
+ updates.name = name;
25
+ if (description !== undefined)
26
+ updates.description = description;
27
+ if (status !== undefined)
28
+ updates.status = status;
29
+ if (visibility !== undefined)
30
+ updates.visibility = visibility;
31
+ if (icon !== undefined)
32
+ updates.icon = icon;
33
+ if (color !== undefined)
34
+ updates.color = color;
35
+ if (metadata !== undefined)
36
+ updates.metadata = metadata;
37
+ const project = await projectService.updateProject(req.params.id, updates);
38
+ await activityService.recordActivity({
39
+ entity_type: "project", entity_id: req.params.id,
40
+ actor_id: req.user?.id ?? "system", action: "updated", workspace_id: project.workspace_id,
41
+ changes: Object.fromEntries(Object.keys(updates).map(k => [k, { to: updates[k] }])),
42
+ }).catch(() => { });
43
+ res.json({ project });
44
+ }
45
+ catch (err) {
46
+ next(err);
47
+ }
43
48
  });
44
49
  };
45
- export const DELETE = async (req, res) => {
50
+ export const DELETE = async (req, res, next) => {
46
51
  requirePermission("project:delete")(req, res, async () => {
47
- const projectService = req.scope.resolve("projectModuleService");
48
- await projectService.deleteProject(req.params.id);
49
- res.status(204).send();
52
+ try {
53
+ const projectService = req.scope.resolve("projectModuleService");
54
+ await projectService.deleteProject(req.params.id);
55
+ res.status(204).send();
56
+ }
57
+ catch (err) {
58
+ next(err);
59
+ }
50
60
  });
51
61
  };
52
62
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/projects/[id]/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/projects/[id]/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/[statusId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAUhD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAanD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/[statusId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAgBhD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAmBnD,CAAA"}
@@ -1,6 +1,16 @@
1
+ import { hasProjectAccess } from "../../../../../utils/project-access.js";
1
2
  export const PUT = async (req, res) => {
2
3
  const { name, color, category, metadata } = req.body;
3
4
  const svc = req.scope.resolve("projectModuleService");
5
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
6
+ if (!project) {
7
+ res.status(404).json({ error: { message: "Project not found" } });
8
+ return;
9
+ }
10
+ if (!await hasProjectAccess(req, project)) {
11
+ res.status(403).json({ error: { message: "Forbidden" } });
12
+ return;
13
+ }
4
14
  const payload = {};
5
15
  if (name !== undefined)
6
16
  payload.name = name;
@@ -16,6 +26,15 @@ export const PUT = async (req, res) => {
16
26
  export const DELETE = async (req, res) => {
17
27
  const svc = req.scope.resolve("projectModuleService");
18
28
  const issueSvc = req.scope.resolve("issueModuleService");
29
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
30
+ if (!project) {
31
+ res.status(404).json({ error: { message: "Project not found" } });
32
+ return;
33
+ }
34
+ if (!await hasProjectAccess(req, project)) {
35
+ res.status(403).json({ error: { message: "Forbidden" } });
36
+ return;
37
+ }
19
38
  const statuses = await svc.listStatusesByProject(req.params.id);
20
39
  const target = statuses.find((s) => s.id === req.params.statusId);
21
40
  if (!target) {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/[statusId]/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACpD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,OAAO,GAA4B,EAAE,CAAA;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;IAC9C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACvD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3E,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IAC/D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IACzF,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IAC/H,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,MAAM,KAAK,wBAAwB,EAAE,EAAE,CAAC,CAAA;QACrH,OAAM;IACR,CAAC;IACD,MAAM,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/[statusId]/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/reorder/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBASjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/reorder/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAejD,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { hasProjectAccess } from "../../../../../utils/project-access.js";
1
2
  export const POST = async (req, res) => {
2
3
  const { orderedIds } = req.body;
3
4
  if (!Array.isArray(orderedIds) || orderedIds.length === 0) {
@@ -5,6 +6,15 @@ export const POST = async (req, res) => {
5
6
  return;
6
7
  }
7
8
  const svc = req.scope.resolve("projectModuleService");
9
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
10
+ if (!project) {
11
+ res.status(404).json({ error: { message: "Project not found" } });
12
+ return;
13
+ }
14
+ if (!await hasProjectAccess(req, project)) {
15
+ res.status(403).json({ error: { message: "Forbidden" } });
16
+ return;
17
+ }
8
18
  await svc.reorderStatuses(req.params.id, orderedIds);
9
19
  res.status(204).send();
10
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/reorder/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,sCAAsC,EAAE,EAAE,CAAC,CAAA;QACpF,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/statuses/reorder/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAEzE,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,sCAAsC,EAAE,EAAE,CAAC,CAAA;QACpF,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3F,IAAI,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACzD,OAAM;IACR,CAAC;IACD,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/statuses/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAOvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAUhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAajD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/statuses/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAOvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAUhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAmBjD,CAAA"}
@@ -23,6 +23,15 @@ export const POST = async (req, res) => {
23
23
  return;
24
24
  }
25
25
  const svc = req.scope.resolve("projectModuleService");
26
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
27
+ if (!project) {
28
+ res.status(404).json({ error: { message: "Project not found" } });
29
+ return;
30
+ }
31
+ if (!await hasProjectAccess(req, project)) {
32
+ res.status(403).json({ error: { message: "Forbidden" } });
33
+ return;
34
+ }
26
35
  const existing = await svc.listStatusesByProject(req.params.id);
27
36
  const position = existing.length > 0 ? Math.max(...existing.map((s) => s.position)) + 1 : 0;
28
37
  const status = await svc.createProjectStatus({
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/statuses/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAEtE,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3F,IAAI,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACzD,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,wCAAwC,EAAE,EAAE,CAAC,CAAA;QACtF,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IAC5D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC;QAC3C,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ;KAC7E,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAClC,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/statuses/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/task-lists/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAIhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAQjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/task-lists/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAWhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAejD,CAAA"}
@@ -1,4 +1,15 @@
1
+ import { hasProjectAccess } from "../../../../utils/project-access.js";
1
2
  export const GET = async (req, res) => {
3
+ const projectService = req.scope.resolve("projectModuleService");
4
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
5
+ if (!project) {
6
+ res.status(404).json({ error: { message: "Project not found" } });
7
+ return;
8
+ }
9
+ if (!await hasProjectAccess(req, project)) {
10
+ res.status(403).json({ error: { message: "Forbidden" } });
11
+ return;
12
+ }
2
13
  const issueService = req.scope.resolve("issueModuleService");
3
14
  const taskLists = await issueService.listTaskListsByProject(req.params.id);
4
15
  res.json({ task_lists: taskLists, count: taskLists.length });
@@ -9,6 +20,16 @@ export const POST = async (req, res) => {
9
20
  res.status(400).json({ error: { message: "name is required" } });
10
21
  return;
11
22
  }
23
+ const projectService = req.scope.resolve("projectModuleService");
24
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
25
+ if (!project) {
26
+ res.status(404).json({ error: { message: "Project not found" } });
27
+ return;
28
+ }
29
+ if (!await hasProjectAccess(req, project)) {
30
+ res.status(403).json({ error: { message: "Forbidden" } });
31
+ return;
32
+ }
12
33
  const issueService = req.scope.resolve("issueModuleService");
13
34
  const taskList = await issueService.createTaskList({
14
35
  name: name.trim(), description: description?.trim() || undefined, project_id: req.params.id,
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/task-lists/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,SAAS,GAAG,MAAM,YAAY,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACtC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC/F,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC;QACjD,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;KAC5F,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC/C,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/task-lists/route.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import type { Response } from "express";
2
- export declare const DELETE: (req: any, res: Response) => Promise<void>;
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
3
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/teams/[teamId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAiBnD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/teams/[teamId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAqBvE,CAAA"}
@@ -1,17 +1,22 @@
1
1
  import { requirePermission } from "@meridianjs/auth";
2
- export const DELETE = async (req, res) => {
2
+ export const DELETE = async (req, res, next) => {
3
3
  requirePermission("project:manage_access")(req, res, async () => {
4
- const projectMemberService = req.scope.resolve("projectMemberModuleService");
5
- const projectService = req.scope.resolve("projectModuleService");
6
- const projectRef = req.params.id;
7
- const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
8
- (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
9
- if (!project) {
10
- res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
11
- return;
4
+ try {
5
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
6
+ const projectService = req.scope.resolve("projectModuleService");
7
+ const projectRef = req.params.id;
8
+ const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
9
+ (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
10
+ if (!project) {
11
+ res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
12
+ return;
13
+ }
14
+ await projectMemberService.removeProjectTeam(project.id, req.params.teamId);
15
+ res.status(204).send();
16
+ }
17
+ catch (err) {
18
+ next(err);
12
19
  }
13
- await projectMemberService.removeProjectTeam(project.id, req.params.teamId);
14
- res.status(204).send();
15
20
  });
16
21
  };
17
22
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/teams/[teamId]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACtD,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;QACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;QAEvE,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;QAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QAED,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/teams/[teamId]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IAC1E,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;YACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;YAEvE,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;YAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YACpF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;gBACjF,OAAM;YACR,CAAC;YAED,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1,3 +1,3 @@
1
- import type { Response } from "express";
2
- export declare const POST: (req: any, res: Response) => Promise<void>;
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
3
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/teams/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuBjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/teams/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBA2BrE,CAAA"}
@@ -1,22 +1,27 @@
1
1
  import { requirePermission } from "@meridianjs/auth";
2
- export const POST = async (req, res) => {
2
+ export const POST = async (req, res, next) => {
3
3
  requirePermission("project:manage_access")(req, res, async () => {
4
- const projectMemberService = req.scope.resolve("projectMemberModuleService");
5
- const projectService = req.scope.resolve("projectModuleService");
6
- const { team_id } = req.body;
7
- if (!team_id) {
8
- res.status(400).json({ error: { message: "team_id is required" } });
9
- return;
4
+ try {
5
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
6
+ const projectService = req.scope.resolve("projectModuleService");
7
+ const { team_id } = req.body;
8
+ if (!team_id) {
9
+ res.status(400).json({ error: { message: "team_id is required" } });
10
+ return;
11
+ }
12
+ const projectRef = req.params.id;
13
+ const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
14
+ (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
15
+ if (!project) {
16
+ res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
17
+ return;
18
+ }
19
+ await projectMemberService.ensureProjectTeam(project.id, team_id);
20
+ res.status(201).json({ ok: true });
10
21
  }
11
- const projectRef = req.params.id;
12
- const project = (await projectService.retrieveProject(projectRef).catch(() => null)) ??
13
- (await projectService.retrieveProjectByIdentifier?.(projectRef).catch(() => null));
14
- if (!project) {
15
- res.status(404).json({ error: { message: `Project "${projectRef}" not found` } });
16
- return;
22
+ catch (err) {
23
+ next(err);
17
24
  }
18
- await projectMemberService.ensureProjectTeam(project.id, team_id);
19
- res.status(201).json({ ok: true });
20
25
  });
21
26
  };
22
27
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/teams/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;QACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;QACvE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;QAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;YACnE,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;QAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QAED,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/teams/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACxE,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAQ,CAAA;YACnF,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;YACvE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;YAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;YAChC,MAAM,OAAO,GACX,CAAC,MAAM,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC,MAAM,cAAc,CAAC,2BAA2B,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YACpF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,UAAU,aAAa,EAAE,EAAE,CAAC,CAAA;gBACjF,OAAM;YACR,CAAC;YAED,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Response } from "express";
1
+ import type { Response, NextFunction } from "express";
2
2
  export declare const GET: (req: any, res: Response) => Promise<void>;
3
- export declare const POST: (req: any, res: Response) => Promise<void>;
3
+ export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
4
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/projects/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAgDhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA4BjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/projects/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAIrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAgDhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAgCrE,CAAA"}
@@ -44,33 +44,38 @@ export const GET = async (req, res) => {
44
44
  const [projects, count] = await projectService.listAndCountProjects(memberFilters, { limit, offset });
45
45
  res.json({ projects, count, limit, offset });
46
46
  };
47
- export const POST = async (req, res) => {
47
+ export const POST = async (req, res, next) => {
48
48
  requirePermission("project:create")(req, res, async () => {
49
- const projectMemberService = req.scope.resolve("projectMemberModuleService");
50
- const { name, description, workspace_id, visibility, icon, color, identifier, initial_statuses, metadata } = req.body;
51
- if (!name || !workspace_id) {
52
- res.status(400).json({ error: { message: "name and workspace_id are required" } });
53
- return;
54
- }
55
- const { result: project, errors, transaction_status } = await createProjectWorkflow(req.scope).run({
56
- input: {
57
- name, identifier, description: description ?? null, workspace_id,
58
- visibility: visibility ?? "private", icon: icon ?? null, color: color ?? null,
59
- owner_id: req.user?.id ?? null, actor_id: req.user?.id ?? null,
60
- initial_statuses: initial_statuses ?? undefined,
61
- metadata: metadata ?? null,
62
- },
63
- });
64
- if (transaction_status === "reverted") {
65
- const err = errors[0];
66
- res.status(err.status ?? 500).json({ error: { message: err.message } });
67
- return;
49
+ try {
50
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
51
+ const { name, description, workspace_id, visibility, icon, color, identifier, initial_statuses, metadata } = req.body;
52
+ if (!name || !workspace_id) {
53
+ res.status(400).json({ error: { message: "name and workspace_id are required" } });
54
+ return;
55
+ }
56
+ const { result: project, errors, transaction_status } = await createProjectWorkflow(req.scope).run({
57
+ input: {
58
+ name, identifier, description: description ?? null, workspace_id,
59
+ visibility: visibility ?? "private", icon: icon ?? null, color: color ?? null,
60
+ owner_id: req.user?.id ?? null, actor_id: req.user?.id ?? null,
61
+ initial_statuses: initial_statuses ?? undefined,
62
+ metadata: metadata ?? null,
63
+ },
64
+ });
65
+ if (transaction_status === "reverted") {
66
+ const err = errors[0];
67
+ res.status(err.status ?? 500).json({ error: { message: err.message } });
68
+ return;
69
+ }
70
+ // Auto-create project membership for the creator (manager role)
71
+ if (req.user?.id && project) {
72
+ await projectMemberService.ensureProjectMember(project.id, req.user.id, "manager");
73
+ }
74
+ res.status(201).json({ project });
68
75
  }
69
- // Auto-create project membership for the creator (manager role)
70
- if (req.user?.id && project) {
71
- await projectMemberService.ensureProjectMember(project.id, req.user.id, "manager");
76
+ catch (err) {
77
+ next(err);
72
78
  }
73
- res.status(201).json({ project });
74
79
  });
75
80
  };
76
81
  //# sourceMappingURL=route.js.map