@meridianjs/meridian 0.1.25 → 0.1.26

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 (33) hide show
  1. package/dist/api/admin/projects/[id]/activities/route.d.ts +3 -0
  2. package/dist/api/admin/projects/[id]/activities/route.d.ts.map +1 -0
  3. package/dist/api/admin/projects/[id]/activities/route.js +18 -0
  4. package/dist/api/admin/projects/[id]/activities/route.js.map +1 -0
  5. package/dist/api/admin/projects/[id]/members/[userId]/route.d.ts.map +1 -1
  6. package/dist/api/admin/projects/[id]/members/[userId]/route.js +7 -0
  7. package/dist/api/admin/projects/[id]/members/[userId]/route.js.map +1 -1
  8. package/dist/api/admin/projects/[id]/members/route.d.ts.map +1 -1
  9. package/dist/api/admin/projects/[id]/members/route.js +7 -0
  10. package/dist/api/admin/projects/[id]/members/route.js.map +1 -1
  11. package/dist/api/admin/projects/[id]/share/route.d.ts +4 -0
  12. package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -0
  13. package/dist/api/admin/projects/[id]/share/route.js +58 -0
  14. package/dist/api/admin/projects/[id]/share/route.js.map +1 -0
  15. package/dist/api/admin/projects/[id]/teams/[teamId]/route.d.ts.map +1 -1
  16. package/dist/api/admin/projects/[id]/teams/[teamId]/route.js +7 -0
  17. package/dist/api/admin/projects/[id]/teams/[teamId]/route.js.map +1 -1
  18. package/dist/api/admin/projects/[id]/teams/route.d.ts.map +1 -1
  19. package/dist/api/admin/projects/[id]/teams/route.js +7 -0
  20. package/dist/api/admin/projects/[id]/teams/route.js.map +1 -1
  21. package/dist/api/public/share/[token]/issues/route.d.ts +3 -0
  22. package/dist/api/public/share/[token]/issues/route.d.ts.map +1 -0
  23. package/dist/api/public/share/[token]/issues/route.js +40 -0
  24. package/dist/api/public/share/[token]/issues/route.js.map +1 -0
  25. package/dist/api/public/share/[token]/route.d.ts +3 -0
  26. package/dist/api/public/share/[token]/route.d.ts.map +1 -0
  27. package/dist/api/public/share/[token]/route.js +21 -0
  28. package/dist/api/public/share/[token]/route.js.map +1 -0
  29. package/dist/api/public/share/[token]/sprints/route.d.ts +3 -0
  30. package/dist/api/public/share/[token]/sprints/route.d.ts.map +1 -0
  31. package/dist/api/public/share/[token]/sprints/route.js +12 -0
  32. package/dist/api/public/share/[token]/sprints/route.js.map +1 -0
  33. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import type { Response } from "express";
2
+ export declare const GET: (req: any, res: Response) => Promise<void>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/activities/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAchD,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { hasProjectAccess } from "../../../../utils/project-access.js";
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
+ }
13
+ const activityService = req.scope.resolve("activityModuleService");
14
+ const activities = await activityService.listActivityForEntity("project", req.params.id);
15
+ activities.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
16
+ res.json({ activities });
17
+ };
18
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/activities/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAEtE,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACrF,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;IAE3F,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;IAED,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;IACzE,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,qBAAqB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxF,UAAU,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IACxG,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;AAC1B,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/members/[userId]/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
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/members/[userId]/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,kBA8BvE,CAAA"}
@@ -12,6 +12,13 @@ export const DELETE = async (req, res, next) => {
12
12
  return;
13
13
  }
14
14
  await projectMemberService.removeProjectMember(project.id, req.params.userId);
15
+ const activityService = req.scope.resolve("activityModuleService");
16
+ activityService.recordActivity({
17
+ entity_type: "project", entity_id: project.id,
18
+ actor_id: req.user?.id ?? "system", action: "member_removed",
19
+ workspace_id: project.workspace_id,
20
+ changes: { user_id: { from: req.params.userId, to: null } },
21
+ }).catch(() => { });
15
22
  res.status(204).send();
16
23
  }
17
24
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/members/[userId]/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,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC7E,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
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/members/[userId]/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,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE7E,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;YACzE,eAAe,CAAC,cAAc,CAAC;gBAC7B,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC7C,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,EAAE,gBAAgB;gBAC5D,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;aAC5D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAElB,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 +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,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAwCrE,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,kBAgDrE,CAAA"}
@@ -28,6 +28,13 @@ export const POST = async (req, res, next) => {
28
28
  actor_id: req.user?.id ?? "system",
29
29
  },
30
30
  }).catch(() => { });
31
+ const activityService = req.scope.resolve("activityModuleService");
32
+ activityService.recordActivity({
33
+ entity_type: "project", entity_id: project.id,
34
+ actor_id: req.user?.id ?? "system", action: "member_added",
35
+ workspace_id: project.workspace_id,
36
+ changes: { user_id: { from: null, to: user_id }, role: { from: null, to: role ?? "member" } },
37
+ }).catch(() => { });
31
38
  res.status(201).json({ ok: true });
32
39
  }
33
40
  catch (err) {
@@ -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,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
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/members/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Response } from "express";
2
+ export declare const POST: (req: any, res: Response) => Promise<void>;
3
+ export declare const DELETE: (req: any, res: Response) => 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]/share/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAkBvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuBjD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAoBnD,CAAA"}
@@ -0,0 +1,58 @@
1
+ /** Check if the caller is allowed to manage share settings for this project. */
2
+ async function canManageShare(req, project) {
3
+ const roles = req.user?.roles ?? [];
4
+ if (roles.includes("super-admin") || roles.includes("admin"))
5
+ return true;
6
+ const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
7
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
8
+ const userId = req.user?.id;
9
+ const membership = await workspaceMemberService.getMembership(project.workspace_id, userId).catch(() => null);
10
+ if (membership?.role === "admin")
11
+ return true;
12
+ const members = await projectMemberService.listProjectMembers(project.id);
13
+ return members.some((m) => m.user_id === userId && m.role === "manager");
14
+ }
15
+ export const POST = async (req, res) => {
16
+ const projectService = req.scope.resolve("projectModuleService");
17
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
18
+ if (!project) {
19
+ res.status(404).json({ error: { message: "Project not found" } });
20
+ return;
21
+ }
22
+ if (!await canManageShare(req, project)) {
23
+ res.status(403).json({ error: { message: "Forbidden" } });
24
+ return;
25
+ }
26
+ const updated = await projectService.generateShareToken(req.params.id);
27
+ const origin = `${req.protocol}://${req.get("host")}`;
28
+ const shareUrl = `${origin}/share/${updated.share_token}`;
29
+ const activityService = req.scope.resolve("activityModuleService");
30
+ activityService.recordActivity({
31
+ entity_type: "project", entity_id: req.params.id,
32
+ actor_id: req.user?.id ?? "system", action: "share_enabled",
33
+ workspace_id: project.workspace_id,
34
+ changes: { share_url: { from: null, to: shareUrl } },
35
+ }).catch(() => { });
36
+ res.json({ share_url: shareUrl, project: updated });
37
+ };
38
+ export const DELETE = async (req, res) => {
39
+ const projectService = req.scope.resolve("projectModuleService");
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
+ if (!await canManageShare(req, project)) {
46
+ res.status(403).json({ error: { message: "Forbidden" } });
47
+ return;
48
+ }
49
+ const updated = await projectService.revokeShareToken(req.params.id);
50
+ const activityService = req.scope.resolve("activityModuleService");
51
+ activityService.recordActivity({
52
+ entity_type: "project", entity_id: req.params.id,
53
+ actor_id: req.user?.id ?? "system", action: "share_revoked",
54
+ workspace_id: project.workspace_id,
55
+ }).catch(() => { });
56
+ res.json({ project: updated });
57
+ };
58
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/share/route.ts"],"names":[],"mappings":"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"}
@@ -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,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAqBvE,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,kBA8BvE,CAAA"}
@@ -12,6 +12,13 @@ export const DELETE = async (req, res, next) => {
12
12
  return;
13
13
  }
14
14
  await projectMemberService.removeProjectTeam(project.id, req.params.teamId);
15
+ const activityService = req.scope.resolve("activityModuleService");
16
+ activityService.recordActivity({
17
+ entity_type: "project", entity_id: project.id,
18
+ actor_id: req.user?.id ?? "system", action: "team_removed",
19
+ workspace_id: project.workspace_id,
20
+ changes: { team_id: { from: req.params.teamId, to: null } },
21
+ }).catch(() => { });
15
22
  res.status(204).send();
16
23
  }
17
24
  catch (err) {
@@ -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,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
+ {"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;YAE3E,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;YACzE,eAAe,CAAC,cAAc,CAAC;gBAC7B,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC7C,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,EAAE,cAAc;gBAC1D,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;aAC5D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAElB,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 +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,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBA2BrE,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,kBAoCrE,CAAA"}
@@ -17,6 +17,13 @@ export const POST = async (req, res, next) => {
17
17
  return;
18
18
  }
19
19
  await projectMemberService.ensureProjectTeam(project.id, team_id);
20
+ const activityService = req.scope.resolve("activityModuleService");
21
+ activityService.recordActivity({
22
+ entity_type: "project", entity_id: project.id,
23
+ actor_id: req.user?.id ?? "system", action: "team_added",
24
+ workspace_id: project.workspace_id,
25
+ changes: { team_id: { from: null, to: team_id } },
26
+ }).catch(() => { });
20
27
  res.status(201).json({ ok: true });
21
28
  }
22
29
  catch (err) {
@@ -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,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
+ {"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;YAEjE,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;YACzE,eAAe,CAAC,cAAc,CAAC;gBAC7B,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC7C,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,EAAE,YAAY;gBACxD,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;aAClD,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"}
@@ -0,0 +1,3 @@
1
+ import type { Response } from "express";
2
+ export declare const GET: (req: any, res: Response) => Promise<void>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/public/share/[token]/issues/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA8ChD,CAAA"}
@@ -0,0 +1,40 @@
1
+ export const GET = async (req, res) => {
2
+ const projectService = req.scope.resolve("projectModuleService");
3
+ const issueService = req.scope.resolve("issueModuleService");
4
+ const userService = req.scope.resolve("userModuleService");
5
+ const project = await projectService.retrieveProjectByShareToken(req.params.token);
6
+ if (!project) {
7
+ res.status(404).json({ error: { message: "Share link not found or expired" } });
8
+ return;
9
+ }
10
+ const filters = { project_id: project.id };
11
+ if (req.query.status)
12
+ filters.status = req.query.status;
13
+ if (req.query.priority)
14
+ filters.priority = req.query.priority;
15
+ const limit = Math.min(Number(req.query.limit) || 100, 200);
16
+ const offset = Number(req.query.offset) || 0;
17
+ let [issues] = await issueService.listAndCountIssues(filters, { limit, offset, orderBy: { created_at: "ASC" } });
18
+ // Apply search filter in-memory (simple title match)
19
+ if (req.query.search) {
20
+ const q = req.query.search.toLowerCase();
21
+ issues = issues.filter((i) => i.title?.toLowerCase().includes(q));
22
+ }
23
+ // Strip sensitive data from assignees — return only { id, name, initials }
24
+ const sanitized = await Promise.all(issues.map(async (issue) => {
25
+ const assignees = await Promise.all((issue.assignee_ids ?? []).map(async (uid) => {
26
+ try {
27
+ const u = await userService.retrieveUser(uid);
28
+ const name = [u.first_name, u.last_name].filter(Boolean).join(" ");
29
+ const initials = [u.first_name?.[0], u.last_name?.[0]].filter(Boolean).join("").toUpperCase() || "?";
30
+ return { id: u.id, name, initials };
31
+ }
32
+ catch {
33
+ return { id: uid, name: "Unknown", initials: "?" };
34
+ }
35
+ }));
36
+ return { ...issue, assignees };
37
+ }));
38
+ res.json({ issues: sanitized, count: sanitized.length });
39
+ };
40
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/public/share/[token]/issues/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Response } from "express";
2
+ export declare const GET: (req: any, res: Response) => Promise<void>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/public/share/[token]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAqBhD,CAAA"}
@@ -0,0 +1,21 @@
1
+ export const GET = async (req, res) => {
2
+ const projectService = req.scope.resolve("projectModuleService");
3
+ const project = await projectService.retrieveProjectByShareToken(req.params.token);
4
+ if (!project) {
5
+ res.status(404).json({ error: { message: "Share link not found or expired" } });
6
+ return;
7
+ }
8
+ const statuses = await projectService.listStatusesByProject(project.id);
9
+ res.json({
10
+ project: {
11
+ id: project.id,
12
+ name: project.name,
13
+ identifier: project.identifier,
14
+ description: project.description,
15
+ icon: project.icon,
16
+ color: project.color,
17
+ statuses,
18
+ },
19
+ });
20
+ };
21
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/public/share/[token]/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,CAAC,CAAA;QAC/E,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEvE,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE;YACP,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ;SACT;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Response } from "express";
2
+ export declare const GET: (req: any, res: Response) => Promise<void>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/public/share/[token]/sprints/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAYhD,CAAA"}
@@ -0,0 +1,12 @@
1
+ export const GET = async (req, res) => {
2
+ const projectService = req.scope.resolve("projectModuleService");
3
+ const sprintService = req.scope.resolve("sprintModuleService");
4
+ const project = await projectService.retrieveProjectByShareToken(req.params.token);
5
+ if (!project) {
6
+ res.status(404).json({ error: { message: "Share link not found or expired" } });
7
+ return;
8
+ }
9
+ const [sprints] = await sprintService.listAndCountSprints({ project_id: project.id });
10
+ res.json({ sprints });
11
+ };
12
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/public/share/[token]/sprints/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;IACvE,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAQ,CAAA;IAErE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,CAAC,CAAA;QAC/E,OAAM;IACR,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,aAAa,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IACrF,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AACvB,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridianjs/meridian",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "Default API routes, workflows, links, and subscribers for Meridian applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",