152 lines
4.8 KiB
TypeScript
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;
|