@meridianjs/meridian 0.1.24 → 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 (52) 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/dist/subscribers/_email-helper.d.ts +2 -0
  34. package/dist/subscribers/_email-helper.d.ts.map +1 -1
  35. package/dist/subscribers/_email-helper.js +9 -0
  36. package/dist/subscribers/_email-helper.js.map +1 -1
  37. package/dist/subscribers/comment-created.d.ts.map +1 -1
  38. package/dist/subscribers/comment-created.js +5 -4
  39. package/dist/subscribers/comment-created.js.map +1 -1
  40. package/dist/subscribers/issue-assigned.d.ts.map +1 -1
  41. package/dist/subscribers/issue-assigned.js +5 -4
  42. package/dist/subscribers/issue-assigned.js.map +1 -1
  43. package/dist/subscribers/issue-created.d.ts.map +1 -1
  44. package/dist/subscribers/issue-created.js +6 -5
  45. package/dist/subscribers/issue-created.js.map +1 -1
  46. package/dist/subscribers/project-member-added.d.ts.map +1 -1
  47. package/dist/subscribers/project-member-added.js +5 -4
  48. package/dist/subscribers/project-member-added.js.map +1 -1
  49. package/dist/subscribers/workspace-member-invited.d.ts.map +1 -1
  50. package/dist/subscribers/workspace-member-invited.js +10 -4
  51. package/dist/subscribers/workspace-member-invited.js.map +1 -1
  52. 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"}
@@ -1,2 +1,4 @@
1
+ import type { EmailTemplateOverride } from "@meridianjs/types";
1
2
  export declare function emailHtml(message: string): string;
3
+ export declare function resolveTemplate(container: any, event: string, data: unknown): EmailTemplateOverride | null;
2
4
  //# sourceMappingURL=_email-helper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_email-helper.d.ts","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD"}
1
+ {"version":3,"file":"_email-helper.d.ts","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAErF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,GAAG,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,qBAAqB,GAAG,IAAI,CAO9B"}
@@ -5,4 +5,13 @@ export function emailHtml(message) {
5
5
  <p style="font-size:12px;color:#6b7280">Sent by Meridian</p>
6
6
  </div>`;
7
7
  }
8
+ export function resolveTemplate(container, event, data) {
9
+ try {
10
+ const svc = container.resolve("emailTemplateService");
11
+ return svc.render(event, data) ?? null;
12
+ }
13
+ catch {
14
+ return null; // no emailTemplateService registered → use defaults
15
+ }
16
+ }
8
17
  //# sourceMappingURL=_email-helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_email-helper.js","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;SACA,OAAO;;;SAGP,CAAA;AACT,CAAC"}
1
+ {"version":3,"file":"_email-helper.js","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;SACA,OAAO;;;SAGP,CAAA;AACT,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAc,EACd,KAAa,EACb,IAAa;IAEb,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAA0B,CAAA;QAC9E,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA,CAAC,oDAAoD;IAClE,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD7G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA+C,CAAA"}
1
+ {"version":3,"file":"comment-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA+C,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
- import { emailHtml } from "./_email-helper.js";
2
+ import { emailHtml, resolveTemplate } from "./_email-helper.js";
3
3
  export default async function handler({ event, container }) {
4
4
  const data = event.data;
5
5
  const issueService = container.resolve("issueModuleService");
@@ -34,11 +34,12 @@ export default async function handler({ event, container }) {
34
34
  const user = await userService.retrieveUser(userId);
35
35
  if (!user?.email)
36
36
  return;
37
+ const tpl = resolveTemplate(container, "comment.created", { issue, user });
37
38
  await emailService.send({
38
39
  to: user.email,
39
- subject: `New comment on [${issue.identifier}]: ${issue.title}`,
40
- text: `A comment was added on issue ${issue.identifier}: "${issue.title}" that you're involved with.`,
41
- html: emailHtml(`A comment was added on issue <strong>${issue.identifier}</strong>: "${issue.title}" that you're involved with.`),
40
+ subject: tpl?.subject ?? `New comment on [${issue.identifier}]: ${issue.title}`,
41
+ text: tpl?.text ?? `A comment was added on issue ${issue.identifier}: "${issue.title}" that you're involved with.`,
42
+ html: tpl?.html ?? emailHtml(`A comment was added on issue <strong>${issue.identifier}</strong>: "${issue.title}" that you're involved with.`),
42
43
  });
43
44
  }));
44
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAQ9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAsC;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,IAAI,KAAU,CAAA;IACd,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,KAAK,CAAC,YAAY;QAAE,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACtF,IAAI,KAAK,CAAC,WAAW;QAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACxD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAEjC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC7C,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,oDAAoD;QAClF,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CACH,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,EAAE;QAC1D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAElE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;gBAAE,OAAM;YACxB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,mBAAmB,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,EAAE;gBAC/D,IAAI,EAAE,gCAAgC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,8BAA8B;gBACrG,IAAI,EAAE,SAAS,CAAC,wCAAwC,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,KAAK,8BAA8B,CAAC;aAClI,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"issue-assigned.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
1
+ {"version":3,"file":"issue-assigned.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
- import { emailHtml } from "./_email-helper.js";
2
+ import { emailHtml, resolveTemplate } from "./_email-helper.js";
3
3
  export default async function handler({ event, container }) {
4
4
  const data = event.data;
5
5
  if (!data.assignee_ids?.length)
@@ -29,11 +29,12 @@ export default async function handler({ event, container }) {
29
29
  const user = await userService.retrieveUser(userId);
30
30
  if (!user?.email)
31
31
  return;
32
+ const tpl = resolveTemplate(container, "issue.assigned", { issue, user });
32
33
  await emailService.send({
33
34
  to: user.email,
34
- subject: `[${issue.identifier}] You've been assigned: ${issue.title}`,
35
- text: `You've been assigned to issue ${issue.identifier}: "${issue.title}".`,
36
- html: emailHtml(`You've been assigned to <strong>${issue.identifier}</strong>: "${issue.title}".`),
35
+ subject: tpl?.subject ?? `[${issue.identifier}] You've been assigned: ${issue.title}`,
36
+ text: tpl?.text ?? `You've been assigned to issue ${issue.identifier}: "${issue.title}".`,
37
+ html: tpl?.html ?? emailHtml(`You've been assigned to <strong>${issue.identifier}</strong>: "${issue.title}".`),
37
38
  });
38
39
  }));
39
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAqC;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM;QAAE,OAAM;IAEtC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,YAAY;SACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,MAAM,CAAC,EAAE,CACZ,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,+BAA+B;QAC5D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CACH,CACJ,CAAA;IAED,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7D,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,YAAY;aACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;aAClC,GAAG,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;gBAAE,OAAM;YACxB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,IAAI,KAAK,CAAC,UAAU,2BAA2B,KAAK,CAAC,KAAK,EAAE;gBACrE,IAAI,EAAE,iCAAiC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,IAAI;gBAC5E,IAAI,EAAE,SAAS,CAAC,mCAAmC,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,KAAK,IAAI,CAAC;aACnG,CAAC,CAAA;QACJ,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAU/D,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAqC;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM;QAAE,OAAM;IAEtC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,YAAY;SACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,MAAM,CAAC,EAAE,CACZ,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,+BAA+B;QAC5D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CACH,CACJ,CAAA;IAED,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7D,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,YAAY;aACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;aAClC,GAAG,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;gBAAE,OAAM;YACxB,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACzE,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI,KAAK,CAAC,UAAU,2BAA2B,KAAK,CAAC,KAAK,EAAE;gBACrF,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,iCAAiC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,IAAI;gBACzF,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,SAAS,CAAC,mCAAmC,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,KAAK,IAAI,CAAC;aAChH,CAAC,CAAA;QACJ,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"issue-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
1
+ {"version":3,"file":"issue-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
- import { emailHtml } from "./_email-helper.js";
2
+ import { emailHtml, resolveTemplate } from "./_email-helper.js";
3
3
  export default async function handler({ event, container }) {
4
4
  const notifService = container.resolve("notificationModuleService");
5
5
  const data = event.data;
@@ -35,13 +35,14 @@ export default async function handler({ event, container }) {
35
35
  if (!user?.email)
36
36
  return;
37
37
  const isAssignee = data.assignee_ids?.includes(userId);
38
+ const tpl = resolveTemplate(container, "issue.created", { issue, user, isAssignee: !!isAssignee });
38
39
  await emailService.send({
39
40
  to: user.email,
40
- subject: `New issue: [${issue.identifier}] ${issue.title}`,
41
- text: isAssignee
41
+ subject: tpl?.subject ?? `New issue: [${issue.identifier}] ${issue.title}`,
42
+ text: tpl?.text ?? (isAssignee
42
43
  ? `You've been assigned to new issue ${issue.identifier}: "${issue.title}".`
43
- : `A new issue ${issue.identifier} was created: "${issue.title}".`,
44
- html: emailHtml(isAssignee
44
+ : `A new issue ${issue.identifier} was created: "${issue.title}".`),
45
+ html: tpl?.html ?? emailHtml(isAssignee
45
46
  ? `You've been assigned to new issue <strong>${issue.identifier}</strong>: "${issue.title}".`
46
47
  : `A new issue <strong>${issue.identifier}</strong> was created: "${issue.title}".`),
47
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-member-added.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAoD,CAAA"}
1
+ {"version":3,"file":"project-member-added.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCjH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAoD,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
- import { emailHtml } from "./_email-helper.js";
2
+ import { emailHtml, resolveTemplate } from "./_email-helper.js";
3
3
  export default async function handler({ event, container }) {
4
4
  const data = event.data;
5
5
  if (!data.user_id || data.user_id === data.actor_id)
@@ -24,11 +24,12 @@ export default async function handler({ event, container }) {
24
24
  const userService = container.resolve("userModuleService");
25
25
  const user = await userService.retrieveUser(data.user_id);
26
26
  if (user?.email) {
27
+ const tpl = resolveTemplate(container, "project.member_added", { project: { name: data.project_name }, user });
27
28
  await emailService.send({
28
29
  to: user.email,
29
- subject: `You've been added to project "${data.project_name}"`,
30
- text: `You've been added to the project "${data.project_name}".`,
31
- html: emailHtml(`You've been added to the project <strong>"${data.project_name}"</strong>.`),
30
+ subject: tpl?.subject ?? `You've been added to project "${data.project_name}"`,
31
+ text: tpl?.text ?? `You've been added to the project "${data.project_name}".`,
32
+ html: tpl?.html ?? emailHtml(`You've been added to the project <strong>"${data.project_name}"</strong>.`),
32
33
  });
33
34
  }
34
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project-member-added.js","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA0C;IAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAM;IAE3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,YAAY,CAAC,kBAAkB,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,kCAAkC,IAAI,CAAC,YAAY,GAAG;QAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE;QAC9D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,iCAAiC,IAAI,CAAC,YAAY,GAAG;gBAC9D,IAAI,EAAE,qCAAqC,IAAI,CAAC,YAAY,IAAI;gBAChE,IAAI,EAAE,SAAS,CAAC,6CAA6C,IAAI,CAAC,YAAY,aAAa,CAAC;aAC7F,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA"}
1
+ {"version":3,"file":"project-member-added.js","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAU/D,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA0C;IAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAM;IAE3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,YAAY,CAAC,kBAAkB,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,kCAAkC,IAAI,CAAC,YAAY,GAAG;QAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE;QAC9D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,sBAAsB,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9G,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,iCAAiC,IAAI,CAAC,YAAY,GAAG;gBAC9E,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,qCAAqC,IAAI,CAAC,YAAY,IAAI;gBAC7E,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,SAAS,CAAC,6CAA6C,IAAI,CAAC,YAAY,aAAa,CAAC;aAC1G,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-member-invited.d.ts","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,0BAA0B;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAwD,CAAA"}
1
+ {"version":3,"file":"workspace-member-invited.d.ts","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,0BAA0B;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDrH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAwD,CAAA"}
@@ -1,4 +1,4 @@
1
- import { emailHtml } from "./_email-helper.js";
1
+ import { emailHtml, resolveTemplate } from "./_email-helper.js";
2
2
  export default async function handler({ event, container }) {
3
3
  const data = event.data;
4
4
  if (!data.email)
@@ -28,11 +28,17 @@ export default async function handler({ event, container }) {
28
28
  const inviterName = [inviter.first_name, inviter.last_name].filter(Boolean).join(" ") || inviter.email;
29
29
  const appUrl = process.env.APP_URL ?? "http://localhost:9000";
30
30
  const inviteLink = `${appUrl}/invite/${invitation.token}`;
31
+ const tpl = resolveTemplate(container, "workspace.member_invited", {
32
+ workspace: { name: workspace.name },
33
+ inviter: { name: inviterName },
34
+ invitation: { token: invitation.token, role: roleDisplay },
35
+ invitee: { email: data.email },
36
+ });
31
37
  await emailService.send({
32
38
  to: data.email,
33
- subject: `${inviterName} invited you to join "${workspace.name}" on Meridian`,
34
- text: `${inviterName} has invited you to join "${workspace.name}" as a ${roleDisplay}.\n\nAccept your invitation here: ${inviteLink}`,
35
- html: emailHtml(`<strong>${inviterName}</strong> has invited you to join <strong>${workspace.name}</strong> as a <strong>${roleDisplay}</strong>.<br/><br/>` +
39
+ subject: tpl?.subject ?? `${inviterName} invited you to join "${workspace.name}" on Meridian`,
40
+ text: tpl?.text ?? `${inviterName} has invited you to join "${workspace.name}" as a ${roleDisplay}.\n\nAccept your invitation here: ${inviteLink}`,
41
+ html: tpl?.html ?? emailHtml(`<strong>${inviterName}</strong> has invited you to join <strong>${workspace.name}</strong> as a <strong>${roleDisplay}</strong>.<br/><br/>` +
36
42
  `<a href="${inviteLink}" style="display:inline-block;padding:10px 20px;background:#4f46e5;color:#fff;text-decoration:none;border-radius:6px;font-weight:600">Accept Invitation</a><br/><br/>` +
37
43
  `Or copy this link: <a href="${inviteLink}">${inviteLink}</a>`),
38
44
  });
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-member-invited.js","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA8C;IACpG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAM,CAAC,2CAA2C;IAEnE,IAAI,CAAC;QACH,MAAM,YAAY,GAAI,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAQ,CAAA;QACzE,MAAM,YAAY,GAAI,SAAS,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;QACxE,MAAM,OAAO,GAAS,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAEnE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzD,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;YACpD,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC;YACjD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;SACtC,CAAC,CAAA;QAEF,oFAAoF;QACpF,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAA;QAC3B,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;gBACnE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;gBACxE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAA;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAA;QAEtG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAA;QAC7D,MAAM,UAAU,GAAG,GAAG,MAAM,WAAW,UAAU,CAAC,KAAK,EAAE,CAAA;QAEzD,MAAM,YAAY,CAAC,IAAI,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC,KAAK;YACd,OAAO,EAAE,GAAG,WAAW,yBAAyB,SAAS,CAAC,IAAI,eAAe;YAC7E,IAAI,EAAE,GAAG,WAAW,6BAA6B,SAAS,CAAC,IAAI,UAAU,WAAW,qCAAqC,UAAU,EAAE;YACrI,IAAI,EAAE,SAAS,CACb,WAAW,WAAW,6CAA6C,SAAS,CAAC,IAAI,0BAA0B,WAAW,sBAAsB;gBAC5I,YAAY,UAAU,uKAAuK;gBAC7L,+BAA+B,UAAU,KAAK,UAAU,MAAM,CAC/D;SACF,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAA;IACzD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAA"}
1
+ {"version":3,"file":"workspace-member-invited.js","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridianjs/meridian",
3
- "version": "0.1.24",
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",