diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-07 11:32:41 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-07 11:32:41 +0200 |
| commit | 18a0f9c874aaa09c0f71252dad853c23f9511ed6 (patch) | |
| tree | 93103b83f6d0057c40f0bab9c9473bf04292e9c4 /src/lib/server/services/projects.ts | |
| parent | 113415ce357a9cea1759d0452ebae6352f8fe36b (diff) | |
Add projects with routines, urgency tracking and health scores
Projects group recurring routines (chores included) with an append-only
snapshot table (id, version) so edits never rewrite history; completions
reference the exact snapshot. Pure metrics compute due dates, urgency
buckets (ok/due/late/veryLate) and 0-100 health scores per routine,
project, and globally. Home page lists projects; project dashboard sorts
routines most-urgent first with one-tap completion and interval parser
inputs (1d/2w/3m/1y).
Diffstat (limited to 'src/lib/server/services/projects.ts')
| -rw-r--r-- | src/lib/server/services/projects.ts | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/lib/server/services/projects.ts b/src/lib/server/services/projects.ts new file mode 100644 index 0000000..b58c2f1 --- /dev/null +++ b/src/lib/server/services/projects.ts @@ -0,0 +1,38 @@ +import { db as defaultDb } from '$lib/server/db'; +import { projects } from '$lib/server/db/schema'; +import { asc, eq } from 'drizzle-orm'; +import type { AppDatabase } from './groceries'; +import type { Project } from './types'; + +export async function loadAll(db = defaultDb): Promise<Project[]> { + return db + .select() + .from(projects) + .where(eq(projects.archived, false)) + .orderBy(asc(projects.name)); +} + +export async function add(name: string, db = defaultDb): Promise<Project> { + const [inserted] = await db.insert(projects).values({ name }).returning(); + return inserted; +} + +export async function rename( + id: number, + name: string, + db = defaultDb, +): Promise<void> { + await db.update(projects).set({ name }).where(eq(projects.id, id)); +} + +export async function archive(id: number, db = defaultDb): Promise<void> { + await db.update(projects).set({ archived: true }).where(eq(projects.id, id)); +} + +export async function getById( + id: number, + db = defaultDb, +): Promise<Project | undefined> { + const [project] = await db.select().from(projects).where(eq(projects.id, id)); + return project; +} |
