Admins can now add users directly from the admin portal via a modal
form (name, email, password). Created users are pre-approved and can
log in immediately.
- POST /api/admin/users endpoint (AddUserHandler, AddUserCommand)
- Add user modal in AdminPage with inline error handling
- 5 new integration tests covering auth, happy path, duplicate email,
and immediate login; fix SQLite file-lock on test cleanup via
SqliteConnection.ClearAllPools()
- 4 new E2E tests covering modal open/close, happy path, and duplicate
email error
Remove unused `auth` prop from AdminPage (and its call site in App.tsx)
and unused `maxDate` variable in PlannerPage. Both triggered TS6133 under
noUnusedLocals, causing `npm run build` to exit with code 2 in Docker.
Consistent with ReservationFactory — moves Reconstitute out of the entity
into a dedicated factory class, and makes the reconstitution constructor
internal to restrict direct instantiation to within the domain assembly.
Adds unit tests for all three factories.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GitHub Actions runner IP is banned from Docker Hub. Using
public.ecr.aws/docker/library as a temporary workaround.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
randall/frontend and randall/backend were being resolved as docker.io
paths, causing unwanted registry auth attempts. The localhost/ prefix
marks them as local-only images. Also restores docker/setup-buildx-action
with the docker driver, and reverts the ECR Public mirror workaround
since it was never the root cause.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avoids Docker Hub rate limits and auth issues in CI by using
public.ecr.aws/docker/library instead of docker.io.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the Reconstitute static method on Reservation with a dedicated
ReservationFactory class. The reconstitution constructor is now internal,
restricting direct instantiation to within the domain assembly while
keeping the factory as the explicit entry point for rehydrating from storage.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduce dedicated *Record POCOs (ReservationRecord, UserRecord,
WorkplaceRecord) as EF Core targets, keeping domain entities free of
persistence concerns. Static mapper classes handle conversion between
layers, and repositories track (domain, record) pairs to sync mutations
back before saving. Domain entities gain Reconstitute() factory methods
to bypass validation when rehydrating from storage.
Also fixes GetByEmployeeAsync to exclude past reservations (Date >= today).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add BuildKit cache mounts for NuGet and npm to persist package
caches across builds
- Skip redundant restore on dotnet publish with --no-restore
- Add --prefer-offline to npm ci to prefer cached tarballs
- Tag images as randall/backend:latest and randall/frontend:latest
via compose image: key
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>