kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import { eq, inArray, or } from "drizzle-orm";
2import db from "../../database";
3import { taskRelationTable, taskTable, userTable } from "../../database/schema";
4
5async function getTaskRelations(taskId: string) {
6 const relations = await db
7 .select({
8 id: taskRelationTable.id,
9 sourceTaskId: taskRelationTable.sourceTaskId,
10 targetTaskId: taskRelationTable.targetTaskId,
11 relationType: taskRelationTable.relationType,
12 createdAt: taskRelationTable.createdAt,
13 })
14 .from(taskRelationTable)
15 .where(
16 or(
17 eq(taskRelationTable.sourceTaskId, taskId),
18 eq(taskRelationTable.targetTaskId, taskId),
19 ),
20 );
21
22 const taskIds = new Set<string>();
23 for (const rel of relations) {
24 taskIds.add(rel.sourceTaskId);
25 taskIds.add(rel.targetTaskId);
26 }
27
28 const tasks = new Map<
29 string,
30 {
31 id: string;
32 title: string;
33 status: string;
34 priority: string | null;
35 number: number | null;
36 projectId: string;
37 userId: string | null;
38 assigneeName: string | null;
39 }
40 >();
41
42 if (taskIds.size > 0) {
43 const taskRows = await db
44 .select({
45 id: taskTable.id,
46 title: taskTable.title,
47 status: taskTable.status,
48 priority: taskTable.priority,
49 number: taskTable.number,
50 projectId: taskTable.projectId,
51 userId: taskTable.userId,
52 assigneeName: userTable.name,
53 })
54 .from(taskTable)
55 .leftJoin(userTable, eq(taskTable.userId, userTable.id))
56 .where(inArray(taskTable.id, [...taskIds]));
57
58 for (const task of taskRows) {
59 tasks.set(task.id, task);
60 }
61 }
62
63 return relations.map((rel) => ({
64 ...rel,
65 sourceTask: tasks.get(rel.sourceTaskId) ?? null,
66 targetTask: tasks.get(rel.targetTaskId) ?? null,
67 }));
68}
69
70export default getTaskRelations;