chore: update TASK-15 backlog status to Done

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-24 21:13:53 -08:00
parent c27290ee80
commit f4b453183e
1 changed files with 26 additions and 2 deletions

View File

@ -1,10 +1,10 @@
--- ---
id: TASK-15 id: TASK-15
title: 'EncryptID personal subdomains: <user>.r*.online with local-first data' title: 'EncryptID personal subdomains: <user>.r*.online with local-first data'
status: In Progress status: Done
assignee: [] assignee: []
created_date: '2026-02-25 03:01' created_date: '2026-02-25 03:01'
updated_date: '2026-02-25 03:54' updated_date: '2026-02-25 04:48'
labels: labels:
- architecture - architecture
- auth - auth
@ -72,3 +72,27 @@ This is a cross-cutting feature affecting all rStack apps. Key areas:
<!-- SECTION:NOTES:BEGIN --> <!-- SECTION:NOTES:BEGIN -->
Research complete - EncryptID uses DID format (did:key:z<base64url>, 50+ chars). DIDs too long for DNS labels (63 char limit). Username-based subdomains recommended but usernames are currently optional. Research complete - EncryptID uses DID format (did:key:z<base64url>, 50+ chars). DIDs too long for DNS labels (63 char limit). Username-based subdomains recommended but usernames are currently optional.
<!-- SECTION:NOTES:END --> <!-- SECTION:NOTES:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Implemented username-based personal subdomains (`<username>.rnotes.online`) across 8 phases:
**Phase 1 - Infrastructure**: DNS wildcard and Traefik routing already configured. Cloudflared needs manual `*.rnotes.online` entry.
**Phase 2 - EncryptID**: Server already enforces username UNIQUE NOT NULL + includes in JWT. SDK updated: made `username` required in `EncryptIDClaims` type, updated `createSession()`.
**Phase 3 - Schema**: Added `workspaceSlug` field to Notebook model with index + migration SQL.
**Phase 4 - Middleware**: Sets `x-workspace-slug` header from subdomain extraction. New `workspace.ts` helper.
**Phase 5 - API Filtering**: All GET endpoints filter by workspace on subdomains (notebooks, notes, search, notebook detail, notebook notes).
**Phase 6 - AppSwitcher**: Fetches `/api/me` for username, generates `<username>.r*.online` links when logged in.
**Phase 7 - Sessions**: `SubdomainSession` component syncs localStorage ↔ `.rnotes.online` domain-wide cookie. `authFetch` falls back to domain cookie.
**Phase 8 - Migration**: Auto-assigns unscoped notebooks to user's workspace on auth.
**Manual steps remaining**: Remove stale container on netcup, run migration, add cloudflared wildcard entry.
<!-- SECTION:FINAL_SUMMARY:END -->