aboutsummaryrefslogtreecommitdiff
path: root/src/lib/server/services/projects.ts
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-09-07 11:32:41 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-09-07 11:32:41 +0200
commit18a0f9c874aaa09c0f71252dad853c23f9511ed6 (patch)
tree93103b83f6d0057c40f0bab9c9473bf04292e9c4 /src/lib/server/services/projects.ts
parent113415ce357a9cea1759d0452ebae6352f8fe36b (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.ts38
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;
+}