docs: correct rrule drift (code uses ical.js RecurExpansion) + minor fixes
Publish / publish (push) Successful in 11s
Publish / publish (push) Successful in 11s
Recurrence expansion uses ical.js ICAL.RecurExpansion, not the rrule library (never installed/imported). Also fix playwright-cli path (/usr/bin), prod-compose service count (two, post-Redis-removal), and CI job count (six). Found via /gsd-docs-update --verify-only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c7955a46b9
commit
6ade8d59bf
+1
-1
@@ -385,7 +385,7 @@ Calendar data is read from a MariaDB cache populated by the CalDAV broker poller
|
||||
|
||||
### `GET /api/events?start=YYYY-MM-DD&end=YYYY-MM-DD`
|
||||
|
||||
Returns a flat array of concrete event occurrences for the given date window. Recurring events are expanded server-side via `rrule`. The window is capped at 90 days. Returns events from calendars the member owns plus any shared (family) calendars.
|
||||
Returns a flat array of concrete event occurrences for the given date window. Recurring events are expanded server-side via `ical.js` (`ICAL.RecurExpansion`). The window is capped at 90 days. Returns events from calendars the member owns plus any shared (family) calendars.
|
||||
|
||||
**Query parameters**
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ graph TD
|
||||
subgraph "API (apps/api — Hono on Node 22)"
|
||||
AUTH["Auth Layer\n(local session + OIDC middleware)"]
|
||||
ROUTES["API Routes\n/events /lists /me /push /sse\n/admin /setup /auth"]
|
||||
BROKER["CalDAV Broker\n(tsdav + ical.js + rrule)"]
|
||||
BROKER["CalDAV Broker\n(tsdav + ical.js)"]
|
||||
OUTBOX["Outbox Worker\n(15s drain loop)"]
|
||||
POLLER["CalDAV Poller\n(5-min setInterval)"]
|
||||
REMINDER["Reminder Scheduler\n(1-min setInterval)"]
|
||||
@@ -108,7 +108,7 @@ familysync/
|
||||
| `app` (Hono) | `apps/api/src/index.ts` | Root Hono app; mounts all routes and serves the PWA static build |
|
||||
| Drizzle schema | `apps/api/src/db/schema.ts` | Single source of truth for all table definitions (`users`, `memberCredentials`, `localCredentials`, `calendars`, `calendarEvents`, `calendarOutbox`, `lists`, `listShares`, `listItems`, `pushSubscriptions`, `appConfig`) |
|
||||
| `syncCalendar` | `apps/api/src/broker/sync.ts` | REPORT → ical.js parse → `onDuplicateKeyUpdate` upsert into MariaDB |
|
||||
| `expandOccurrences` | `apps/api/src/broker/expand.ts` | Server-side RRULE expansion using `ical.js` + `rrule`; never runs in the browser |
|
||||
| `expandOccurrences` | `apps/api/src/broker/expand.ts` | Server-side RRULE expansion using `ical.js` (`ICAL.RecurExpansion`); never runs in the browser |
|
||||
| `CalendarOccurrence` | `apps/api/src/broker/expand.ts` | Wire type for a single concrete event occurrence; mirrored in the PWA's `api/client.ts` |
|
||||
| `calendarOutbox` table | `apps/api/src/db/schema.ts` | Transactional outbox pattern — CalDAV writes are enqueued here and drained asynchronously |
|
||||
| `runOutboxDrain` | `apps/api/src/broker/outboxWorker.ts` | Drains pending outbox rows every 15s; handles retry backoff, 412 conflict, dead-lettering, and edit-as-move ordering |
|
||||
@@ -132,7 +132,7 @@ familysync/
|
||||
1. On mount, the PWA's `CalendarShell` computes a date window and fires `fetchEvents(start, end)` via TanStack Query.
|
||||
2. `GET /api/events?start=&end=` hits the Hono `eventsRouter`.
|
||||
3. The route queries `calendarEvents` + `calendars` from MariaDB, filtering by the authenticated user's accessible calendars.
|
||||
4. Raw `rawVevent` blobs are passed through `expandOccurrences()` (ical.js + rrule) to produce concrete `CalendarOccurrence` objects for the window.
|
||||
4. Raw `rawVevent` blobs are passed through `expandOccurrences()` (ical.js `ICAL.RecurExpansion`) to produce concrete `CalendarOccurrence` objects for the window.
|
||||
5. The JSON response is cached by TanStack Query; Schedule-X renders the events.
|
||||
|
||||
### Calendar write (create/edit/delete)
|
||||
@@ -243,7 +243,7 @@ routes/setup.ts ──→ db (app_config)
|
||||
| Auth IdP | Authelia (pre-deployed, external) — OIDC authorization code + PKCE; optional when local auth is enabled |
|
||||
| Session middleware | `@hono/oidc-auth` (OIDC session — storage-less signed JWT cookies) + custom `localSession.ts` (local-auth HS256 JWT cookie) |
|
||||
| Calendar source | Fastmail CalDAV (`caldav.fastmail.com`) — read via `tsdav`, write via transactional outbox |
|
||||
| Calendar parsing | `ical.js` (VCALENDAR/VEVENT parse) + `rrule` (RRULE expansion) |
|
||||
| Calendar parsing | `ical.js` (VCALENDAR/VEVENT parse + RRULE expansion via `ICAL.RecurExpansion`) |
|
||||
| App password storage | AES-256-GCM encrypted in `member_credentials.encrypted_password` |
|
||||
| Local auth storage | scrypt PHC hash in `local_credentials.password_hash`; session signed with `LOCAL_SESSION_SECRET` env var |
|
||||
| Push notifications | `web-push` (VAPID) → APNs (iOS) / FCM (Android) |
|
||||
|
||||
+1
-1
@@ -203,7 +203,7 @@ Every PR to `main` runs through `.gitea/workflows/ci.yml`. A `changes` path-filt
|
||||
| `security` | Every PR | Gitleaks secret scan (PR diff); `pnpm audit` (High+Critical blocking) + outdated report on code-change PRs |
|
||||
| `gate` | Always | Final aggregator — requires `fast-checks` and `security` to succeed; `api` and `harness` may be skipped |
|
||||
|
||||
All five jobs must pass (or be legitimately skipped) before a PR can merge. See [docs/TESTING.md](TESTING.md) for test suite details.
|
||||
All six jobs must pass (or be legitimately skipped) before a PR can merge. See [docs/TESTING.md](TESTING.md) for test suite details.
|
||||
|
||||
### CI dependency caches
|
||||
|
||||
|
||||
+1
-1
@@ -199,7 +199,7 @@ No coverage thresholds are configured in either `vitest.config.ts`. There is no
|
||||
|
||||
CI runs on a self-hosted Gitea Actions runner and triggers on every pull request targeting `main` (`.gitea/workflows/ci.yml`). A `changes` job using `dorny/paths-filter@v4` determines whether the PR touches code (as opposed to docs or planning files only). The `api` and `harness` jobs are skipped for doc-only PRs.
|
||||
|
||||
Five jobs run in total — `fast-checks` and `security` always run; `api`, `harness`, and `changes` run conditionally.
|
||||
Six jobs run in total — `changes`, `fast-checks`, `security`, and `gate` always run; `api` and `harness` run conditionally (skipped on doc-only PRs).
|
||||
|
||||
### `fast-checks`
|
||||
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ Self-hosted Docker deployment on Unraid behind Authelia OIDC and a Pangolin/Newt
|
||||
| Docker Compose (dev override) | `docker-compose.dev.yml` |
|
||||
| Container image | `apps/api/Dockerfile` (multi-stage, built from repo root) |
|
||||
|
||||
The production compose file brings up three services:
|
||||
The production compose file brings up two services:
|
||||
|
||||
| Service | Image | Purpose |
|
||||
| --------- | ---------------------------------------------------- | --------------------------------------------------- |
|
||||
|
||||
Reference in New Issue
Block a user