kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import { eq } from "drizzle-orm";
2import { Hono } from "hono";
3import { describeRoute, resolver, validator } from "hono-openapi";
4import * as v from "valibot";
5import db from "../database";
6import { externalLinkTable } from "../database/schema";
7import { workspaceAccess } from "../utils/workspace-access-middleware";
8
9const externalLinkSchema = v.object({
10 id: v.string(),
11 taskId: v.string(),
12 integrationId: v.string(),
13 resourceType: v.string(),
14 externalId: v.string(),
15 url: v.string(),
16 title: v.nullable(v.string()),
17 metadata: v.any(),
18 createdAt: v.date(),
19 updatedAt: v.date(),
20});
21
22const externalLink = new Hono<{
23 Variables: {
24 userId: string;
25 workspaceId: string;
26 };
27}>().get(
28 "/task/:taskId",
29 describeRoute({
30 operationId: "getExternalLinksByTask",
31 tags: ["External Links"],
32 description: "Get all external links for a task",
33 responses: {
34 200: {
35 description: "External links for the task",
36 content: {
37 "application/json": {
38 schema: resolver(v.array(externalLinkSchema)),
39 },
40 },
41 },
42 },
43 }),
44 validator("param", v.object({ taskId: v.string() })),
45 workspaceAccess.fromTaskId("taskId"),
46 async (c) => {
47 const { taskId } = c.req.valid("param");
48
49 const links = await db.query.externalLinkTable.findMany({
50 where: eq(externalLinkTable.taskId, taskId),
51 with: {
52 integration: true,
53 },
54 });
55
56 const formattedLinks = links.map((link) => ({
57 ...link,
58 metadata: link.metadata ? JSON.parse(link.metadata) : null,
59 }));
60
61 return c.json(formattedLinks);
62 },
63);
64
65export default externalLink;