Skip to content

feat: global exercise library foundation with admin-only writes - #64

Merged
nick-transition merged 2 commits into
mainfrom
feature/exercise-library-foundation
Jul 1, 2026
Merged

feat: global exercise library foundation with admin-only writes#64
nick-transition merged 2 commits into
mainfrom
feature/exercise-library-foundation

Conversation

@nick-transition

Copy link
Copy Markdown
Owner

Closes #61.

What

Foundation for the global exercise library: a top-level exerciseLibrary Firestore collection readable by any signed-in user, writable only by admins (Firebase Auth custom claim admin: true).

  • Model: lib/models/library_exercise.dart (LibraryExercise) — name, description, videoUrl, tags, aliases, audit fields. Embedded plan exercises (lib/models/exercise.dart) gain an optional libraryExerciseId back-reference for Plan builder: choose exercises from the exercise library #62.
  • Rules: firestore.rules block for exerciseLibrary — authenticated read, admin-claim-only create/update/delete.
  • Rules tests: test/rules/exercise_library_rules.test.js (node:test + @firebase/rules-unit-testing), runnable with npm run test:rules (wraps firebase emulators:exec). 10 tests covering read/create/update/delete for admin, regular user, admin: false claim, and unauthenticated.
  • Admin claim tooling: scripts/set_admin_claim.js grant|revoke <uid-or-email> [--prod] — preserves other custom claims.
  • Seed: scripts/seed_exercise_library.js — 16 common exercises, idempotent (slug-keyed, merge writes), emulator by default, --prod opt-in.
  • Docs: docs/exercise-library.md (schema, access control, claim propagation caveat, seeding, tests); README testing section mentions npm run test:rules.

Verification

  • npm run test:rules — 10/10 pass against the Firestore emulator
  • dart analyze lib/models/… — no issues
  • Smoke-tested both scripts against auth+firestore emulators: seeded 16 entries, granted then revoked the admin claim on a test user

Notes

🤖 Generated with Claude Code

Nick Stoddart and others added 2 commits July 1, 2026 16:22
Adds the /exerciseLibrary Firestore collection as the canonical exercise
catalog (closes #61):

- LibraryExercise Dart model; optional libraryExerciseId back-reference
  on embedded plan exercises
- firestore.rules: authenticated read, writes gated on the `admin`
  custom claim; emulator rules tests via `npm run test:rules`
- scripts/set_admin_claim.js to grant/revoke the admin claim
- scripts/seed_exercise_library.js with 16 common exercises (idempotent)
- docs/exercise-library.md covering schema, access control, seeding

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@nick-transition
nick-transition enabled auto-merge (squash) July 1, 2026 20:56
@nick-transition
nick-transition merged commit 5967bb9 into main Jul 1, 2026
2 checks passed
@nick-transition
nick-transition deleted the feature/exercise-library-foundation branch July 1, 2026 21:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Global exercise library: data model + admin-only writes via custom claims

1 participant