@meridianjs/meridian 1.30.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/api/admin/events/route.d.ts.map +1 -1
  2. package/dist/api/admin/events/route.js +15 -8
  3. package/dist/api/admin/events/route.js.map +1 -1
  4. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -1
  5. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +34 -31
  6. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
  7. package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -1
  8. package/dist/api/admin/issues/[id]/attachments/route.js +25 -22
  9. package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -1
  10. package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
  11. package/dist/api/admin/issues/[id]/comments/route.js +20 -17
  12. package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
  13. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
  14. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +63 -60
  15. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
  16. package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -1
  17. package/dist/api/admin/issues/[id]/time-logs/route.js +20 -17
  18. package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -1
  19. package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -1
  20. package/dist/api/admin/issues/[id]/time-logs/timer/route.js +27 -24
  21. package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -1
  22. package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
  23. package/dist/api/admin/projects/[id]/access/route.js +15 -2
  24. package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
  25. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts +4 -0
  26. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts.map +1 -0
  27. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js +116 -0
  28. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js.map +1 -0
  29. package/dist/api/admin/projects/[id]/access-requests/route.d.ts +5 -0
  30. package/dist/api/admin/projects/[id]/access-requests/route.d.ts.map +1 -0
  31. package/dist/api/admin/projects/[id]/access-requests/route.js +153 -0
  32. package/dist/api/admin/projects/[id]/access-requests/route.js.map +1 -0
  33. package/dist/api/admin/projects/[id]/health/[updateId]/route.d.ts.map +1 -1
  34. package/dist/api/admin/projects/[id]/health/[updateId]/route.js +78 -73
  35. package/dist/api/admin/projects/[id]/health/[updateId]/route.js.map +1 -1
  36. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.d.ts.map +1 -1
  37. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js +68 -65
  38. package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js.map +1 -1
  39. package/dist/api/admin/projects/[id]/health/route.d.ts.map +1 -1
  40. package/dist/api/admin/projects/[id]/health/route.js +33 -30
  41. package/dist/api/admin/projects/[id]/health/route.js.map +1 -1
  42. package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -1
  43. package/dist/api/admin/projects/[id]/share/route.js +44 -39
  44. package/dist/api/admin/projects/[id]/share/route.js.map +1 -1
  45. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -1
  46. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +77 -72
  47. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -1
  48. package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -1
  49. package/dist/api/admin/projects/[id]/statuses/reorder/route.js +20 -17
  50. package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -1
  51. package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -1
  52. package/dist/api/admin/projects/[id]/statuses/route.js +23 -20
  53. package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
  54. package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -1
  55. package/dist/api/admin/projects/[id]/task-lists/route.js +22 -19
  56. package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -1
  57. package/dist/api/admin/projects/route.d.ts.map +1 -1
  58. package/dist/api/admin/projects/route.js +55 -22
  59. package/dist/api/admin/projects/route.js.map +1 -1
  60. package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -1
  61. package/dist/api/admin/task-lists/[id]/route.js +44 -39
  62. package/dist/api/admin/task-lists/[id]/route.js.map +1 -1
  63. package/dist/api/admin/time-logs/active-timer/route.d.ts.map +1 -1
  64. package/dist/api/admin/time-logs/active-timer/route.js +14 -11
  65. package/dist/api/admin/time-logs/active-timer/route.js.map +1 -1
  66. package/dist/api/admin/users/route.d.ts.map +1 -1
  67. package/dist/api/admin/users/route.js +1 -11
  68. package/dist/api/admin/users/route.js.map +1 -1
  69. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts +4 -0
  70. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts.map +1 -0
  71. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js +94 -0
  72. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js.map +1 -0
  73. package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts +4 -0
  74. package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts.map +1 -0
  75. package/dist/api/admin/workspaces/[id]/access-requests/route.js +111 -0
  76. package/dist/api/admin/workspaces/[id]/access-requests/route.js.map +1 -0
  77. package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
  78. package/dist/api/admin/workspaces/[id]/invitations/route.js +47 -44
  79. package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
  80. package/dist/api/admin/workspaces/[id]/members/batch/route.d.ts.map +1 -1
  81. package/dist/api/admin/workspaces/[id]/members/batch/route.js +16 -6
  82. package/dist/api/admin/workspaces/[id]/members/batch/route.js.map +1 -1
  83. package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
  84. package/dist/api/admin/workspaces/[id]/members/route.js +13 -6
  85. package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
  86. package/dist/api/admin/workspaces/my-access-requests/route.d.ts +3 -0
  87. package/dist/api/admin/workspaces/my-access-requests/route.d.ts.map +1 -0
  88. package/dist/api/admin/workspaces/my-access-requests/route.js +20 -0
  89. package/dist/api/admin/workspaces/my-access-requests/route.js.map +1 -0
  90. package/dist/api/admin/workspaces/route.d.ts.map +1 -1
  91. package/dist/api/admin/workspaces/route.js +24 -0
  92. package/dist/api/admin/workspaces/route.js.map +1 -1
  93. package/dist/api/admin/workspaces/search/route.d.ts +3 -0
  94. package/dist/api/admin/workspaces/search/route.d.ts.map +1 -0
  95. package/dist/api/admin/workspaces/search/route.js +20 -0
  96. package/dist/api/admin/workspaces/search/route.js.map +1 -0
  97. package/dist/api/auth/_apply-pending-invites.d.ts +12 -0
  98. package/dist/api/auth/_apply-pending-invites.d.ts.map +1 -0
  99. package/dist/api/auth/_apply-pending-invites.js +68 -0
  100. package/dist/api/auth/_apply-pending-invites.js.map +1 -0
  101. package/dist/api/auth/google/callback/route.d.ts.map +1 -1
  102. package/dist/api/auth/google/callback/route.js +20 -0
  103. package/dist/api/auth/google/callback/route.js.map +1 -1
  104. package/dist/api/auth/invite/[token]/route.d.ts.map +1 -1
  105. package/dist/api/auth/invite/[token]/route.js +13 -5
  106. package/dist/api/auth/invite/[token]/route.js.map +1 -1
  107. package/dist/api/auth/register/route.d.ts.map +1 -1
  108. package/dist/api/auth/register/route.js +16 -0
  109. package/dist/api/auth/register/route.js.map +1 -1
  110. package/dist/subscribers/project-access-request-resolved.d.ts +12 -0
  111. package/dist/subscribers/project-access-request-resolved.d.ts.map +1 -0
  112. package/dist/subscribers/project-access-request-resolved.js +55 -0
  113. package/dist/subscribers/project-access-request-resolved.js.map +1 -0
  114. package/dist/subscribers/project-access-requested.d.ts +11 -0
  115. package/dist/subscribers/project-access-requested.d.ts.map +1 -0
  116. package/dist/subscribers/project-access-requested.js +12 -0
  117. package/dist/subscribers/project-access-requested.js.map +1 -0
  118. package/dist/subscribers/workspace-access-request-resolved.d.ts +12 -0
  119. package/dist/subscribers/workspace-access-request-resolved.d.ts.map +1 -0
  120. package/dist/subscribers/workspace-access-request-resolved.js +60 -0
  121. package/dist/subscribers/workspace-access-request-resolved.js.map +1 -0
  122. package/dist/subscribers/workspace-access-requested.d.ts +13 -0
  123. package/dist/subscribers/workspace-access-requested.d.ts.map +1 -0
  124. package/dist/subscribers/workspace-access-requested.js +44 -0
  125. package/dist/subscribers/workspace-access-requested.js.map +1 -0
  126. package/package.json +19 -19
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwDhD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuEhD,CAAA"}
@@ -28,11 +28,24 @@ export const GET = async (req, res) => {
28
28
  const teamEntries = await projectMemberService.listProjectTeamIds(projectId);
29
29
  // Batch-fetch all member users in a single query
30
30
  const userMap = await userService.listUsersByIds(members.map((m) => m.user_id));
31
+ // Resolve app role names for all members
32
+ let appRoleMap = new Map();
33
+ try {
34
+ const appRoleService = req.scope.resolve("appRoleModuleService");
35
+ const roleIds = [...new Set([...userMap.values()].map((u) => u.app_role_id).filter(Boolean))];
36
+ if (roleIds.length > 0) {
37
+ const [roles] = await appRoleService.listAndCountAppRoles({ id: roleIds }, { limit: roleIds.length });
38
+ for (const r of roles)
39
+ appRoleMap.set(r.id, r.name);
40
+ }
41
+ }
42
+ catch { /* app-role module may not be loaded */ }
31
43
  const enrichedMembers = members.map((m) => {
32
44
  const user = userMap.get(m.user_id) ?? null;
45
+ const appRoleName = user?.app_role_id ? (appRoleMap.get(user.app_role_id) ?? null) : null;
33
46
  return user
34
- ? { id: m.id, user_id: m.user_id, role: m.role, user: { id: user.id, email: user.email, first_name: user.first_name, last_name: user.last_name } }
35
- : { id: m.id, user_id: m.user_id, role: m.role, user: null };
47
+ ? { id: m.id, user_id: m.user_id, role: m.role, app_role_name: appRoleName, user: { id: user.id, email: user.email, first_name: user.first_name, last_name: user.last_name, app_role_id: user.app_role_id ?? null } }
48
+ : { id: m.id, user_id: m.user_id, role: m.role, app_role_name: null, user: null };
36
49
  });
37
50
  const enrichedTeams = await Promise.all(teamEntries.map(async (t) => {
38
51
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
+ export declare const PATCH: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/access-requests/[requestId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGrD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAuBvE,CAAA;AAED,eAAO,MAAM,KAAK,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAiGtE,CAAA"}
@@ -0,0 +1,116 @@
1
+ // Owner cancels their own pending request
2
+ export const DELETE = async (req, res, next) => {
3
+ try {
4
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
5
+ const request = await projectMemberService.getAccessRequest(req.params.requestId);
6
+ if (!request || request.project_id !== req.params.id) {
7
+ res.status(404).json({ error: { message: "Access request not found" } });
8
+ return;
9
+ }
10
+ if (request.user_id !== req.user?.id) {
11
+ res.status(403).json({ error: { message: "Forbidden — can only cancel your own request" } });
12
+ return;
13
+ }
14
+ if (request.status !== "pending") {
15
+ res.status(409).json({ error: { message: "Request is no longer pending" } });
16
+ return;
17
+ }
18
+ await projectMemberService.deleteAccessRequest(req.params.requestId);
19
+ res.status(204).end();
20
+ }
21
+ catch (err) {
22
+ next(err);
23
+ }
24
+ };
25
+ export const PATCH = async (req, res, next) => {
26
+ try {
27
+ const projectService = req.scope.resolve("projectModuleService");
28
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
29
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
30
+ if (!project) {
31
+ res.status(404).json({ error: { message: "Project not found" } });
32
+ return;
33
+ }
34
+ // Must be project manager, workspace admin, or global admin
35
+ const roles = req.user?.roles ?? [];
36
+ const isGlobalAdmin = roles.includes("super-admin") || roles.includes("admin");
37
+ let authorized = isGlobalAdmin;
38
+ if (!authorized) {
39
+ const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
40
+ const wsMembership = await workspaceMemberService.getMembership(project.workspace_id, req.user?.id);
41
+ if (wsMembership?.role === "admin")
42
+ authorized = true;
43
+ }
44
+ if (!authorized) {
45
+ const members = await projectMemberService.listProjectMembers(project.id);
46
+ const myMembership = members.find((m) => m.user_id === req.user?.id);
47
+ if (myMembership?.role === "manager")
48
+ authorized = true;
49
+ }
50
+ if (!authorized) {
51
+ res.status(403).json({ error: { message: "Forbidden — project manager or admin role required" } });
52
+ return;
53
+ }
54
+ const { action } = req.body;
55
+ if (action !== "approve" && action !== "deny") {
56
+ res.status(400).json({ error: { message: "action must be 'approve' or 'deny'" } });
57
+ return;
58
+ }
59
+ const request = await projectMemberService.getAccessRequest(req.params.requestId);
60
+ if (!request || request.project_id !== project.id) {
61
+ res.status(404).json({ error: { message: "Access request not found" } });
62
+ return;
63
+ }
64
+ if (request.status !== "pending") {
65
+ res.status(409).json({ error: { message: "Request is no longer pending" } });
66
+ return;
67
+ }
68
+ if (action === "approve") {
69
+ await projectMemberService.ensureProjectMember(project.id, request.user_id, "member");
70
+ }
71
+ const updated = await projectMemberService.updateAccessRequestStatus(request.id, action === "approve" ? "approved" : "denied");
72
+ // Activity log
73
+ try {
74
+ const activityService = req.scope.resolve("activityModuleService");
75
+ await activityService.createActivity({
76
+ entity_type: "project", entity_id: project.id,
77
+ actor_id: req.user?.id ?? "system",
78
+ action: action === "approve" ? "access_request_approved" : "access_request_denied",
79
+ workspace_id: project.workspace_id,
80
+ changes: { user_id: request.user_id },
81
+ });
82
+ }
83
+ catch { }
84
+ // Notify requesting user
85
+ try {
86
+ const notificationService = req.scope.resolve("notificationModuleService");
87
+ await notificationService.createNotification({
88
+ user_id: request.user_id,
89
+ title: action === "approve" ? "Project access approved" : "Project access denied",
90
+ body: action === "approve"
91
+ ? `Your request to join "${project.name}" was approved.`
92
+ : `Your request to join "${project.name}" was denied.`,
93
+ type: "project_access_resolved",
94
+ }).catch(() => { });
95
+ }
96
+ catch {
97
+ // Non-fatal
98
+ }
99
+ const eventBus = req.scope.resolve("eventBus");
100
+ eventBus.emit({
101
+ name: "project.access_request_resolved",
102
+ data: {
103
+ project_id: project.id,
104
+ project_name: project.name,
105
+ workspace_id: project.workspace_id,
106
+ user_id: request.user_id,
107
+ action,
108
+ },
109
+ }).catch(() => { });
110
+ res.json({ access_request: updated });
111
+ }
112
+ catch (err) {
113
+ next(err);
114
+ }
115
+ };
116
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/access-requests/[requestId]/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Response, NextFunction } from "express";
2
+ export declare const GET: (req: any, res: Response, next: NextFunction) => Promise<void>;
3
+ export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
4
+ export declare const DELETE: (req: any, res: Response, next: NextFunction) => Promise<void>;
5
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access-requests/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4BrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAkCpE,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAqFrE,CAAA;AAGD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAgBvE,CAAA"}
@@ -0,0 +1,153 @@
1
+ async function resolveProjectAndAccess(req, res) {
2
+ const projectService = req.scope.resolve("projectModuleService");
3
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
4
+ if (!project) {
5
+ res.status(404).json({ error: { message: "Project not found" } });
6
+ return null;
7
+ }
8
+ const roles = req.user?.roles ?? [];
9
+ const isGlobalAdmin = roles.includes("super-admin") || roles.includes("admin");
10
+ if (isGlobalAdmin)
11
+ return { project, isAuthorized: true };
12
+ // Check workspace admin
13
+ const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
14
+ const wsMembership = await workspaceMemberService.getMembership(project.workspace_id, req.user?.id);
15
+ if (wsMembership?.role === "admin")
16
+ return { project, isAuthorized: true };
17
+ // Check project manager
18
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
19
+ const members = await projectMemberService.listProjectMembers(project.id);
20
+ const myMembership = members.find((m) => m.user_id === req.user?.id);
21
+ if (myMembership?.role === "manager")
22
+ return { project, isAuthorized: true };
23
+ return { project, isAuthorized: false };
24
+ }
25
+ export const GET = async (req, res, next) => {
26
+ try {
27
+ const result = await resolveProjectAndAccess(req, res);
28
+ if (!result)
29
+ return;
30
+ if (!result.isAuthorized) {
31
+ res.status(403).json({ error: { message: "Forbidden — project manager or admin role required" } });
32
+ return;
33
+ }
34
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
35
+ const userService = req.scope.resolve("userModuleService");
36
+ const requests = await projectMemberService.listPendingAccessRequests(req.params.id);
37
+ const userMap = await userService.listUsersByIds(requests.map((r) => r.user_id));
38
+ const enriched = requests.map((r) => ({
39
+ id: r.id,
40
+ project_id: r.project_id,
41
+ user_id: r.user_id,
42
+ message: r.message,
43
+ status: r.status,
44
+ created_at: r.created_at,
45
+ user: userMap.get(r.user_id)
46
+ ? (() => {
47
+ const u = userMap.get(r.user_id);
48
+ return { id: u.id, email: u.email, first_name: u.first_name, last_name: u.last_name };
49
+ })()
50
+ : null,
51
+ }));
52
+ res.json({ requests: enriched });
53
+ }
54
+ catch (err) {
55
+ next(err);
56
+ }
57
+ };
58
+ export const POST = async (req, res, next) => {
59
+ try {
60
+ const projectService = req.scope.resolve("projectModuleService");
61
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
62
+ const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
63
+ const project = await projectService.retrieveProject(req.params.id).catch(() => null);
64
+ if (!project) {
65
+ res.status(404).json({ error: { message: "Project not found" } });
66
+ return;
67
+ }
68
+ const userId = req.user?.id;
69
+ // Must be a workspace member to request project access
70
+ const wsMembership = await workspaceMemberService.getMembership(project.workspace_id, userId);
71
+ if (!wsMembership) {
72
+ res.status(403).json({ error: { message: "Forbidden — must be a workspace member" } });
73
+ return;
74
+ }
75
+ // Must not already be a project member
76
+ const members = await projectMemberService.listProjectMembers(project.id);
77
+ if (members.some((m) => m.user_id === userId)) {
78
+ res.status(409).json({ error: { message: "Already a member of this project" } });
79
+ return;
80
+ }
81
+ // Must not already have a pending request
82
+ const existing = await projectMemberService.getPendingRequest(project.id, userId);
83
+ if (existing) {
84
+ res.status(409).json({ error: { message: "Access request already pending" } });
85
+ return;
86
+ }
87
+ const { message } = req.body;
88
+ const access_request = await projectMemberService.createAccessRequest({
89
+ project_id: project.id,
90
+ user_id: userId,
91
+ message: message?.trim() || null,
92
+ });
93
+ // Notify project managers
94
+ try {
95
+ const notificationService = req.scope.resolve("notificationModuleService");
96
+ const userService = req.scope.resolve("userModuleService");
97
+ const requester = await userService.retrieveUser(userId).catch(() => null);
98
+ const requesterName = requester
99
+ ? `${requester.first_name ?? ""} ${requester.last_name ?? ""}`.trim() || requester.email
100
+ : "Someone";
101
+ const managers = members.filter((m) => m.role === "manager");
102
+ for (const manager of managers) {
103
+ await notificationService.createNotification({
104
+ user_id: manager.user_id,
105
+ title: "New project access request",
106
+ body: `${requesterName} requested access to "${project.name}"`,
107
+ type: "project_access_requested",
108
+ }).catch(() => { });
109
+ }
110
+ }
111
+ catch {
112
+ // Non-fatal
113
+ }
114
+ try {
115
+ const activityService = req.scope.resolve("activityModuleService");
116
+ await activityService.createActivity({
117
+ entity_type: "project", entity_id: project.id,
118
+ actor_id: userId,
119
+ action: "access_requested",
120
+ workspace_id: project.workspace_id,
121
+ changes: { user_id: userId },
122
+ });
123
+ }
124
+ catch { }
125
+ const eventBus = req.scope.resolve("eventBus");
126
+ eventBus.emit({
127
+ name: "project.access_requested",
128
+ data: { project_id: project.id, workspace_id: project.workspace_id, user_id: userId, request_id: access_request.id },
129
+ }).catch(() => { });
130
+ res.status(201).json({ access_request });
131
+ }
132
+ catch (err) {
133
+ next(err);
134
+ }
135
+ };
136
+ // User cancels their own pending request (no requestId needed)
137
+ export const DELETE = async (req, res, next) => {
138
+ try {
139
+ const projectMemberService = req.scope.resolve("projectMemberModuleService");
140
+ const userId = req.user?.id;
141
+ const existing = await projectMemberService.getPendingRequest(req.params.id, userId);
142
+ if (!existing) {
143
+ res.status(404).json({ error: { message: "No pending access request found" } });
144
+ return;
145
+ }
146
+ await projectMemberService.deleteAccessRequest(existing.id);
147
+ res.status(204).end();
148
+ }
149
+ catch (err) {
150
+ next(err);
151
+ }
152
+ };
153
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/projects/[id]/access-requests/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/health/[updateId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAYhD,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwChD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAyBnD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/health/[updateId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAYhD,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA0ChD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA2BnD,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { requirePermission } from "@meridianjs/auth";
1
2
  import { hasProjectAccess } from "../../../../../utils/project-access.js";
2
3
  export const GET = async (req, res) => {
3
4
  const svc = req.scope.resolve("projectModuleService");
@@ -19,80 +20,84 @@ export const GET = async (req, res) => {
19
20
  res.json({ update });
20
21
  };
21
22
  export const PUT = async (req, res) => {
22
- const { health, title, summary, collaborators, report_date } = req.body;
23
- const svc = req.scope.resolve("projectModuleService");
24
- const activityService = req.scope.resolve("activityModuleService");
25
- const project = await svc.retrieveProject(req.params.id).catch(() => null);
26
- if (!project) {
27
- res.status(404).json({ error: { message: "Project not found" } });
28
- return;
29
- }
30
- if (!await hasProjectAccess(req, project)) {
31
- res.status(403).json({ error: { message: "Forbidden" } });
32
- return;
33
- }
34
- const existing = await svc.retrieveProjectHealthUpdate(req.params.updateId).catch(() => null);
35
- if (!existing) {
36
- res.status(404).json({ error: { message: "Health update not found" } });
37
- return;
38
- }
39
- const payload = {};
40
- if (health !== undefined)
41
- payload.health = health;
42
- if (title !== undefined)
43
- payload.title = title;
44
- if (summary !== undefined)
45
- payload.summary = summary;
46
- if (report_date !== undefined)
47
- payload.report_date = report_date;
48
- if (collaborators !== undefined)
49
- payload.collaborators = JSON.stringify(Array.isArray(collaborators) ? collaborators : []);
50
- // Snapshot old values before update — MikroORM identity map shares object references
51
- const oldValues = {};
52
- for (const key of Object.keys(payload)) {
53
- oldValues[key] = existing[key];
54
- }
55
- const raw = await svc.updateProjectHealthUpdate(req.params.updateId, payload);
56
- const updated = { ...raw, collaborators: raw.collaborators ? JSON.parse(raw.collaborators) : [] };
57
- const changes = {};
58
- for (const key of Object.keys(payload)) {
59
- if (key !== "collaborators")
60
- changes[key] = { from: oldValues[key], to: payload[key] };
61
- }
62
- activityService.recordActivity({
63
- entity_type: "project", entity_id: req.params.id,
64
- actor_id: req.user?.id ?? "system", action: "health_update_updated",
65
- workspace_id: project.workspace_id, changes,
66
- }).catch(() => { });
67
- res.json({ update: updated });
23
+ requirePermission("project:update")(req, res, async () => {
24
+ const { health, title, summary, collaborators, report_date } = req.body;
25
+ const svc = req.scope.resolve("projectModuleService");
26
+ const activityService = req.scope.resolve("activityModuleService");
27
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
28
+ if (!project) {
29
+ res.status(404).json({ error: { message: "Project not found" } });
30
+ return;
31
+ }
32
+ if (!await hasProjectAccess(req, project)) {
33
+ res.status(403).json({ error: { message: "Forbidden" } });
34
+ return;
35
+ }
36
+ const existing = await svc.retrieveProjectHealthUpdate(req.params.updateId).catch(() => null);
37
+ if (!existing) {
38
+ res.status(404).json({ error: { message: "Health update not found" } });
39
+ return;
40
+ }
41
+ const payload = {};
42
+ if (health !== undefined)
43
+ payload.health = health;
44
+ if (title !== undefined)
45
+ payload.title = title;
46
+ if (summary !== undefined)
47
+ payload.summary = summary;
48
+ if (report_date !== undefined)
49
+ payload.report_date = report_date;
50
+ if (collaborators !== undefined)
51
+ payload.collaborators = JSON.stringify(Array.isArray(collaborators) ? collaborators : []);
52
+ // Snapshot old values before update — MikroORM identity map shares object references
53
+ const oldValues = {};
54
+ for (const key of Object.keys(payload)) {
55
+ oldValues[key] = existing[key];
56
+ }
57
+ const raw = await svc.updateProjectHealthUpdate(req.params.updateId, payload);
58
+ const updated = { ...raw, collaborators: raw.collaborators ? JSON.parse(raw.collaborators) : [] };
59
+ const changes = {};
60
+ for (const key of Object.keys(payload)) {
61
+ if (key !== "collaborators")
62
+ changes[key] = { from: oldValues[key], to: payload[key] };
63
+ }
64
+ activityService.recordActivity({
65
+ entity_type: "project", entity_id: req.params.id,
66
+ actor_id: req.user?.id ?? "system", action: "health_update_updated",
67
+ workspace_id: project.workspace_id, changes,
68
+ }).catch(() => { });
69
+ res.json({ update: updated });
70
+ });
68
71
  };
69
72
  export const DELETE = async (req, res) => {
70
- const svc = req.scope.resolve("projectModuleService");
71
- const activityService = req.scope.resolve("activityModuleService");
72
- const project = await svc.retrieveProject(req.params.id).catch(() => null);
73
- if (!project) {
74
- res.status(404).json({ error: { message: "Project not found" } });
75
- return;
76
- }
77
- if (!await hasProjectAccess(req, project)) {
78
- res.status(403).json({ error: { message: "Forbidden" } });
79
- return;
80
- }
81
- const existing = await svc.retrieveProjectHealthUpdate(req.params.updateId).catch(() => null);
82
- if (!existing) {
83
- res.status(404).json({ error: { message: "Health update not found" } });
84
- return;
85
- }
86
- await svc.deleteProjectHealthUpdate(req.params.updateId);
87
- activityService.recordActivity({
88
- entity_type: "project", entity_id: req.params.id,
89
- actor_id: req.user?.id ?? "system", action: "health_update_deleted",
90
- workspace_id: project.workspace_id,
91
- changes: {
92
- title: { from: existing.title, to: null },
93
- health: { from: existing.health, to: null },
94
- },
95
- }).catch(() => { });
96
- res.status(204).send();
73
+ requirePermission("project:update")(req, res, async () => {
74
+ const svc = req.scope.resolve("projectModuleService");
75
+ const activityService = req.scope.resolve("activityModuleService");
76
+ const project = await svc.retrieveProject(req.params.id).catch(() => null);
77
+ if (!project) {
78
+ res.status(404).json({ error: { message: "Project not found" } });
79
+ return;
80
+ }
81
+ if (!await hasProjectAccess(req, project)) {
82
+ res.status(403).json({ error: { message: "Forbidden" } });
83
+ return;
84
+ }
85
+ const existing = await svc.retrieveProjectHealthUpdate(req.params.updateId).catch(() => null);
86
+ if (!existing) {
87
+ res.status(404).json({ error: { message: "Health update not found" } });
88
+ return;
89
+ }
90
+ await svc.deleteProjectHealthUpdate(req.params.updateId);
91
+ activityService.recordActivity({
92
+ entity_type: "project", entity_id: req.params.id,
93
+ actor_id: req.user?.id ?? "system", action: "health_update_deleted",
94
+ workspace_id: project.workspace_id,
95
+ changes: {
96
+ title: { from: existing.title, to: null },
97
+ health: { from: existing.health, to: null },
98
+ },
99
+ }).catch(() => { });
100
+ res.status(204).send();
101
+ });
97
102
  };
98
103
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/health/[updateId]/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/projects/[id]/health/[updateId]/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/api/admin/projects/[id]/health/[updateId]/send/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAsEjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/api/admin/projects/[id]/health/[updateId]/send/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwEjD,CAAA"}