@meridianjs/meridian 0.1.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/issues/[id]/activities/route.d.ts +3 -0
- package/dist/api/admin/issues/[id]/activities/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/activities/route.js +7 -0
- package/dist/api/admin/issues/[id]/activities/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts +3 -0
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +11 -0
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/attachments/route.d.ts +4 -0
- package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/attachments/route.js +40 -0
- package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/comments/route.d.ts +4 -0
- package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/comments/route.js +20 -0
- package/dist/api/admin/issues/[id]/comments/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/route.d.ts +5 -0
- package/dist/api/admin/issues/[id]/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/route.js +70 -0
- package/dist/api/admin/issues/[id]/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts +3 -0
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +6 -0
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/route.d.ts +4 -0
- package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/route.js +26 -0
- package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts +4 -0
- package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -0
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js +26 -0
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -0
- package/dist/api/admin/issues/route.d.ts +4 -0
- package/dist/api/admin/issues/route.d.ts.map +1 -0
- package/dist/api/admin/issues/route.js +48 -0
- package/dist/api/admin/issues/route.js.map +1 -0
- package/dist/api/admin/notifications/[id]/read/route.d.ts +3 -0
- package/dist/api/admin/notifications/[id]/read/route.d.ts.map +1 -0
- package/dist/api/admin/notifications/[id]/read/route.js +6 -0
- package/dist/api/admin/notifications/[id]/read/route.js.map +1 -0
- package/dist/api/admin/notifications/read-all/route.d.ts +3 -0
- package/dist/api/admin/notifications/read-all/route.d.ts.map +1 -0
- package/dist/api/admin/notifications/read-all/route.js +11 -0
- package/dist/api/admin/notifications/read-all/route.js.map +1 -0
- package/dist/api/admin/notifications/route.d.ts +3 -0
- package/dist/api/admin/notifications/route.d.ts.map +1 -0
- package/dist/api/admin/notifications/route.js +14 -0
- package/dist/api/admin/notifications/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/route.d.ts +5 -0
- package/dist/api/admin/projects/[id]/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/route.js +36 -0
- package/dist/api/admin/projects/[id]/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts +4 -0
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +24 -0
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts +3 -0
- package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/reorder/route.js +11 -0
- package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/route.d.ts +4 -0
- package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/statuses/route.js +23 -0
- package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/task-lists/route.d.ts +4 -0
- package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/task-lists/route.js +18 -0
- package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -0
- package/dist/api/admin/projects/by-identifier/[identifier]/route.d.ts +3 -0
- package/dist/api/admin/projects/by-identifier/[identifier]/route.d.ts.map +1 -0
- package/dist/api/admin/projects/by-identifier/[identifier]/route.js +15 -0
- package/dist/api/admin/projects/by-identifier/[identifier]/route.js.map +1 -0
- package/dist/api/admin/projects/check-identifier/[identifier]/route.d.ts +3 -0
- package/dist/api/admin/projects/check-identifier/[identifier]/route.d.ts.map +1 -0
- package/dist/api/admin/projects/check-identifier/[identifier]/route.js +11 -0
- package/dist/api/admin/projects/check-identifier/[identifier]/route.js.map +1 -0
- package/dist/api/admin/projects/route.d.ts +4 -0
- package/dist/api/admin/projects/route.d.ts.map +1 -0
- package/dist/api/admin/projects/route.js +35 -0
- package/dist/api/admin/projects/route.js.map +1 -0
- package/dist/api/admin/projects/suggest-identifier/route.d.ts +3 -0
- package/dist/api/admin/projects/suggest-identifier/route.d.ts.map +1 -0
- package/dist/api/admin/projects/suggest-identifier/route.js +7 -0
- package/dist/api/admin/projects/suggest-identifier/route.js.map +1 -0
- package/dist/api/admin/sprints/[id]/route.d.ts +5 -0
- package/dist/api/admin/sprints/[id]/route.d.ts.map +1 -0
- package/dist/api/admin/sprints/[id]/route.js +41 -0
- package/dist/api/admin/sprints/[id]/route.js.map +1 -0
- package/dist/api/admin/sprints/route.d.ts +4 -0
- package/dist/api/admin/sprints/route.d.ts.map +1 -0
- package/dist/api/admin/sprints/route.js +25 -0
- package/dist/api/admin/sprints/route.js.map +1 -0
- package/dist/api/admin/task-lists/[id]/route.d.ts +4 -0
- package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -0
- package/dist/api/admin/task-lists/[id]/route.js +12 -0
- package/dist/api/admin/task-lists/[id]/route.js.map +1 -0
- package/dist/api/admin/users/route.d.ts +3 -0
- package/dist/api/admin/users/route.d.ts.map +1 -0
- package/dist/api/admin/users/route.js +9 -0
- package/dist/api/admin/users/route.js.map +1 -0
- package/dist/api/admin/workspaces/route.d.ts +4 -0
- package/dist/api/admin/workspaces/route.d.ts.map +1 -0
- package/dist/api/admin/workspaces/route.js +19 -0
- package/dist/api/admin/workspaces/route.js.map +1 -0
- package/dist/api/auth/login/route.d.ts +3 -0
- package/dist/api/auth/login/route.d.ts.map +1 -0
- package/dist/api/auth/login/route.js +16 -0
- package/dist/api/auth/login/route.js.map +1 -0
- package/dist/api/auth/register/route.d.ts +3 -0
- package/dist/api/auth/register/route.d.ts.map +1 -0
- package/dist/api/auth/register/route.js +18 -0
- package/dist/api/auth/register/route.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/links/issue-project.d.ts +3 -0
- package/dist/links/issue-project.d.ts.map +1 -0
- package/dist/links/issue-project.js +5 -0
- package/dist/links/issue-project.js.map +1 -0
- package/dist/links/issue-sprint.d.ts +3 -0
- package/dist/links/issue-sprint.d.ts.map +1 -0
- package/dist/links/issue-sprint.js +5 -0
- package/dist/links/issue-sprint.js.map +1 -0
- package/dist/links/project-workspace.d.ts +3 -0
- package/dist/links/project-workspace.d.ts.map +1 -0
- package/dist/links/project-workspace.js +5 -0
- package/dist/links/project-workspace.js.map +1 -0
- package/dist/package.json +1 -0
- package/dist/subscribers/comment-created.d.ts +10 -0
- package/dist/subscribers/comment-created.d.ts.map +1 -0
- package/dist/subscribers/comment-created.js +25 -0
- package/dist/subscribers/comment-created.js.map +1 -0
- package/dist/subscribers/issue-assigned.d.ts +11 -0
- package/dist/subscribers/issue-assigned.d.ts.map +1 -0
- package/dist/subscribers/issue-assigned.js +15 -0
- package/dist/subscribers/issue-assigned.js.map +1 -0
- package/dist/subscribers/issue-created.d.ts +13 -0
- package/dist/subscribers/issue-created.d.ts.map +1 -0
- package/dist/subscribers/issue-created.js +17 -0
- package/dist/subscribers/issue-created.js.map +1 -0
- package/dist/utils/upload.d.ts +8 -0
- package/dist/utils/upload.d.ts.map +1 -0
- package/dist/utils/upload.js +22 -0
- package/dist/utils/upload.js.map +1 -0
- package/dist/workflows/assign-issue.d.ts +7 -0
- package/dist/workflows/assign-issue.d.ts.map +1 -0
- package/dist/workflows/assign-issue.js +39 -0
- package/dist/workflows/assign-issue.js.map +1 -0
- package/dist/workflows/complete-sprint.d.ts +7 -0
- package/dist/workflows/complete-sprint.d.ts.map +1 -0
- package/dist/workflows/complete-sprint.js +43 -0
- package/dist/workflows/complete-sprint.js.map +1 -0
- package/dist/workflows/create-issue.d.ts +19 -0
- package/dist/workflows/create-issue.d.ts.map +1 -0
- package/dist/workflows/create-issue.js +41 -0
- package/dist/workflows/create-issue.js.map +1 -0
- package/dist/workflows/create-project.d.ts +21 -0
- package/dist/workflows/create-project.d.ts.map +1 -0
- package/dist/workflows/create-project.js +80 -0
- package/dist/workflows/create-project.js.map +1 -0
- package/dist/workflows/emit-event.d.ts +3 -0
- package/dist/workflows/emit-event.d.ts.map +1 -0
- package/dist/workflows/emit-event.js +6 -0
- package/dist/workflows/emit-event.js.map +1 -0
- package/dist/workflows/update-issue-status.d.ts +7 -0
- package/dist/workflows/update-issue-status.d.ts.map +1 -0
- package/dist/workflows/update-issue-status.js +38 -0
- package/dist/workflows/update-issue-status.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default async function handler({ event, container }) {
|
|
2
|
+
const data = event.data;
|
|
3
|
+
const issueService = container.resolve("issueModuleService");
|
|
4
|
+
const notifService = container.resolve("notificationModuleService");
|
|
5
|
+
let issue;
|
|
6
|
+
try {
|
|
7
|
+
issue = await issueService.retrieveIssue(data.issue_id);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const recipients = new Set();
|
|
13
|
+
if (issue.assignee_ids)
|
|
14
|
+
issue.assignee_ids.forEach((id) => recipients.add(id));
|
|
15
|
+
if (issue.reporter_id)
|
|
16
|
+
recipients.add(issue.reporter_id);
|
|
17
|
+
recipients.delete(data.author_id);
|
|
18
|
+
await Promise.all([...recipients].map(userId => notifService.createNotification({
|
|
19
|
+
user_id: userId, entity_type: "issue", entity_id: data.issue_id,
|
|
20
|
+
action: "commented", message: "Someone commented on an issue you're involved with",
|
|
21
|
+
workspace_id: issue.workspace_id,
|
|
22
|
+
})));
|
|
23
|
+
}
|
|
24
|
+
export const config = { event: "comment.created" };
|
|
25
|
+
//# sourceMappingURL=comment-created.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAQA,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;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface IssueAssignedData {
|
|
3
|
+
issue_id: string;
|
|
4
|
+
workspace_id: string;
|
|
5
|
+
actor_id: string;
|
|
6
|
+
assignee_ids: string[];
|
|
7
|
+
}
|
|
8
|
+
export default function handler({ event, container }: SubscriberArgs<IssueAssignedData>): Promise<void>;
|
|
9
|
+
export declare const config: SubscriberConfig;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=issue-assigned.d.ts.map
|
|
@@ -0,0 +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;AAEzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,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,CAiB5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default async function handler({ event, container }) {
|
|
2
|
+
const data = event.data;
|
|
3
|
+
if (!data.assignee_ids?.length)
|
|
4
|
+
return;
|
|
5
|
+
const notifService = container.resolve("notificationModuleService");
|
|
6
|
+
await Promise.all(data.assignee_ids
|
|
7
|
+
.filter(id => id !== data.actor_id)
|
|
8
|
+
.map(userId => notifService.createNotification({
|
|
9
|
+
user_id: userId, entity_type: "issue", entity_id: data.issue_id,
|
|
10
|
+
action: "assigned", message: "You were assigned to an issue",
|
|
11
|
+
workspace_id: data.workspace_id,
|
|
12
|
+
})));
|
|
13
|
+
}
|
|
14
|
+
export const config = { event: "issue.assigned" };
|
|
15
|
+
//# sourceMappingURL=issue-assigned.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AASA,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;KAChC,CAAC,CACH,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface IssueCreatedData {
|
|
3
|
+
issue_id: string;
|
|
4
|
+
project_id: string;
|
|
5
|
+
workspace_id: string;
|
|
6
|
+
actor_id: string;
|
|
7
|
+
assignee_ids: string[] | null;
|
|
8
|
+
reporter_id: string | null;
|
|
9
|
+
}
|
|
10
|
+
export default function handler({ event, container }: SubscriberArgs<IssueCreatedData>): Promise<void>;
|
|
11
|
+
export declare const config: SubscriberConfig;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=issue-created.d.ts.map
|
|
@@ -0,0 +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;AAEzE,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,CAe3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default async function handler({ event, container }) {
|
|
2
|
+
const notifService = container.resolve("notificationModuleService");
|
|
3
|
+
const data = event.data;
|
|
4
|
+
const recipients = new Set();
|
|
5
|
+
if (data.assignee_ids)
|
|
6
|
+
data.assignee_ids.forEach(id => recipients.add(id));
|
|
7
|
+
if (data.reporter_id && data.reporter_id !== data.actor_id)
|
|
8
|
+
recipients.add(data.reporter_id);
|
|
9
|
+
await Promise.all([...recipients].map(userId => notifService.createNotification({
|
|
10
|
+
user_id: userId, entity_type: "issue", entity_id: data.issue_id,
|
|
11
|
+
action: "created",
|
|
12
|
+
message: data.assignee_ids?.includes(userId) ? "You were assigned to a new issue" : "An issue was created in your project",
|
|
13
|
+
workspace_id: data.workspace_id,
|
|
14
|
+
})));
|
|
15
|
+
}
|
|
16
|
+
export const config = { event: "issue.created" };
|
|
17
|
+
//# sourceMappingURL=issue-created.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAoC;IAC1F,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,IAAI,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1E,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,QAAQ;QAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAE5F,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,SAAS;QACjB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,sCAAsC;QAC1H,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CACH,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import multer from "multer";
|
|
2
|
+
/**
|
|
3
|
+
* Multer instance for issue attachment uploads.
|
|
4
|
+
* Files are stored in <projectRoot>/uploads/issue-attachments/.
|
|
5
|
+
* The upload directory must exist before the server starts.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createUpload(uploadDir: string): multer.Multer;
|
|
8
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/utils/upload.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAI3B;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,iBAa7C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import multer from "multer";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
/**
|
|
5
|
+
* Multer instance for issue attachment uploads.
|
|
6
|
+
* Files are stored in <projectRoot>/uploads/issue-attachments/.
|
|
7
|
+
* The upload directory must exist before the server starts.
|
|
8
|
+
*/
|
|
9
|
+
export function createUpload(uploadDir) {
|
|
10
|
+
const storage = multer.diskStorage({
|
|
11
|
+
destination: (_req, _file, cb) => cb(null, uploadDir),
|
|
12
|
+
filename: (_req, file, cb) => {
|
|
13
|
+
const ext = path.extname(file.originalname);
|
|
14
|
+
const base = path.basename(file.originalname, ext)
|
|
15
|
+
.replace(/[^a-zA-Z0-9._-]/g, "_")
|
|
16
|
+
.slice(0, 80);
|
|
17
|
+
cb(null, `${randomUUID()}-${base}${ext}`);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
return multer({ storage, limits: { fileSize: 50 * 1024 * 1024 } });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/utils/upload.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;QACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;iBAC/C,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;iBAChC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACf,EAAE,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,CAAA;QAC3C,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;AACpE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface AssignIssueInput {
|
|
2
|
+
issueId: string;
|
|
3
|
+
assignee_ids: string[];
|
|
4
|
+
actor_id?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare const assignIssueWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<AssignIssueInput, any>;
|
|
7
|
+
//# sourceMappingURL=assign-issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-issue.d.ts","sourceRoot":"","sources":["../../src/workflows/assign-issue.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAwCD,eAAO,MAAM,mBAAmB,2IAgB/B,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
|
|
2
|
+
import { emitEventStep } from "./emit-event.js";
|
|
3
|
+
const fetchIssueForAssignStep = createStep("fetch-issue-for-assign", async (input, { container }) => {
|
|
4
|
+
const svc = container.resolve("issueModuleService");
|
|
5
|
+
const issue = await svc.retrieveIssue(input.issueId);
|
|
6
|
+
return { issue, newAssignees: input.assignee_ids, actor_id: input.actor_id, oldAssignees: issue.assignee_ids ?? [] };
|
|
7
|
+
});
|
|
8
|
+
const setAssigneesStep = createStep("set-issue-assignees", async (input, { container }) => {
|
|
9
|
+
const svc = container.resolve("issueModuleService");
|
|
10
|
+
const updated = await svc.updateIssue(input.issue.id, { assignee_ids: input.newAssignees });
|
|
11
|
+
return new StepResponse(updated, { issueId: input.issue.id, previousAssignees: input.issue.assignee_ids ?? [] });
|
|
12
|
+
}, async ({ issueId, previousAssignees }, { container }) => {
|
|
13
|
+
const svc = container.resolve("issueModuleService");
|
|
14
|
+
await svc.updateIssue(issueId, { assignee_ids: previousAssignees });
|
|
15
|
+
});
|
|
16
|
+
const logAssigneesStep = createStep("log-issue-assignees", async (input, { container }) => {
|
|
17
|
+
const svc = container.resolve("activityModuleService");
|
|
18
|
+
const action = input.assignee_ids.length > 0 ? "assigned" : "unassigned";
|
|
19
|
+
await svc.recordActivity({
|
|
20
|
+
entity_type: "issue", entity_id: input.entity_id,
|
|
21
|
+
actor_id: input.actor_id, action, workspace_id: input.workspace_id,
|
|
22
|
+
changes: { assignee_ids: { from: input.oldAssignees, to: input.assignee_ids } },
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
export const assignIssueWorkflow = createWorkflow("assign-issue", async (input) => {
|
|
26
|
+
const { issue, newAssignees, actor_id, oldAssignees } = await fetchIssueForAssignStep(input);
|
|
27
|
+
const updated = await setAssigneesStep({ issue, newAssignees, actor_id });
|
|
28
|
+
const activityInput = transform(updated, (u) => ({
|
|
29
|
+
entity_id: u.id, actor_id: actor_id ?? "system",
|
|
30
|
+
workspace_id: u.workspace_id, assignee_ids: newAssignees, oldAssignees,
|
|
31
|
+
}));
|
|
32
|
+
await logAssigneesStep(activityInput);
|
|
33
|
+
await emitEventStep({
|
|
34
|
+
name: "issue.assigned",
|
|
35
|
+
data: { issue_id: updated.id, workspace_id: updated.workspace_id, actor_id: actor_id ?? "system", assignee_ids: newAssignees },
|
|
36
|
+
});
|
|
37
|
+
return new WorkflowResponse(updated);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=assign-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-issue.js","sourceRoot":"","sources":["../../src/workflows/assign-issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CompleteSprintInput {
|
|
2
|
+
sprintId: string;
|
|
3
|
+
moveIncompleteToSprintId?: string | null;
|
|
4
|
+
actor_id?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare const completeSprintWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CompleteSprintInput, any>;
|
|
7
|
+
//# sourceMappingURL=complete-sprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-sprint.d.ts","sourceRoot":"","sources":["../../src/workflows/complete-sprint.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAgDD,eAAO,MAAM,sBAAsB,8IAkBlC,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, when, } from "@meridianjs/workflow-engine";
|
|
2
|
+
import { emitEventStep } from "./emit-event.js";
|
|
3
|
+
const fetchSprintStep = createStep("fetch-sprint-for-completion", async (input, { container }) => {
|
|
4
|
+
const svc = container.resolve("sprintModuleService");
|
|
5
|
+
const sprint = await svc.retrieveSprint(input.sprintId);
|
|
6
|
+
if (sprint.status !== "active") {
|
|
7
|
+
throw Object.assign(new Error(`Sprint "${sprint.name}" is not active (status: ${sprint.status})`), { status: 400 });
|
|
8
|
+
}
|
|
9
|
+
return sprint;
|
|
10
|
+
});
|
|
11
|
+
const markSprintCompletedStep = createStep("mark-sprint-completed", async (sprint, { container }) => {
|
|
12
|
+
const svc = container.resolve("sprintModuleService");
|
|
13
|
+
const updated = await svc.completeSprint(sprint.id);
|
|
14
|
+
return new StepResponse(updated, { sprintId: sprint.id, previousStatus: sprint.status });
|
|
15
|
+
}, async ({ sprintId, previousStatus }, { container }) => {
|
|
16
|
+
const svc = container.resolve("sprintModuleService");
|
|
17
|
+
await svc.updateSprint(sprintId, { status: previousStatus });
|
|
18
|
+
});
|
|
19
|
+
const moveIncompleteIssuesStep = createStep("move-incomplete-issues", async (_input, _ctx) => {
|
|
20
|
+
return { moved: 0 };
|
|
21
|
+
});
|
|
22
|
+
const logSprintCompletedStep = createStep("log-sprint-completed", async (input, { container }) => {
|
|
23
|
+
const svc = container.resolve("activityModuleService");
|
|
24
|
+
await svc.recordActivity({
|
|
25
|
+
entity_type: "sprint", entity_id: input.entity_id,
|
|
26
|
+
actor_id: input.actor_id, action: "completed", workspace_id: input.workspace_id,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
export const completeSprintWorkflow = createWorkflow("complete-sprint", async (input) => {
|
|
30
|
+
const sprint = await fetchSprintStep(input);
|
|
31
|
+
const completed = await markSprintCompletedStep(sprint);
|
|
32
|
+
await when(!!input.moveIncompleteToSprintId, () => moveIncompleteIssuesStep({ fromSprintId: sprint.id, toSprintId: input.moveIncompleteToSprintId }));
|
|
33
|
+
const activityInput = transform(completed, (s) => ({
|
|
34
|
+
entity_id: s.id, actor_id: input.actor_id ?? "system", workspace_id: s.project_id,
|
|
35
|
+
}));
|
|
36
|
+
await logSprintCompletedStep(activityInput);
|
|
37
|
+
await emitEventStep({
|
|
38
|
+
name: "sprint.completed",
|
|
39
|
+
data: { sprint_id: completed.id, project_id: completed.project_id, actor_id: input.actor_id ?? "system" },
|
|
40
|
+
});
|
|
41
|
+
return new WorkflowResponse(completed);
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=complete-sprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-sprint.js","sourceRoot":"","sources":["../../src/workflows/complete-sprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CreateIssueInput {
|
|
2
|
+
title: string;
|
|
3
|
+
project_id: string;
|
|
4
|
+
workspace_id: string;
|
|
5
|
+
description?: string | null;
|
|
6
|
+
type?: string;
|
|
7
|
+
priority?: string;
|
|
8
|
+
status?: string;
|
|
9
|
+
assignee_ids?: string[] | null;
|
|
10
|
+
reporter_id?: string | null;
|
|
11
|
+
parent_id?: string | null;
|
|
12
|
+
due_date?: Date;
|
|
13
|
+
estimate?: number | null;
|
|
14
|
+
sprint_id?: string | null;
|
|
15
|
+
task_list_id?: string | null;
|
|
16
|
+
actor_id?: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare const createIssueWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CreateIssueInput, any>;
|
|
19
|
+
//# sourceMappingURL=create-issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.d.ts","sourceRoot":"","sources":["../../src/workflows/create-issue.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAiCD,eAAO,MAAM,mBAAmB,2IAkB/B,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
|
|
2
|
+
import { emitEventStep } from "./emit-event.js";
|
|
3
|
+
const createIssueStep = createStep("create-issue", async (input, { container }) => {
|
|
4
|
+
const svc = container.resolve("issueModuleService");
|
|
5
|
+
const issue = await svc.createIssueInProject({
|
|
6
|
+
title: input.title, project_id: input.project_id, workspace_id: input.workspace_id,
|
|
7
|
+
description: input.description, type: input.type, priority: input.priority,
|
|
8
|
+
status: input.status, assignee_ids: input.assignee_ids ?? null,
|
|
9
|
+
reporter_id: input.reporter_id ?? null, parent_id: input.parent_id ?? null,
|
|
10
|
+
due_date: input.due_date, estimate: input.estimate ?? null,
|
|
11
|
+
sprint_id: input.sprint_id ?? null, task_list_id: input.task_list_id ?? null,
|
|
12
|
+
});
|
|
13
|
+
return new StepResponse(issue, { issueId: issue.id });
|
|
14
|
+
}, async ({ issueId }, { container }) => {
|
|
15
|
+
const svc = container.resolve("issueModuleService");
|
|
16
|
+
await svc.deleteIssue(issueId);
|
|
17
|
+
});
|
|
18
|
+
const logIssueCreatedStep = createStep("log-issue-created", async (input, { container }) => {
|
|
19
|
+
const svc = container.resolve("activityModuleService");
|
|
20
|
+
await svc.recordActivity({
|
|
21
|
+
entity_type: "issue", entity_id: input.entity_id,
|
|
22
|
+
actor_id: input.actor_id, action: "created", workspace_id: input.workspace_id,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
export const createIssueWorkflow = createWorkflow("create-issue", async (input) => {
|
|
26
|
+
const issue = await createIssueStep(input);
|
|
27
|
+
const activityInput = transform(issue, (i) => ({
|
|
28
|
+
entity_id: i.id, actor_id: input.actor_id ?? "system", workspace_id: i.workspace_id,
|
|
29
|
+
}));
|
|
30
|
+
await logIssueCreatedStep(activityInput);
|
|
31
|
+
await emitEventStep({
|
|
32
|
+
name: "issue.created",
|
|
33
|
+
data: {
|
|
34
|
+
issue_id: issue.id, project_id: issue.project_id, workspace_id: issue.workspace_id,
|
|
35
|
+
actor_id: input.actor_id ?? "system",
|
|
36
|
+
assignee_ids: issue.assignee_ids ?? null, reporter_id: issue.reporter_id ?? null,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
return new WorkflowResponse(issue);
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=create-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/workflows/create-issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface InitialStatus {
|
|
2
|
+
name: string;
|
|
3
|
+
key: string;
|
|
4
|
+
color: string;
|
|
5
|
+
category: "backlog" | "unstarted" | "started" | "completed" | "cancelled";
|
|
6
|
+
position: number;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateProjectInput {
|
|
9
|
+
name: string;
|
|
10
|
+
workspace_id: string;
|
|
11
|
+
identifier?: string;
|
|
12
|
+
description?: string | null;
|
|
13
|
+
visibility?: "private" | "public" | "workspace";
|
|
14
|
+
icon?: string | null;
|
|
15
|
+
color?: string | null;
|
|
16
|
+
owner_id?: string | null;
|
|
17
|
+
actor_id?: string | null;
|
|
18
|
+
initial_statuses?: InitialStatus[];
|
|
19
|
+
}
|
|
20
|
+
export declare const createProjectWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CreateProjectInput, any>;
|
|
21
|
+
//# sourceMappingURL=create-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/workflows/create-project.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAA;IACzE,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;CACnC;AAkFD,eAAO,MAAM,qBAAqB,6IAmBjC,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
|
|
2
|
+
import { emitEventStep } from "./emit-event.js";
|
|
3
|
+
const DEFAULT_STATUSES = [
|
|
4
|
+
{ name: "Backlog", key: "backlog", color: "#94a3b8", category: "backlog", position: 0 },
|
|
5
|
+
{ name: "Todo", key: "todo", color: "#64748b", category: "unstarted", position: 1 },
|
|
6
|
+
{ name: "In Progress", key: "in_progress", color: "#6366f1", category: "started", position: 2 },
|
|
7
|
+
{ name: "In Review", key: "in_review", color: "#f59e0b", category: "started", position: 3 },
|
|
8
|
+
{ name: "Done", key: "done", color: "#10b981", category: "completed", position: 4 },
|
|
9
|
+
{ name: "Cancelled", key: "cancelled", color: "#9ca3af", category: "cancelled", position: 5 },
|
|
10
|
+
];
|
|
11
|
+
const validateIdentifierStep = createStep("validate-project-identifier", async (input, { container }) => {
|
|
12
|
+
const svc = container.resolve("projectModuleService");
|
|
13
|
+
const identifier = (input.identifier ?? svc.generateIdentifier(input.name)).toUpperCase();
|
|
14
|
+
const existing = await svc.retrieveProjectByIdentifier(identifier);
|
|
15
|
+
if (existing) {
|
|
16
|
+
throw Object.assign(new Error(`Identifier "${identifier}" is already taken`), { status: 409 });
|
|
17
|
+
}
|
|
18
|
+
return { ...input, identifier };
|
|
19
|
+
});
|
|
20
|
+
const createProjectStep = createStep("create-project", async (input, { container }) => {
|
|
21
|
+
const svc = container.resolve("projectModuleService");
|
|
22
|
+
const project = await svc.createProject({
|
|
23
|
+
name: input.name,
|
|
24
|
+
identifier: input.identifier,
|
|
25
|
+
description: input.description ?? null,
|
|
26
|
+
workspace_id: input.workspace_id,
|
|
27
|
+
visibility: input.visibility ?? "private",
|
|
28
|
+
status: "active",
|
|
29
|
+
icon: input.icon ?? null,
|
|
30
|
+
color: input.color ?? null,
|
|
31
|
+
owner_id: input.owner_id ?? null,
|
|
32
|
+
});
|
|
33
|
+
return new StepResponse(project, { projectId: project.id });
|
|
34
|
+
}, async ({ projectId }, { container }) => {
|
|
35
|
+
const svc = container.resolve("projectModuleService");
|
|
36
|
+
await svc.deleteProject(projectId);
|
|
37
|
+
});
|
|
38
|
+
const seedDefaultStatusesStep = createStep("seed-project-statuses", async (input, { container }) => {
|
|
39
|
+
const svc = container.resolve("projectModuleService");
|
|
40
|
+
const statuses = input.initial_statuses ?? DEFAULT_STATUSES;
|
|
41
|
+
const created = [];
|
|
42
|
+
for (const s of statuses) {
|
|
43
|
+
const status = await svc.createProjectStatus({
|
|
44
|
+
project_id: input.project_id,
|
|
45
|
+
name: s.name, key: s.key, color: s.color,
|
|
46
|
+
category: s.category, position: s.position,
|
|
47
|
+
});
|
|
48
|
+
created.push(status.id);
|
|
49
|
+
}
|
|
50
|
+
return new StepResponse(created, { statusIds: created });
|
|
51
|
+
}, async ({ statusIds }, { container }) => {
|
|
52
|
+
const svc = container.resolve("projectModuleService");
|
|
53
|
+
for (const id of statusIds)
|
|
54
|
+
await svc.deleteProjectStatus(id);
|
|
55
|
+
});
|
|
56
|
+
const logProjectCreatedStep = createStep("log-project-created", async (input, { container }) => {
|
|
57
|
+
const svc = container.resolve("activityModuleService");
|
|
58
|
+
await svc.recordActivity({
|
|
59
|
+
entity_type: "project", entity_id: input.entity_id,
|
|
60
|
+
actor_id: input.actor_id, action: "created", workspace_id: input.workspace_id,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
export const createProjectWorkflow = createWorkflow("create-project", async (input) => {
|
|
64
|
+
const enriched = await validateIdentifierStep(input);
|
|
65
|
+
const project = await createProjectStep(enriched);
|
|
66
|
+
const seedInput = transform(project, (p) => ({
|
|
67
|
+
project_id: p.id, initial_statuses: input.initial_statuses,
|
|
68
|
+
}));
|
|
69
|
+
await seedDefaultStatusesStep(seedInput);
|
|
70
|
+
const activityInput = transform(project, (p) => ({
|
|
71
|
+
entity_id: p.id, actor_id: input.actor_id ?? "system", workspace_id: p.workspace_id,
|
|
72
|
+
}));
|
|
73
|
+
await logProjectCreatedStep(activityInput);
|
|
74
|
+
await emitEventStep({
|
|
75
|
+
name: "project.created",
|
|
76
|
+
data: { project_id: project.id, workspace_id: project.workspace_id, actor_id: input.actor_id ?? "system" },
|
|
77
|
+
});
|
|
78
|
+
return new WorkflowResponse(project);
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/workflows/create-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-event.d.ts","sourceRoot":"","sources":["../../src/workflows/emit-event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,aAAa,iDAMzB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createStep } from "@meridianjs/workflow-engine";
|
|
2
|
+
export const emitEventStep = createStep("emit-event", async (event, { container }) => {
|
|
3
|
+
const eventBus = container.resolve("eventBus");
|
|
4
|
+
await eventBus.emit(event);
|
|
5
|
+
});
|
|
6
|
+
//# sourceMappingURL=emit-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-event.js","sourceRoot":"","sources":["../../src/workflows/emit-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,YAAY,EACZ,KAAK,EAAE,KAAmB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;IACrD,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC,CACF,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface UpdateIssueStatusInput {
|
|
2
|
+
issueId: string;
|
|
3
|
+
status: string;
|
|
4
|
+
actor_id?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare const updateIssueStatusWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<UpdateIssueStatusInput, any>;
|
|
7
|
+
//# sourceMappingURL=update-issue-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-issue-status.d.ts","sourceRoot":"","sources":["../../src/workflows/update-issue-status.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAuCD,eAAO,MAAM,yBAAyB,iJAgBrC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
|
|
2
|
+
import { emitEventStep } from "./emit-event.js";
|
|
3
|
+
const fetchIssueStep = createStep("fetch-issue-for-status-update", async (input, { container }) => {
|
|
4
|
+
const svc = container.resolve("issueModuleService");
|
|
5
|
+
const issue = await svc.retrieveIssue(input.issueId);
|
|
6
|
+
return { issue, newStatus: input.status, actor_id: input.actor_id, oldStatus: issue.status };
|
|
7
|
+
});
|
|
8
|
+
const setIssueStatusStep = createStep("set-issue-status", async (input, { container }) => {
|
|
9
|
+
const svc = container.resolve("issueModuleService");
|
|
10
|
+
const updated = await svc.updateIssue(input.issue.id, { status: input.newStatus });
|
|
11
|
+
return new StepResponse(updated, { issueId: input.issue.id, previousStatus: input.issue.status });
|
|
12
|
+
}, async ({ issueId, previousStatus }, { container }) => {
|
|
13
|
+
const svc = container.resolve("issueModuleService");
|
|
14
|
+
await svc.updateIssue(issueId, { status: previousStatus });
|
|
15
|
+
});
|
|
16
|
+
const logStatusChangedStep = createStep("log-issue-status-changed", async (input, { container }) => {
|
|
17
|
+
const svc = container.resolve("activityModuleService");
|
|
18
|
+
await svc.recordActivity({
|
|
19
|
+
entity_type: "issue", entity_id: input.entity_id,
|
|
20
|
+
actor_id: input.actor_id, action: "status_changed", workspace_id: input.workspace_id,
|
|
21
|
+
changes: { status: { from: input.oldStatus, to: input.newStatus } },
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
export const updateIssueStatusWorkflow = createWorkflow("update-issue-status", async (input) => {
|
|
25
|
+
const { issue, newStatus, actor_id, oldStatus } = await fetchIssueStep(input);
|
|
26
|
+
const updated = await setIssueStatusStep({ issue, newStatus, actor_id });
|
|
27
|
+
const activityInput = transform(updated, (u) => ({
|
|
28
|
+
entity_id: u.id, actor_id: actor_id ?? "system",
|
|
29
|
+
workspace_id: u.workspace_id, newStatus, oldStatus,
|
|
30
|
+
}));
|
|
31
|
+
await logStatusChangedStep(activityInput);
|
|
32
|
+
await emitEventStep({
|
|
33
|
+
name: "issue.status_changed",
|
|
34
|
+
data: { issue_id: updated.id, workspace_id: updated.workspace_id, actor_id: actor_id ?? "system", new_status: newStatus },
|
|
35
|
+
});
|
|
36
|
+
return new WorkflowResponse(updated);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=update-issue-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-issue-status.js","sourceRoot":"","sources":["../../src/workflows/update-issue-status.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@meridianjs/meridian",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Default API routes, workflows, links, and subscribers for Meridian applications",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc --outDir dist --declaration --declarationMap --sourceMap && node -e \"const fs=require('fs');fs.writeFileSync('dist/package.json',JSON.stringify({type:'module'}))\"",
|
|
17
|
+
"dev": "tsc --outDir dist --watch",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"clean": "rm -rf dist",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@meridianjs/framework-utils": "^0.1.0",
|
|
24
|
+
"@meridianjs/workflow-engine": "^0.1.0",
|
|
25
|
+
"@meridianjs/types": "^0.1.1",
|
|
26
|
+
"@meridianjs/workspace": "^0.1.0",
|
|
27
|
+
"@meridianjs/project": "^0.1.0",
|
|
28
|
+
"@meridianjs/issue": "^0.1.0",
|
|
29
|
+
"@meridianjs/sprint": "^0.1.0",
|
|
30
|
+
"multer": "^1.4.5-lts.1",
|
|
31
|
+
"zod": "^3.24.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/multer": "^1.4.12",
|
|
35
|
+
"@types/express": "^5.0.0",
|
|
36
|
+
"tsup": "^8.3.5",
|
|
37
|
+
"tsx": "4.21.0",
|
|
38
|
+
"typescript": "*"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|