124 lines
5.0 KiB
Markdown
124 lines
5.0 KiB
Markdown
# Sis Implementation Plan
|
|
|
|
**Goal:** Build the complete Sis household chore tracker per BUILD_TASKS.md — auth, households, chores/schedules, activity recording, PWA, all styled with NeoBrutalismCSS.
|
|
|
|
**Architecture:** Monolithic Haskell/Orb backend serving JSON API routes + SQLite persistence. Mithril.js SPA frontend with client-side routing. Session-based auth via httpOnly cookies with PBKDF2-hashed passwords using `crypton`. All household-scoped data is protected by session middleware.
|
|
|
|
**Tech Stack:** Haskell (GHC 9.10), Orb/Warp, sqlite-simple, crypton (PBKDF2), aeson, Mithril.js v2, TypeScript, NeoBrutalismCSS CDN.
|
|
|
|
**Product decisions:**
|
|
- Any member can manage chores (edit/delete) — collaborative model
|
|
- Activity records are append-only (no edit/undo)
|
|
- "Anyone" chores: completing an occurrence clears it for the whole household
|
|
- Recurring: specific day-of-week/month, not just "every N days"
|
|
- Occurrences generated 90 days ahead, rolling window
|
|
|
|
---
|
|
|
|
## Phase 0 — Foundation: DB schema + session infrastructure
|
|
|
|
### Task 0.1: Database schema migrations
|
|
- **Files:** `src/Sis/Database.hs`
|
|
- Add `runMigrations` that creates all tables on startup: users, sessions, households, memberships, invites, chores, occurrences, activities.
|
|
|
|
### Task 0.2: Password hashing module
|
|
- **Files:** New `src/Sis/Auth.hs`
|
|
- PBKDF2 via crypton: `hashPassword`, `verifyPassword`, `generateSessionToken` (32 random bytes hex), session cookie handling.
|
|
|
|
### Task 0.3: Session middleware
|
|
- **Files:** `src/Sis/Server.hs`, `src/Sis/Auth.hs`
|
|
- Extract session token from cookie, load user, attach to request context. Auth-required routes check for valid user.
|
|
|
|
---
|
|
|
|
## Phase 1 — Auth routes (Milestone 1)
|
|
|
|
### Task 1.1: Auth route types + handlers
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- POST /api/auth/signup, POST /api/auth/login, POST /api/auth/logout, GET /api/auth/me
|
|
- Validate unique email, password strength, matching confirmation.
|
|
|
|
### Task 1.2: Frontend auth pages
|
|
- **Files:** `frontend/src/components/LoginPage.ts`, `frontend/src/components/SignupPage.ts`
|
|
- Signup form with inline validation. Login form with "remember me". Client-side router integration.
|
|
|
|
### Task 1.3: Password reset
|
|
- **Files:** `src/Sis/Server.hs`, `frontend/src/components/ForgotPassword.ts`
|
|
- POST /api/auth/forgot-password (generates reset token), POST /api/auth/reset-password (consumes token).
|
|
|
|
---
|
|
|
|
## Phase 2 — Households (Milestone 2)
|
|
|
|
### Task 2.1: Household CRUD routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- POST /api/households, GET /api/households, GET /api/households/:id, PUT /api/households/:id, DELETE /api/households/:id
|
|
- GET /api/households/:id/members, DELETE /api/households/:id/members/:userId
|
|
|
|
### Task 2.2: Invite routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- POST /api/households/:id/invites, GET /api/households/:id/invites, DELETE /api/households/:id/invites/:inviteId
|
|
- GET /api/invites/:code (public lookup), POST /api/invites/:code/accept
|
|
|
|
### Task 2.3: Frontend household pages
|
|
- **Files:** `frontend/src/components/HouseholdPage.ts`, `frontend/src/components/HouseholdList.ts`, `frontend/src/components/CreateHousehold.ts`
|
|
- Household switcher, member list, invite panel.
|
|
|
|
---
|
|
|
|
## Phase 3 — Chores (Milestone 3)
|
|
|
|
### Task 3.1: Chore CRUD routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- GET /api/households/:id/chores, POST /api/households/:id/chores, PUT /api/households/:id/chores/:id, DELETE /api/households/:id/chores/:id
|
|
|
|
### Task 3.2: Occurrence generation logic
|
|
- **Files:** `src/Sis/Database.hs` (for occurrence queries)
|
|
- Generate rolling 90-day window of occurrences from recurring schedules. Recompute on schedule edit.
|
|
|
|
### Task 3.3: Dashboard routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- GET /api/households/:id/dashboard — returns overdue, due-today, completed-today stats and lists.
|
|
|
|
### Task 3.4: Frontend chore + dashboard pages
|
|
- **Files:** `frontend/src/components/DashboardPage.ts`, `frontend/src/components/ChoreList.ts`, `frontend/src/components/ChoreForm.ts`
|
|
|
|
---
|
|
|
|
## Phase 4 — Activity (Milestone 4)
|
|
|
|
### Task 4.1: Activity record routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- POST /api/occurrences/:id/activity
|
|
|
|
### Task 4.2: Activity log routes
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- GET /api/households/:id/activity?member=&status=&page=&perPage=
|
|
|
|
### Task 4.3: Frontend activity pages
|
|
- **Files:** `frontend/src/components/RecordActivity.ts`, `frontend/src/components/ActivityLog.ts`
|
|
|
|
---
|
|
|
|
## Phase 5 — PWA (Milestone 5)
|
|
|
|
### Task 5.1: Manifest + service worker
|
|
- **Files:** `frontend/public/manifest.json`, `frontend/public/sw.js`
|
|
- Web app manifest, basic offline service worker.
|
|
|
|
### Task 5.2: Frontend polish, routing, navigation
|
|
- **Files:** `frontend/src/router.ts`, `frontend/src/components/Layout.ts`, `frontend/public/style.css`
|
|
- Client-side router, nav bar, responsive layouts, all nav links.
|
|
|
|
---
|
|
|
|
## Phase 6 — Seed data + tests (Milestone 6)
|
|
|
|
### Task 6.1: Seed data route
|
|
- **Files:** `src/Sis/Server.hs`
|
|
- POST /api/seed — creates demo household with sample chores, members, activity.
|
|
|
|
### Task 6.2: Backend tests
|
|
- **Files:** `test/Spec.hs`
|
|
- Test auth flow, household CRUD, chore CRUD, activity recording.
|