kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import {
2 createExternalLink,
3 findExternalLinkByTaskAndType,
4} from "../../github/services/link-manager";
5import {
6 formatIssueBody,
7 formatIssueTitle,
8 getLabelsForIssue,
9} from "../../github/utils/format";
10import type { PluginContext, TaskCreatedEvent } from "../../types";
11import type { GiteaConfig } from "../config";
12import { createGiteaClient } from "../utils/gitea-api";
13import { addLabelsToIssueGitea } from "../utils/labels";
14
15export async function handleTaskCreated(
16 event: TaskCreatedEvent,
17 context: PluginContext,
18): Promise<void> {
19 const config = context.config as GiteaConfig;
20 if (!config.baseUrl || !config.accessToken) {
21 return;
22 }
23
24 const { repositoryOwner, repositoryName } = config;
25
26 const existingLink = await findExternalLinkByTaskAndType(
27 event.taskId,
28 context.integrationId,
29 "issue",
30 );
31
32 if (existingLink) {
33 return;
34 }
35
36 try {
37 const client = createGiteaClient(config);
38 const createdIssue = await client.createIssue(
39 repositoryOwner,
40 repositoryName,
41 {
42 title: formatIssueTitle(event.title),
43 body: formatIssueBody(event.description, event.taskId),
44 },
45 );
46
47 await createExternalLink({
48 taskId: event.taskId,
49 integrationId: context.integrationId,
50 resourceType: "issue",
51 externalId: createdIssue.number.toString(),
52 url: createdIssue.html_url,
53 title: createdIssue.title,
54 metadata: {
55 state: createdIssue.state,
56 createdFrom: "kaneo",
57 lastOutboundStateSyncAt: Date.now(),
58 },
59 });
60
61 const labels = getLabelsForIssue(event.priority, event.status);
62 await addLabelsToIssueGitea(config, createdIssue.number, labels);
63 } catch (error) {
64 console.error("Failed to create Gitea issue:", error);
65 }
66}