kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import {
2 findExternalLinksByTask,
3 updateExternalLink,
4} from "../../github/services/link-manager";
5import type { PluginContext, TaskStatusChangedEvent } from "../../types";
6import type { GiteaConfig } from "../config";
7import { createGiteaClient } from "../utils/gitea-api";
8import { addLabelsToIssueGitea, removeLabelGitea } from "../utils/labels";
9
10export async function handleTaskStatusChanged(
11 event: TaskStatusChangedEvent,
12 context: PluginContext,
13): Promise<void> {
14 const config = context.config as GiteaConfig;
15 if (!config.baseUrl || !config.accessToken) {
16 return;
17 }
18
19 const { repositoryOwner, repositoryName } = config;
20
21 try {
22 const links = await findExternalLinksByTask(event.taskId);
23 const issueLink = links.find(
24 (link) =>
25 link.integrationId === context.integrationId &&
26 link.resourceType === "issue",
27 );
28
29 if (!issueLink) {
30 return;
31 }
32
33 const client = createGiteaClient(config);
34 const issueNumber = Number.parseInt(issueLink.externalId, 10);
35
36 await removeLabelGitea(config, issueNumber, `status:${event.oldStatus}`);
37
38 await addLabelsToIssueGitea(config, issueNumber, [
39 `status:${event.newStatus}`,
40 ]);
41
42 if (event.newStatus === "done") {
43 await client.updateIssue(repositoryOwner, repositoryName, issueNumber, {
44 state: "closed",
45 });
46
47 await updateExternalLink(issueLink.id, {
48 metadata: {
49 ...(issueLink.metadata ? JSON.parse(issueLink.metadata) : {}),
50 state: "closed",
51 lastOutboundStateSyncAt: Date.now(),
52 },
53 });
54 } else if (event.oldStatus === "done" && event.newStatus !== "done") {
55 await client.updateIssue(repositoryOwner, repositoryName, issueNumber, {
56 state: "open",
57 });
58
59 await updateExternalLink(issueLink.id, {
60 metadata: {
61 ...(issueLink.metadata ? JSON.parse(issueLink.metadata) : {}),
62 state: "open",
63 lastOutboundStateSyncAt: Date.now(),
64 },
65 });
66 }
67 } catch (error) {
68 console.error("Failed to update Gitea issue status:", error);
69 }
70}