@meridianjs/meridian 2.6.0 → 2.7.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.
- package/dist/api/admin/api-tokens/[id]/route.d.ts +3 -0
- package/dist/api/admin/api-tokens/[id]/route.d.ts.map +1 -0
- package/dist/api/admin/api-tokens/[id]/route.js +20 -0
- package/dist/api/admin/api-tokens/[id]/route.js.map +1 -0
- package/dist/api/admin/api-tokens/route.d.ts +15 -0
- package/dist/api/admin/api-tokens/route.d.ts.map +1 -0
- package/dist/api/admin/api-tokens/route.js +63 -0
- package/dist/api/admin/api-tokens/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/activities/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/activities/route.js +4 -15
- package/dist/api/admin/issues/[id]/activities/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +6 -1
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/route.js +2 -19
- package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/comments/route.js +4 -20
- package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/related/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/related/route.js +4 -5
- package/dist/api/admin/issues/[id]/related/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/relations/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/relations/route.js +4 -5
- package/dist/api/admin/issues/[id]/relations/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/route.js +12 -12
- package/dist/api/admin/issues/[id]/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +7 -2
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/route.js +1 -18
- package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js +1 -18
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -1
- package/dist/api/admin/issues/route.d.ts.map +1 -1
- package/dist/api/admin/issues/route.js +20 -4
- package/dist/api/admin/issues/route.js.map +1 -1
- package/dist/api/admin/my/tasks/route.d.ts.map +1 -1
- package/dist/api/admin/my/tasks/route.js +22 -5
- package/dist/api/admin/my/tasks/route.js.map +1 -1
- package/dist/api/admin/org/calendar/route.d.ts.map +1 -1
- package/dist/api/admin/org/calendar/route.js +2 -1
- package/dist/api/admin/org/calendar/route.js.map +1 -1
- package/dist/api/admin/org/holidays/[holidayId]/route.d.ts.map +1 -1
- package/dist/api/admin/org/holidays/[holidayId]/route.js +3 -2
- package/dist/api/admin/org/holidays/[holidayId]/route.js.map +1 -1
- package/dist/api/admin/org/holidays/route.d.ts.map +1 -1
- package/dist/api/admin/org/holidays/route.js +2 -1
- package/dist/api/admin/org/holidays/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/access/route.js +14 -11
- package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js +3 -2
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/access-requests/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/access-requests/route.js +18 -19
- package/dist/api/admin/projects/[id]/access-requests/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/activities/route.js +1 -1
- package/dist/api/admin/projects/[id]/activities/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/health/[updateId]/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/health/[updateId]/route.js +3 -3
- package/dist/api/admin/projects/[id]/health/[updateId]/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/health/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/health/route.js +3 -3
- package/dist/api/admin/projects/[id]/health/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/members/batch/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/members/batch/route.js +3 -2
- package/dist/api/admin/projects/[id]/members/batch/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/members/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/members/route.js +4 -3
- package/dist/api/admin/projects/[id]/members/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/share/route.js +5 -4
- package/dist/api/admin/projects/[id]/share/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/route.js +1 -1
- package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
- package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.d.ts.map +1 -1
- package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.js +4 -3
- package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.js.map +1 -1
- package/dist/api/admin/projects/route.d.ts.map +1 -1
- package/dist/api/admin/projects/route.js +7 -5
- package/dist/api/admin/projects/route.js.map +1 -1
- package/dist/api/admin/reporting/members/route.d.ts.map +1 -1
- package/dist/api/admin/reporting/members/route.js +6 -5
- package/dist/api/admin/reporting/members/route.js.map +1 -1
- package/dist/api/admin/reporting/time-logs/route.d.ts.map +1 -1
- package/dist/api/admin/reporting/time-logs/route.js +31 -9
- package/dist/api/admin/reporting/time-logs/route.js.map +1 -1
- package/dist/api/admin/team/tasks/route.d.ts.map +1 -1
- package/dist/api/admin/team/tasks/route.js +29 -13
- package/dist/api/admin/team/tasks/route.js.map +1 -1
- package/dist/api/admin/users/[id]/reactivate/route.d.ts.map +1 -1
- package/dist/api/admin/users/[id]/reactivate/route.js +2 -1
- package/dist/api/admin/users/[id]/reactivate/route.js.map +1 -1
- package/dist/api/admin/users/[id]/route.d.ts.map +1 -1
- package/dist/api/admin/users/[id]/route.js +6 -5
- package/dist/api/admin/users/[id]/route.js.map +1 -1
- package/dist/api/admin/users/[id]/sessions/route.d.ts.map +1 -1
- package/dist/api/admin/users/[id]/sessions/route.js +6 -5
- package/dist/api/admin/users/[id]/sessions/route.js.map +1 -1
- package/dist/api/admin/users/invitations/[inviteId]/resend/route.d.ts.map +1 -1
- package/dist/api/admin/users/invitations/[inviteId]/resend/route.js +3 -2
- package/dist/api/admin/users/invitations/[inviteId]/resend/route.js.map +1 -1
- package/dist/api/admin/users/invitations/[inviteId]/route.d.ts.map +1 -1
- package/dist/api/admin/users/invitations/[inviteId]/route.js +2 -1
- package/dist/api/admin/users/invitations/[inviteId]/route.js.map +1 -1
- package/dist/api/admin/users/invitations/route.d.ts.map +1 -1
- package/dist/api/admin/users/invitations/route.js +2 -1
- package/dist/api/admin/users/invitations/route.js.map +1 -1
- package/dist/api/admin/users/invite/route.d.ts.map +1 -1
- package/dist/api/admin/users/invite/route.js +5 -4
- package/dist/api/admin/users/invite/route.js.map +1 -1
- package/dist/api/admin/users/map/route.d.ts.map +1 -1
- package/dist/api/admin/users/map/route.js +8 -5
- package/dist/api/admin/users/map/route.js.map +1 -1
- package/dist/api/admin/users/me/avatar/route.js +1 -1
- package/dist/api/admin/users/me/avatar/route.js.map +1 -1
- package/dist/api/admin/users/me/google/route.js +1 -1
- package/dist/api/admin/users/me/google/route.js.map +1 -1
- package/dist/api/admin/users/me/password/send-otp/route.d.ts.map +1 -1
- package/dist/api/admin/users/me/password/send-otp/route.js +2 -1
- package/dist/api/admin/users/me/password/send-otp/route.js.map +1 -1
- package/dist/api/admin/users/route.d.ts.map +1 -1
- package/dist/api/admin/users/route.js +8 -1
- package/dist/api/admin/users/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js +4 -3
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/access-requests/route.js +3 -2
- package/dist/api/admin/workspaces/[id]/access-requests/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js +4 -3
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js +2 -2
- package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/route.js +6 -5
- package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/[userId]/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/[userId]/route.js +5 -4
- package/dist/api/admin/workspaces/[id]/members/[userId]/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/batch/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/batch/route.js +3 -2
- package/dist/api/admin/workspaces/[id]/members/batch/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/route.js +3 -2
- package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
- package/dist/api/admin/workspaces/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/route.js +5 -3
- package/dist/api/admin/workspaces/route.js.map +1 -1
- package/dist/api/admin/workspaces/search/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/search/route.js +25 -16
- package/dist/api/admin/workspaces/search/route.js.map +1 -1
- package/dist/api/auth/_apply-pending-invites.d.ts.map +1 -1
- package/dist/api/auth/_apply-pending-invites.js +6 -5
- package/dist/api/auth/_apply-pending-invites.js.map +1 -1
- package/dist/api/auth/forgot-password/route.d.ts.map +1 -1
- package/dist/api/auth/forgot-password/route.js +2 -1
- package/dist/api/auth/forgot-password/route.js.map +1 -1
- package/dist/api/auth/invite/[token]/route.d.ts.map +1 -1
- package/dist/api/auth/invite/[token]/route.js +15 -5
- package/dist/api/auth/invite/[token]/route.js.map +1 -1
- package/dist/api/auth/register/send-otp/route.d.ts.map +1 -1
- package/dist/api/auth/register/send-otp/route.js +2 -1
- package/dist/api/auth/register/send-otp/route.js.map +1 -1
- package/dist/api/utils/issue-access.d.ts +16 -0
- package/dist/api/utils/issue-access.d.ts.map +1 -0
- package/dist/api/utils/issue-access.js +38 -0
- package/dist/api/utils/issue-access.js.map +1 -0
- package/dist/api/utils/project-access.d.ts +2 -0
- package/dist/api/utils/project-access.d.ts.map +1 -1
- package/dist/api/utils/project-access.js +11 -8
- package/dist/api/utils/project-access.js.map +1 -1
- package/dist/api/utils/request.d.ts +30 -0
- package/dist/api/utils/request.d.ts.map +1 -0
- package/dist/api/utils/request.js +11 -0
- package/dist/api/utils/request.js.map +1 -0
- package/dist/api/utils/workspace-access.d.ts.map +1 -1
- package/dist/api/utils/workspace-access.js +6 -7
- package/dist/api/utils/workspace-access.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/subscribers/comment-created.d.ts.map +1 -1
- package/dist/subscribers/comment-created.js +3 -1
- package/dist/subscribers/comment-created.js.map +1 -1
- package/dist/subscribers/issue-assigned.d.ts.map +1 -1
- package/dist/subscribers/issue-assigned.js +3 -1
- package/dist/subscribers/issue-assigned.js.map +1 -1
- package/dist/subscribers/issue-created.d.ts.map +1 -1
- package/dist/subscribers/issue-created.js +2 -1
- package/dist/subscribers/issue-created.js.map +1 -1
- package/dist/subscribers/issue-mentioned.d.ts.map +1 -1
- package/dist/subscribers/issue-mentioned.js +2 -1
- package/dist/subscribers/issue-mentioned.js.map +1 -1
- package/dist/subscribers/issue-status-changed.d.ts +1 -0
- package/dist/subscribers/issue-status-changed.d.ts.map +1 -1
- package/dist/subscribers/issue-status-changed.js +3 -1
- package/dist/subscribers/issue-status-changed.js.map +1 -1
- package/dist/subscribers/password-otp-requested.d.ts.map +1 -1
- package/dist/subscribers/password-otp-requested.js +2 -1
- package/dist/subscribers/password-otp-requested.js.map +1 -1
- package/dist/subscribers/password-reset-requested.d.ts.map +1 -1
- package/dist/subscribers/password-reset-requested.js +2 -1
- package/dist/subscribers/password-reset-requested.js.map +1 -1
- package/dist/subscribers/project-access-request-cancelled.d.ts.map +1 -1
- package/dist/subscribers/project-access-request-cancelled.js +2 -1
- package/dist/subscribers/project-access-request-cancelled.js.map +1 -1
- package/dist/subscribers/project-access-request-resolved.d.ts.map +1 -1
- package/dist/subscribers/project-access-request-resolved.js +2 -1
- package/dist/subscribers/project-access-request-resolved.js.map +1 -1
- package/dist/subscribers/project-access-requested.d.ts.map +1 -1
- package/dist/subscribers/project-access-requested.js +2 -1
- package/dist/subscribers/project-access-requested.js.map +1 -1
- package/dist/subscribers/project-member-added.d.ts.map +1 -1
- package/dist/subscribers/project-member-added.js +2 -1
- package/dist/subscribers/project-member-added.js.map +1 -1
- package/dist/subscribers/registration-otp-requested.d.ts.map +1 -1
- package/dist/subscribers/registration-otp-requested.js +2 -1
- package/dist/subscribers/registration-otp-requested.js.map +1 -1
- package/dist/subscribers/workspace-access-request-cancelled.d.ts.map +1 -1
- package/dist/subscribers/workspace-access-request-cancelled.js +2 -1
- package/dist/subscribers/workspace-access-request-cancelled.js.map +1 -1
- package/dist/subscribers/workspace-access-request-resolved.d.ts.map +1 -1
- package/dist/subscribers/workspace-access-request-resolved.js +2 -1
- package/dist/subscribers/workspace-access-request-resolved.js.map +1 -1
- package/dist/subscribers/workspace-access-requested.d.ts.map +1 -1
- package/dist/subscribers/workspace-access-requested.js +2 -1
- package/dist/subscribers/workspace-access-requested.js.map +1 -1
- package/dist/subscribers/workspace-member-added.d.ts.map +1 -1
- package/dist/subscribers/workspace-member-added.js +2 -1
- package/dist/subscribers/workspace-member-added.js.map +1 -1
- package/dist/subscribers/workspace-member-invited.d.ts.map +1 -1
- package/dist/subscribers/workspace-member-invited.js +2 -1
- package/dist/subscribers/workspace-member-invited.js.map +1 -1
- package/dist/workflows/assign-issue.d.ts.map +1 -1
- package/dist/workflows/assign-issue.js +2 -1
- package/dist/workflows/assign-issue.js.map +1 -1
- package/dist/workflows/complete-sprint.d.ts.map +1 -1
- package/dist/workflows/complete-sprint.js +2 -1
- package/dist/workflows/complete-sprint.js.map +1 -1
- package/dist/workflows/create-invitation.d.ts.map +1 -1
- package/dist/workflows/create-invitation.js +2 -1
- package/dist/workflows/create-invitation.js.map +1 -1
- package/dist/workflows/create-issue.d.ts.map +1 -1
- package/dist/workflows/create-issue.js +2 -1
- package/dist/workflows/create-issue.js.map +1 -1
- package/dist/workflows/create-project.d.ts.map +1 -1
- package/dist/workflows/create-project.js +2 -1
- package/dist/workflows/create-project.js.map +1 -1
- package/dist/workflows/transfer-project.d.ts.map +1 -1
- package/dist/workflows/transfer-project.js +28 -17
- package/dist/workflows/transfer-project.js.map +1 -1
- package/dist/workflows/update-issue-status.d.ts.map +1 -1
- package/dist/workflows/update-issue-status.js +3 -2
- package/dist/workflows/update-issue-status.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/api-tokens/[id]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAiBvE,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const DELETE = async (req, res, next) => {
|
|
2
|
+
try {
|
|
3
|
+
const apiTokenService = req.scope.resolve("apiTokenModuleService");
|
|
4
|
+
const record = await apiTokenService.retrieveApiToken(req.params.id).catch(() => null);
|
|
5
|
+
if (!record) {
|
|
6
|
+
res.status(404).json({ error: { message: "API token not found" } });
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (record.user_id !== req.user.id) {
|
|
10
|
+
res.status(403).json({ error: { message: "Forbidden" } });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
await apiTokenService.revokeToken(record.id);
|
|
14
|
+
res.status(204).end();
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
next(err);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/api-tokens/[id]/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IAC1E,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;QACzE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACtF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;YACnE,OAAM;QACR,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QACD,MAAM,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Response, NextFunction } from "express";
|
|
2
|
+
/** Serializes a token record for API responses — never exposes token_hash. */
|
|
3
|
+
export declare function toApiTokenDto(record: any): {
|
|
4
|
+
id: any;
|
|
5
|
+
name: any;
|
|
6
|
+
token_prefix: any;
|
|
7
|
+
scopes: any;
|
|
8
|
+
expires_at: any;
|
|
9
|
+
last_used_at: any;
|
|
10
|
+
revoked_at: any;
|
|
11
|
+
created_at: any;
|
|
12
|
+
};
|
|
13
|
+
export declare const GET: (req: any, res: Response, next: NextFunction) => Promise<void>;
|
|
14
|
+
export declare const POST: (req: any, res: Response, next: NextFunction) => Promise<void>;
|
|
15
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/api-tokens/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAKrD,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG;;;;;;;;;EAWxC;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAWpE,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBA2CrE,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const VALID_SCOPES = ["read", "write"];
|
|
2
|
+
const MAX_NAME_LENGTH = 100;
|
|
3
|
+
/** Serializes a token record for API responses — never exposes token_hash. */
|
|
4
|
+
export function toApiTokenDto(record) {
|
|
5
|
+
return {
|
|
6
|
+
id: record.id,
|
|
7
|
+
name: record.name,
|
|
8
|
+
token_prefix: record.token_prefix,
|
|
9
|
+
scopes: record.scopes,
|
|
10
|
+
expires_at: record.expires_at,
|
|
11
|
+
last_used_at: record.last_used_at,
|
|
12
|
+
revoked_at: record.revoked_at,
|
|
13
|
+
created_at: record.created_at,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export const GET = async (req, res, next) => {
|
|
17
|
+
try {
|
|
18
|
+
const apiTokenService = req.scope.resolve("apiTokenModuleService");
|
|
19
|
+
const [tokens] = await apiTokenService.listAndCountApiTokens({ user_id: req.user.id }, { orderBy: { created_at: "DESC" } });
|
|
20
|
+
res.json({ api_tokens: tokens.map(toApiTokenDto) });
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
next(err);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const POST = async (req, res, next) => {
|
|
27
|
+
try {
|
|
28
|
+
// A leaked token must not be able to mint fresh tokens for its owner.
|
|
29
|
+
if (req.user?.authType === "api-token") {
|
|
30
|
+
res.status(403).json({ error: { message: "API tokens cannot create other API tokens" } });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const { name, scopes, expires_in_days } = req.body ?? {};
|
|
34
|
+
if (typeof name !== "string" || !name.trim() || name.trim().length > MAX_NAME_LENGTH) {
|
|
35
|
+
res.status(400).json({ error: { message: `name is required (max ${MAX_NAME_LENGTH} chars)` } });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!Array.isArray(scopes) ||
|
|
39
|
+
scopes.length === 0 ||
|
|
40
|
+
!scopes.every((s) => VALID_SCOPES.includes(s))) {
|
|
41
|
+
res.status(400).json({ error: { message: 'scopes must be a non-empty array of "read" / "write"' } });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (expires_in_days != null &&
|
|
45
|
+
(!Number.isInteger(expires_in_days) || expires_in_days <= 0 || expires_in_days > 3650)) {
|
|
46
|
+
res.status(400).json({ error: { message: "expires_in_days must be a positive integer (max 3650)" } });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const apiTokenService = req.scope.resolve("apiTokenModuleService");
|
|
50
|
+
const { token, apiToken } = await apiTokenService.createToken({
|
|
51
|
+
user_id: req.user.id,
|
|
52
|
+
name: name.trim(),
|
|
53
|
+
scopes: [...new Set(scopes)],
|
|
54
|
+
expires_in_days: expires_in_days ?? null,
|
|
55
|
+
});
|
|
56
|
+
// The plaintext token appears in this response only — it is never retrievable again.
|
|
57
|
+
res.status(201).json({ token, api_token: toApiTokenDto(apiToken) });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
next(err);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/api-tokens/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[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,
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[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,kBAOhD,CAAA"}
|
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
2
2
|
export const GET = async (req, res) => {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
if (!issue) {
|
|
6
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
3
|
+
const issue = await assertIssueAccess(req, res);
|
|
4
|
+
if (!issue)
|
|
7
5
|
return;
|
|
8
|
-
}
|
|
9
|
-
if (issue.project_id) {
|
|
10
|
-
const projectService = req.scope.resolve("projectModuleService");
|
|
11
|
-
const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
|
|
12
|
-
if (project && !await hasProjectAccess(req, project)) {
|
|
13
|
-
res.status(403).json({ error: { message: "Forbidden" } });
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
6
|
const activityService = req.scope.resolve("activityModuleService");
|
|
18
7
|
const activities = await activityService.listActivityForEntity("issue", req.params.id);
|
|
19
8
|
activities.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
|
|
20
|
-
res.json({ activities });
|
|
9
|
+
res.json({ activities, count: activities.length });
|
|
21
10
|
};
|
|
22
11
|
//# sourceMappingURL=route.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/activities/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/activities/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAErE,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAQ,CAAA;IACzE,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACtF,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,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;AACpD,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/attachments/[attachmentId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/attachments/[attachmentId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQvC,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwCnD,CAAA"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { assertIssueAccess } from "../../../../../utils/issue-access.js";
|
|
5
|
+
import { PROJECT_ROLES } from "@meridianjs/types";
|
|
6
|
+
import { isGlobalAdmin } from "../../../../../utils/project-access.js";
|
|
4
7
|
export const DELETE = async (req, res) => {
|
|
5
8
|
requirePermission("issue:update")(req, res, async () => {
|
|
9
|
+
if (!(await assertIssueAccess(req, res)))
|
|
10
|
+
return;
|
|
6
11
|
const issueService = req.scope.resolve("issueModuleService");
|
|
7
12
|
const repo = req.scope.resolve("attachmentRepository");
|
|
8
13
|
const attachment = await repo.findOne({ id: req.params.attachmentId });
|
|
@@ -17,7 +22,7 @@ export const DELETE = async (req, res) => {
|
|
|
17
22
|
}
|
|
18
23
|
// Verify caller uploaded the attachment or has manager/admin role
|
|
19
24
|
const roles = req.user?.roles ?? [];
|
|
20
|
-
const isPrivileged =
|
|
25
|
+
const isPrivileged = isGlobalAdmin(req) || roles.includes(PROJECT_ROLES.MANAGER);
|
|
21
26
|
if (!isPrivileged && attachment.uploader_id !== req.user?.id) {
|
|
22
27
|
res.status(403).json({ error: { message: "Forbidden" } });
|
|
23
28
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/attachments/[attachmentId]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/attachments/[attachmentId]/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/attachments/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/attachments/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAKhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA0BjD,CAAA"}
|
|
@@ -1,29 +1,12 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
|
-
import {
|
|
2
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
3
3
|
import { processUpload } from "../../../../../utils/upload.js";
|
|
4
|
-
async function assertIssueAccess(req, res) {
|
|
5
|
-
const issueService = req.scope.resolve("issueModuleService");
|
|
6
|
-
const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
|
|
7
|
-
if (!issue) {
|
|
8
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
if (issue.project_id) {
|
|
12
|
-
const projectService = req.scope.resolve("projectModuleService");
|
|
13
|
-
const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
|
|
14
|
-
if (project && !await hasProjectAccess(req, project)) {
|
|
15
|
-
res.status(403).json({ error: { message: "Forbidden" } });
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
4
|
export const GET = async (req, res) => {
|
|
22
5
|
if (!await assertIssueAccess(req, res))
|
|
23
6
|
return;
|
|
24
7
|
const issueService = req.scope.resolve("issueModuleService");
|
|
25
8
|
const attachments = await issueService.listAttachmentsByIssue(req.params.id);
|
|
26
|
-
res.json({ attachments });
|
|
9
|
+
res.json({ attachments, count: attachments.length });
|
|
27
10
|
};
|
|
28
11
|
export const POST = async (req, res) => {
|
|
29
12
|
requirePermission("issue:update")(req, res, async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/attachments/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/attachments/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAE9D,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAM;IAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5E,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAM;QAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAA;QACzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,mEAAmE,EAAE,EAAE,CAAC,CAAA;YACjH,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAExF,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC;YACrD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;YACvB,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI;YACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,YAAY;YAClC,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ;YACrC,YAAY,EAAE,KAAK,CAAC,YAAY;SACjC,CAAC,CAAA;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/comments/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/comments/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAKhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAoBjD,CAAA"}
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
const issueService = req.scope.resolve("issueModuleService");
|
|
5
|
-
const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
|
|
6
|
-
if (!issue) {
|
|
7
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
if (issue.project_id) {
|
|
11
|
-
const projectService = req.scope.resolve("projectModuleService");
|
|
12
|
-
const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
|
|
13
|
-
if (project && !await hasProjectAccess(req, project)) {
|
|
14
|
-
res.status(403).json({ error: { message: "Forbidden" } });
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
2
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
3
|
+
import { EVENTS } from "@meridianjs/types";
|
|
20
4
|
export const GET = async (req, res) => {
|
|
21
5
|
if (!await assertIssueAccess(req, res))
|
|
22
6
|
return;
|
|
23
7
|
const issueService = req.scope.resolve("issueModuleService");
|
|
24
8
|
const comments = await issueService.listCommentsByIssue(req.params.id);
|
|
25
|
-
res.json({ comments });
|
|
9
|
+
res.json({ comments, count: comments.length });
|
|
26
10
|
};
|
|
27
11
|
export const POST = async (req, res) => {
|
|
28
12
|
requirePermission("issue:create")(req, res, async () => {
|
|
@@ -42,7 +26,7 @@ export const POST = async (req, res) => {
|
|
|
42
26
|
const mentionedUserIds = Array.isArray(metadata?.mentioned_user_ids)
|
|
43
27
|
? metadata.mentioned_user_ids.filter((id) => typeof id === "string")
|
|
44
28
|
: [];
|
|
45
|
-
eventBus.emit({ name:
|
|
29
|
+
eventBus.emit({ name: EVENTS.COMMENT_CREATED, data: { comment_id: comment.id, issue_id: req.params.id, author_id: comment.author_id, mentioned_user_ids: mentionedUserIds } }).catch(() => { });
|
|
46
30
|
res.status(201).json({ comment });
|
|
47
31
|
});
|
|
48
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/comments/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/comments/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAM;IAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACtE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAM;QAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;QACrD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;QACnC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;YAChE,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;YAC/C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ;YAC/E,QAAQ,EAAE,QAAQ,IAAI,IAAI;SAC3B,CAAC,CAAA;QACF,MAAM,gBAAgB,GAAa,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC;YAC5E,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAW,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;YAC7E,CAAC,CAAC,EAAE,CAAA;QACN,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC9L,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/related/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/related/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA2BhD,CAAA"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
1
2
|
export const GET = async (req, res) => {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
if (!issue) {
|
|
5
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
3
|
+
const issue = await assertIssueAccess(req, res);
|
|
4
|
+
if (!issue)
|
|
6
5
|
return;
|
|
7
|
-
|
|
6
|
+
const issueService = req.scope.resolve("issueModuleService");
|
|
8
7
|
// Calculate depth by walking the parent chain
|
|
9
8
|
let depth = 0;
|
|
10
9
|
let currentId = issue.parent_id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/related/route.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/related/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAErE,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IAEnE,8CAA8C;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;IAC/B,OAAO,SAAS,EAAE,CAAC;QACjB,KAAK,EAAE,CAAA;QACP,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC5E,IAAI,CAAC,MAAM;YAAE,MAAK;QAClB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IAC9B,CAAC;IAED,aAAa;IACb,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS;QAC5B,CAAC,CAAC,MAAM,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACrE,CAAC,CAAC,IAAI,CAAA;IAER,eAAe;IACf,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,YAAY,CAAC,kBAAkB,CACtD,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAC5B,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAC/C,CAAA;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;AACvC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/relations/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/relations/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAkBhD,CAAA"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
1
2
|
export const GET = async (req, res) => {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
if (!issue) {
|
|
5
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
3
|
+
const issue = await assertIssueAccess(req, res);
|
|
4
|
+
if (!issue)
|
|
6
5
|
return;
|
|
7
|
-
|
|
6
|
+
const issueService = req.scope.resolve("issueModuleService");
|
|
8
7
|
const fetchByIds = async (ids) => {
|
|
9
8
|
const results = await Promise.all(ids.map((id) => issueService.retrieveIssue(id).catch(() => null)));
|
|
10
9
|
return results.filter(Boolean);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/relations/route.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/relations/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAErE,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IAEnE,MAAM,UAAU,GAAG,KAAK,EAAE,GAAa,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAClE,CAAA;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAA;IAED,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAA;IAEF,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;AACtC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/issues/[id]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/issues/[id]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAOrD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAIhD,CAAA;AAED,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAwFpE,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAYvE,CAAA"}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
2
|
import { updateIssueStatusWorkflow } from "../../../../workflows/update-issue-status.js";
|
|
3
3
|
import { assignIssueWorkflow } from "../../../../workflows/assign-issue.js";
|
|
4
|
-
import {
|
|
4
|
+
import { assertIssueAccess } from "../../../utils/issue-access.js";
|
|
5
|
+
import { EVENTS } from "@meridianjs/types";
|
|
5
6
|
export const GET = async (req, res) => {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const projectService = req.scope.resolve("projectModuleService");
|
|
10
|
-
const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
|
|
11
|
-
if (project && !await hasProjectAccess(req, project)) {
|
|
12
|
-
res.status(403).json({ error: { message: "Forbidden" } });
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
7
|
+
const issue = await assertIssueAccess(req, res);
|
|
8
|
+
if (!issue)
|
|
9
|
+
return;
|
|
16
10
|
res.json({ issue });
|
|
17
11
|
};
|
|
18
12
|
export const PUT = async (req, res, next) => {
|
|
19
13
|
requirePermission("issue:update")(req, res, async () => {
|
|
20
14
|
try {
|
|
15
|
+
// Permission is org-wide; also require access to this issue's project.
|
|
16
|
+
if (!(await assertIssueAccess(req, res)))
|
|
17
|
+
return;
|
|
21
18
|
const issueService = req.scope.resolve("issueModuleService");
|
|
22
19
|
const activityService = req.scope.resolve("activityModuleService");
|
|
23
20
|
const allowed = ["title", "description", "status", "priority", "type",
|
|
@@ -45,7 +42,7 @@ export const PUT = async (req, res, next) => {
|
|
|
45
42
|
if (mentionedUserIds.length > 0 && req.body.description !== undefined) {
|
|
46
43
|
const eventBus = req.scope.resolve("eventBus");
|
|
47
44
|
eventBus.emit({
|
|
48
|
-
name:
|
|
45
|
+
name: EVENTS.ISSUE_MENTIONED,
|
|
49
46
|
data: {
|
|
50
47
|
issue_id: issue.id,
|
|
51
48
|
actor_id: req.user?.id ?? "system",
|
|
@@ -114,6 +111,9 @@ export const PUT = async (req, res, next) => {
|
|
|
114
111
|
export const DELETE = async (req, res, next) => {
|
|
115
112
|
requirePermission("issue:delete")(req, res, async () => {
|
|
116
113
|
try {
|
|
114
|
+
// Permission is org-wide; also require access to this issue's project.
|
|
115
|
+
if (!(await assertIssueAccess(req, res)))
|
|
116
|
+
return;
|
|
117
117
|
const issueService = req.scope.resolve("issueModuleService");
|
|
118
118
|
await issueService.softDeleteIssue(req.params.id);
|
|
119
119
|
res.status(204).send();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/issues/[id]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/issues/[id]/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/[logId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/[logId]/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA+ChD,CAAA;AAED,eAAO,MAAM,MAAM,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA2BnD,CAAA"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
|
+
import { assertIssueAccess } from "../../../../../utils/issue-access.js";
|
|
2
3
|
export const PUT = async (req, res) => {
|
|
3
4
|
requirePermission("issue:update")(req, res, async () => {
|
|
5
|
+
if (!(await assertIssueAccess(req, res)))
|
|
6
|
+
return;
|
|
4
7
|
const issueService = req.scope.resolve("issueModuleService");
|
|
5
8
|
const activityService = req.scope.resolve("activityModuleService");
|
|
6
9
|
const entry = await issueService.retrieveTimeLog(req.params.logId);
|
|
7
|
-
if (!entry) {
|
|
10
|
+
if (!entry || entry.issue_id !== req.params.id) {
|
|
8
11
|
res.status(404).json({ error: { message: "Time log not found" } });
|
|
9
12
|
return;
|
|
10
13
|
}
|
|
@@ -43,10 +46,12 @@ export const PUT = async (req, res) => {
|
|
|
43
46
|
};
|
|
44
47
|
export const DELETE = async (req, res) => {
|
|
45
48
|
requirePermission("issue:update")(req, res, async () => {
|
|
49
|
+
if (!(await assertIssueAccess(req, res)))
|
|
50
|
+
return;
|
|
46
51
|
const issueService = req.scope.resolve("issueModuleService");
|
|
47
52
|
const activityService = req.scope.resolve("activityModuleService");
|
|
48
53
|
const entry = await issueService.retrieveTimeLog(req.params.logId);
|
|
49
|
-
if (!entry) {
|
|
54
|
+
if (!entry || entry.issue_id !== req.params.id) {
|
|
50
55
|
res.status(404).json({ error: { message: "Time log not found" } });
|
|
51
56
|
return;
|
|
52
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/[logId]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/[logId]/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/time-logs/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/time-logs/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAMhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAmBjD,CAAA"}
|
|
@@ -1,22 +1,5 @@
|
|
|
1
1
|
import { requirePermission } from "@meridianjs/auth";
|
|
2
|
-
import {
|
|
3
|
-
async function assertIssueAccess(req, res) {
|
|
4
|
-
const issueService = req.scope.resolve("issueModuleService");
|
|
5
|
-
const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
|
|
6
|
-
if (!issue) {
|
|
7
|
-
res.status(404).json({ error: { message: "Issue not found" } });
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
if (issue.project_id) {
|
|
11
|
-
const projectService = req.scope.resolve("projectModuleService");
|
|
12
|
-
const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
|
|
13
|
-
if (project && !await hasProjectAccess(req, project)) {
|
|
14
|
-
res.status(403).json({ error: { message: "Forbidden" } });
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
2
|
+
import { assertIssueAccess } from "../../../../utils/issue-access.js";
|
|
20
3
|
export const GET = async (req, res) => {
|
|
21
4
|
if (!await assertIssueAccess(req, res))
|
|
22
5
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/time-logs/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../../src/api/admin/issues/[id]/time-logs/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAErE,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAM;IAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAClE,MAAM,aAAa,GAAI,IAAc,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7G,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;AAC9C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAM;QAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;QAC/D,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,6CAA6C,EAAE,EAAE,CAAC,CAAA;YAC3F,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC;YACnD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY;YAC5F,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;YACzC,gBAAgB,EAAE,WAAW,EAAE,WAAW,IAAI,IAAI;YAClD,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAA;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/api/admin/issues/[id]/time-logs/timer/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAKhD,CAAA;AAED,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA6BjD,CAAA"}
|