tiqued/src/lib/server/db/schema/tasks.ts
themodrnhakr 450bcf173f Add task related tables.
Pivoting from "records" to a combination of "tasks", "micro-tasks",
"assets", and a few others.
2025-09-26 21:49:36 -05:00

72 lines
2.0 KiB
TypeScript

import { relations, sql } from "drizzle-orm";
import { type AnySQLiteColumn, check, int, sqliteTable, text } from "drizzle-orm/sqlite-core";
export type TaskIntegrationConfigs = {
source_control: Array<{
repo_id: string;
commits: Array<{
hash: string;
message: string;
description?: string;
}>;
}>;
};
export const taskTypes = sqliteTable("task_types", {
id: int("id").primaryKey({ autoIncrement: true }),
name: text("name").unique(),
prefix: text("prefix").unique(),
}, (table) => [
check("prefix_limit", sql`LENGTH(${table.prefix}) <=2`),
]);
export const taskTypesRelations = relations(taskTypes, ({ many }) => ({
tasks: many(tasks),
}));
export const tasks = sqliteTable("tasks", {
id: int("id").primaryKey({ autoIncrement: true }),
taskId: text("task_id").unique(),
description: text("description"),
type: int("type").references(() => taskTypes.id),
subtype: text("subtype"),
openDate: text("open_date").$type<Date["toISOString"]>(),
closeDate: text("close_date").$type<Date["toISOString"]>(),
status: text("status"),
priority: text("priority"),
parent: int("parent").references((): AnySQLiteColumn => tasks.id),
body: text("body"),
bodyHistory: text("body_history"),
checklist: text("checklist", { mode: "json" }).$type<
{
enabled: boolean;
entries: Array<{
group?: string;
sort_order: number;
checked: boolean;
text: string;
}>;
}
>(),
updateChain: text("udpate_chain", { mode: "json" }).$type<
{
enabled: boolean;
entries: Array<{
updated_on: Date["toISOString"];
updated_by: string;
body: string;
}>;
}
>(),
integrations: text("integrations", { mode: "json" }).$type<
{ type: keyof TaskIntegrationConfigs; config: TaskIntegrationConfigs["source_control"] }
>(),
});
export const tasksRelations = relations(tasks, ({ one }) => ({
type: one(taskTypes, {
fields: [tasks.type],
references: [taskTypes.id],
}),
}));