1
0
cvsa/packages/tracker/lib/db/schema.ts

152 lines
4.8 KiB
TypeScript

import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
import { relations } from "drizzle-orm";
// Users table
export const users = sqliteTable("users", {
id: text("id").primaryKey(),
username: text("username").notNull(),
password: text("password_hash").notNull(),
isAdmin: integer("is_admin", { mode: "boolean" }).default(false),
createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
});
// Sessions table for authentication
export const sessions = sqliteTable("sessions", {
id: text("id").primaryKey(),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
expiresAt: integer("expires_at", { mode: "timestamp" }).notNull(),
createdAt: integer("created_at", { mode: "timestamp" }).notNull()
});
// Project permissions table
export const projectPermissions = sqliteTable("project_permissions", {
id: text("id").primaryKey(),
projectId: text("project_id")
.notNull()
.references(() => projects.id, { onDelete: "cascade" }),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
canEdit: integer("can_edit", { mode: "boolean" }).default(false),
createdAt: integer("created_at", { mode: "timestamp" }).notNull()
});
// Projects table
export const projects = sqliteTable("projects", {
id: text("id").primaryKey(),
ownerId: text("owner_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
name: text("name").notNull(),
description: text("description"),
isPublic: integer("is_public", { mode: "boolean" }).default(false),
createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
});
// Columns table for Kanban board
export const columns = sqliteTable("columns", {
id: text("id").primaryKey(),
projectId: text("project_id")
.notNull()
.references(() => projects.id, { onDelete: "cascade" }),
name: text("name").notNull(),
position: integer("position").notNull(),
createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
});
// Tasks table
export const tasks = sqliteTable("tasks", {
id: text("id").primaryKey(),
projectId: text("project_id")
.notNull()
.references(() => projects.id, { onDelete: "cascade" }),
columnId: text("column_id")
.notNull()
.references(() => columns.id, { onDelete: "cascade" }),
title: text("title").notNull(),
description: text("description"),
priority: text("priority", { enum: ["low", "medium", "high"] }).default("medium"),
dueDate: integer("due_date", { mode: "timestamp" }),
createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull()
});
// Relations
export const usersRelations = relations(users, ({ many }) => ({
ownedProjects: many(projects, { relationName: "owner" }),
projectPermissions: many(projectPermissions),
sessions: many(sessions)
}));
export const sessionsRelations = relations(sessions, ({ one }) => ({
user: one(users, {
fields: [sessions.userId],
references: [users.id]
})
}));
export const projectsRelations = relations(projects, ({ one, many }) => ({
owner: one(users, {
fields: [projects.ownerId],
references: [users.id],
relationName: "owner"
}),
permissions: many(projectPermissions),
columns: many(columns),
tasks: many(tasks)
}));
export const projectPermissionsRelations = relations(projectPermissions, ({ one }) => ({
project: one(projects, {
fields: [projectPermissions.projectId],
references: [projects.id]
}),
user: one(users, {
fields: [projectPermissions.userId],
references: [users.id]
})
}));
export const columnsRelations = relations(columns, ({ one, many }) => ({
project: one(projects, {
fields: [columns.projectId],
references: [projects.id]
}),
tasks: many(tasks)
}));
export const tasksRelations = relations(tasks, ({ one }) => ({
project: one(projects, {
fields: [tasks.projectId],
references: [projects.id]
}),
column: one(columns, {
fields: [tasks.columnId],
references: [columns.id]
})
}));
// Types
export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
export type Session = typeof sessions.$inferSelect;
export type NewSession = typeof sessions.$inferInsert;
export type Project = typeof projects.$inferSelect;
export type NewProject = typeof projects.$inferInsert;
export type ProjectPermission = typeof projectPermissions.$inferSelect;
export type NewProjectPermission = typeof projectPermissions.$inferInsert;
export type Column = typeof columns.$inferSelect;
export type NewColumn = typeof columns.$inferInsert;
export type Task = typeof tasks.$inferSelect;
export type NewTask = typeof tasks.$inferInsert;