From 6e1c9ca9246b58561e16bf0d15159f7641c262ba Mon Sep 17 00:00:00 2001 From: Lucas Berger Date: Fri, 19 Jun 2026 09:27:35 -0400 Subject: [PATCH] docs: complete v1.2 research (stack, features, architecture, pitfalls) - STACK.md: google-auth-library@10.7.0 + @googleapis/calendar@15.0.0 scoped packages (vs monolithic googleapis), OAuth2 flow, token storage, Google Calendar API event/reminder model - FEATURES.md: 6 feature categories (multi-provider, self-service onboarding, multiple reminders, dark mode, zero-setup DB, dev/CI stub), dependency graph, feature prioritization - ARCHITECTURE.md: CalendarProvider interface, provider factory, CalDavProvider wrapper, GoogleCalendarProvider, MockProvider, provider_tokens table schema, multi-reminder JSON column, OAuth callback routing, 7-component data flows - PITFALLS.md: 11 critical/medium pitfalls (refresh token 7-day expiry in testing status, Google recurrence mismatch, syncToken 410, timezone handling, provider abstraction regression, VALARM dedup key, auto-migrate failures, dark mode FOWT, OAuth callback through tunnel, token encryption, ESLint 10 breaking changes) Co-Authored-By: Claude Opus 4.8 (1M context) --- .planning/research/ARCHITECTURE.md | 961 ++++++++++++++--------------- .planning/research/FEATURES.md | 557 +++++++++-------- .planning/research/PITFALLS.md | 611 +++++++++--------- .planning/research/STACK.md | 372 ++++++++++- 4 files changed, 1446 insertions(+), 1055 deletions(-) diff --git a/.planning/research/ARCHITECTURE.md b/.planning/research/ARCHITECTURE.md index bf75fcb..db1554d 100644 --- a/.planning/research/ARCHITECTURE.md +++ b/.planning/research/ARCHITECTURE.md @@ -1,598 +1,591 @@ # Architecture Research -**Domain:** FamilySync v1.1 — integration analysis for Operability & Polish milestone -**Researched:** 2026-06-10 -**Confidence:** HIGH (grounded in actual codebase) - -## Standard Architecture - -### System Overview - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ React PWA (apps/pwa/src/) │ -│ ┌──────────────┐ ┌──────────────┐ ┌───────────────────────────┐ │ -│ │ EventForm.tsx│ │SettingsSheet │ │ [NEW] SetupWizard / │ │ -│ │ + reminder │ │ + Admin tab │ │ AdminSettings │ │ -│ │ selector │ │ │ │ │ │ -│ └──────┬───────┘ └──────┬───────┘ └────────────┬──────────────┘ │ -│ │ api/client.ts (typed fetch wrappers) │ │ -└─────────┼──────────────────────────────────────┬─┴───────────────┘ - │ │ - ▼ HTTP / SSE ▼ HTTP -┌──────────────────────────────────────────────────────────────────┐ -│ Hono API (apps/api/src/index.ts) │ -│ ┌──────────────┐ ┌────────────┐ ┌──────────────────────────────┐│ -│ │ routes/ │ │ routes/ │ │ [NEW] routes/admin.ts + ││ -│ │ events.ts │ │ push.ts │ │ routes/setup.ts ││ -│ │ (enqueue to │ │ │ │ (role-gated credential mgmt, ││ -│ │ outbox) │ │ │ │ first-run wizard endpoints) ││ -│ └──────┬───────┘ └────────────┘ └──────────────────────────────┘│ -│ │ │ -│ ┌──────▼──────────────────────────────────────────────────────┐ │ -│ │ broker/ │ │ -│ │ outboxWorker.ts (15s setInterval + NEW event-driven drain) │ │ -│ │ reminderScheduler.ts (1-min setInterval, MODIFIED: per- │ │ -│ │ event VALARM lead, variable window) │ │ -│ │ poller.ts (5-min setInterval, UNCHANGED) │ │ -│ │ vevent.ts [MODIFIED: buildVeventString adds VALARM] │ │ -│ │ sync.ts [MODIFIED: extract VALARM -> reminder_lead_minutes] │ │ -│ │ crypto.ts (AES-256-GCM, REUSED by admin credential writes) │ │ -│ └──────┬──────────────────────────────────────────────────────┘ │ -└─────────┼────────────────────────────────────────────────────────┘ - │ - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ Data layer (apps/api/src/db/) │ -│ schema.ts: users (+is_admin), calendars, calendarEvents │ -│ (+reminder_lead_minutes), calendarOutbox, │ -│ memberCredentials, pushSubscriptions, lists, ... │ -│ [NEW] app_config table (setup_complete flag, etc.) │ -│ │ -│ MariaDB (mariadb:11) + Redis (7-alpine, ioredis for pub/sub) │ -└──────────────────────────────────────────────────────────────────┘ -``` - -### Component Responsibilities - -| Component | File | Responsibility | v1.1 Status | -| -------------------- | ------------------------------------------- | ---------------------------------------- | --------------------------------------------------- | -| Event form | `apps/pwa/src/components/EventForm.tsx` | Create/edit event UI | MODIFY: add reminder selector | -| Settings sheet | `apps/pwa/src/components/SettingsSheet.tsx` | Notifications toggle | MODIFY: add Admin section | -| API client | `apps/pwa/src/api/client.ts` | Typed fetch wrappers | MODIFY: admin + setup endpoints | -| Events route | `apps/api/src/routes/events.ts` | Calendar CRUD, outbox enqueue | MODIFY: pass reminder in payload, signal drain | -| Push route | `apps/api/src/routes/push.ts` | VAPID subscription management | UNCHANGED | -| VEVENT builder | `apps/api/src/broker/vevent.ts` | iCalendar string construction | MODIFY: add VALARM | -| CalDAV sync | `apps/api/src/broker/sync.ts` | Fastmail REPORT -> DB upsert | MODIFY: extract VALARM trigger | -| Outbox worker | `apps/api/src/broker/outboxWorker.ts` | CalDAV write-back drain | MODIFY: event-driven trigger subscription | -| Reminder scheduler | `apps/api/src/broker/reminderScheduler.ts` | Push reminders for events | MODIFY: variable VALARM-based lead | -| Poller | `apps/api/src/broker/poller.ts` | 5-min CalDAV sync | UNCHANGED | -| Crypto | `apps/api/src/broker/crypto.ts` | AES-256-GCM encrypt/decrypt | UNCHANGED (reused by admin) | -| DB schema | `apps/api/src/db/schema.ts` | Drizzle table definitions | MODIFY: is_admin, reminder_lead_minutes, app_config | -| Index / wiring | `apps/api/src/index.ts` | App bootstrap + worker startup | MODIFY: mount admin + setup routes | -| [NEW] Admin route | `apps/api/src/routes/admin.ts` | Role-gated credential + calendar mgmt | NEW | -| [NEW] Setup route | `apps/api/src/routes/setup.ts` | First-run wizard endpoints + validation | NEW | -| [NEW] Admin UI | `apps/pwa/src/components/AdminSettings.tsx` | Member credential UI, shared-cal picker | NEW | -| [NEW] Setup wizard | `apps/pwa/src/components/SetupWizard.tsx` | First-run guided bootstrap | NEW | -| [NEW] Outbox trigger | `apps/api/src/lib/outboxTrigger.ts` | In-process EventEmitter for drain signal | NEW | -| [NEW] CI workflow | `.gitea/workflows/ci.yml` | Lint/typecheck/test on PR | NEW | +**Domain:** v1.2 Integration Architecture — Multi-Provider, Theming & Zero-Setup +**Researched:** 2026-06-19 +**Confidence:** HIGH (based on direct codebase inspection) --- -## Feature Integration Analysis +## Context: What This Document Covers -### (a) Per-Event Reminders: VALARM Authoring + Variable-Lead Scheduling +This file is scoped to how the v1.2 features integrate with the existing v1.1 codebase. It does not re-describe the existing architecture (see `docs/ARCHITECTURE.md`). Every component listed here is either NEW or MODIFIED; existing components that are untouched are mentioned only as integration anchor points. -#### Write path — what changes +--- -**`apps/pwa/src/components/EventForm.tsx`** — MODIFY +## Feature Integration Map -Add a "Reminder" `