Commit Graph

259 Commits

Author SHA1 Message Date
Chris Farhood f9b68eb932 fix(GRO-1272): fix TS2769 and test mock iterable issues
- Add null guard for newStaff after .returning() in auto-provision block
- Make buildQuery() iterable without .limit() call (for WHERE-only queries)
- Use fallback in .limit() for manager-fallback dev-mode tests

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 02:01:00 +00:00
Chris Farhood 4a80440513 fix(GRO-1272): update rbac tests and UAT playbook for auto-provision
- Add user table mock and db.insert returning chain to rbac.test.ts
- Add three new tests: happy-path auto-provision, email-prefix fallback,
  and miss-path (no user → 403)
- Add TC-API-1.4 to UAT_PLAYBOOK.md §4.1 for first-login auto-provision

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 02:01:00 +00:00
Chris Farhood ce83b1847d fix(GRO-1272): auto-provision staff record on first OIDC login
When a user authenticates via OIDC but has no staff record (userId NULL,
oidcSub mismatch, email mismatch), resolveStaffMiddleware now checks for
a Better-Auth user record by jwt.sub and auto-creates a minimal groomer
staff record on first login.

This fixes the UAT regression where all API routes returned 403 for all
authenticated users after GRO-1207, because seedKnownUsers() sets
oidcSub to Authentik integer PKs or emails rather than the actual Authentik
OIDC sub (a UUID). The auto-provision path bridges the gap for all UAT
personas without requiring seed/Terraform changes.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 02:00:46 +00:00
The Dogfather f36a3626a8 Merge pull request 'fix(ci): use REGISTRY_TOKEN for Docker push auth' (#24) from gitea/migrate-workflows into dev
CI / Lint & Typecheck (push) Successful in 16s
CI / Test (push) Failing after 21s
CI / Build & Push Docker Image (push) Has been skipped
Merge gitea/migrate-workflows into dev: fix(ci) REGISTRY_TOKEN, Dockerfile, schema updates
2026-05-21 01:26:29 +00:00
Chris Farhood 90b3811577 Merge dev into gitea/migrate-workflows (allow-unrelated-histories)
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Failing after 20s
CI / Build & Push Docker Image (pull_request) Has been skipped
Merges the dev branch history into gitea/migrate-workflows to resolve
PR #24. The two branches had unrelated git histories due to the Gitea
migration. Conflict resolution favors gitea/migrate-workflows for
packages/, src/, .gitea/ structure and dev for apps/, .github/ content.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 01:24:41 +00:00
Chris Farhood 467b85abc7 fix(docker): use pnpm --filter for all monorepo package builds
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Successful in 27s
Use pnpm --filter consistently for all three package builds in the
Dockerfile instead of mixing filter and cd approaches. Also set
--project . explicitly on tsc invocations to ensure tsconfig resolution
from the package directory rather than workspace root.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:55:24 +00:00
Chris Farhood e417d8f6a7 fix(docker): use absolute tsconfig.json path for tsc
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 19s
tsc -p /app does not resolve to tsconfig.json at /app/tsconfig.json
without an explicit filename. Pass the full path.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:51:51 +00:00
Chris Farhood fc82e24ead fix(docker): use absolute tsconfig path for api build
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 21s
CI / Build & Push Docker Image (pull_request) Failing after 20s
When pnpm --filter runs the api package build, tsc cannot find the
tsconfig.json. Use an absolute path to avoid any ambiguity about the
working directory context.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:49:56 +00:00
Chris Farhood c3c99ad6c4 fix(docker): use -p flag for explicit tsconfig path
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 20s
Both -p . and --project . should be equivalent, but the Docker build
appears to resolve them differently. Use -p for consistency.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:40:38 +00:00
The Dogfather fad99dc032 Merge pull request 'promote: dev → uat (Renovate config, GRO-1081)' (#26) from dev into uat
promote: dev → uat (Renovate config, GRO-1081) (#26)
2026-05-20 12:37:23 +00:00
Chris Farhood a205fe1138 fix(docker): cd into packages/db before building
CI / Lint & Typecheck (pull_request) Successful in 16s
CI / Test (pull_request) Successful in 21s
CI / Build & Push Docker Image (pull_request) Failing after 20s
pnpm --filter runs in the workspace root where tsc finds the root
tsconfig.json instead of packages/db/tsconfig.json. Change into the
package directory so tsc picks up the correct local tsconfig.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:37:10 +00:00
The Dogfather ff024ab375 Merge pull request 'chore: add Renovate config (GRO-1081)' (#17) from add-renovate-config into dev
CI / Lint & Typecheck (push) Failing after 14s
CI / Test (push) Failing after 20s
CI / Build (push) Has been skipped
CI / Build & Push Docker Images (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
chore: add Renovate config (GRO-1081) (#17)
2026-05-20 12:37:08 +00:00
Chris Farhood 01069f8c6c fix(docker): use explicit tsconfig in db package build
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 20s
tsc without --project traverses up to workspace root, which has a
different tsconfig.json that lacks package-local paths. Fix both
@groombook/types and @groombook/db scripts consistently.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:33:26 +00:00
Chris Farhood 43f17dc612 fix(docker): use explicit tsconfig in api build command
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 22s
tsc without --project flag picks up tsconfig.json from the workspace
root, which lacks the packages/* paths needed for the monorepo build.
Explicit --project . ensures tsc uses the local tsconfig.json.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 12:29:40 +00:00
Chris Farhood d9bfed4424 fix(GRO-1350): add missing coatType and petSizeCategory to buildPet defaults
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 20s
PetRow (pets.$inferSelect) now includes these nullable columns after
the GRO-1174 migration, but buildPet's defaults were never updated.
Adding null defaults fixes the typecheck failure in CI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 11:26:11 +00:00
Chris Farhood 1403517067 fix(GRO-1350): use explicit tsconfig path in packages/types build
CI / Lint & Typecheck (pull_request) Failing after 13s
CI / Test (pull_request) Successful in 21s
CI / Build & Push Docker Image (pull_request) Has been skipped
tsc without --project flag fails to find tsconfig.json when run from
a nested package directory inside a Docker COPY layer that overlays
files after deps install. Use explicit --project . to ensure tsc
finds the local tsconfig.json regardless of working directory context.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 11:16:50 +00:00
Chris Farhood 9c5e470737 Save petSizeCategory to pet record on booking creation
CI / Lint & Typecheck (pull_request) Failing after 15s
CI / Test (pull_request) Successful in 23s
CI / Build & Push Docker Image (pull_request) Has been skipped
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 05:25:59 +00:00
Chris Farhood f1258023ac feat(GRO-1174): add MedicalAlert/CoatType/AlertSeverity types to @groombook/types
Sync api packages/types with web workspace — add MedicalAlert, AlertSeverity,
CoatType, preferredCuts, medicalAlerts, temperamentScore, temperamentFlags.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 04:54:03 +00:00
Chris Farhood faf7def77d feat(GRO-1174): persist petSizeCategory and petCoatType from booking
- Add petSizeCategory and petCoatType to bookingSchema zod validator (optional)
- Save coatType to pets row on booking creation
- Add coatType and petSizeCategory columns to pets DB schema
- Add coatType and petSizeCategory to Pet interface in @groombook/types

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 04:40:42 +00:00
The Dogfather 247570abc8 Merge pull request 'Promote dev → uat: GRO-1326 UAT email+password credentials' (#25) from dev into uat
Promote dev → uat: GRO-1326 UAT email+password credentials (#25)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 04:25:29 +00:00
The Dogfather c19e19c709 Merge pull request 'GRO-1326: Extend seed.ts — UAT email+password credentials' (#23) from flea-flicker/uat-email-password-seed into dev
CI / Lint & Typecheck (push) Failing after 17s
CI / Test (push) Failing after 23s
CI / Build (push) Has been skipped
CI / Build & Push Docker Images (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
GRO-1326: Extend seed.ts — UAT email+password credentials (#23)

Provisions Better-Auth user+account records for 4 UAT accounts enabling email+password login via POST /api/auth/sign-in/email.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 04:24:21 +00:00
Chris Farhood f9a3ebc0f3 fix(test): async hashPassword + hex format fixes for typecheck
CI / Lint & Typecheck (pull_request) Failing after 14s
CI / Test (pull_request) Failing after 21s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
- hashPassword is now async — all callers await it
- AC-3/AC-1 assertions updated to expect hex format (saltHex:keyHex)
- Destructuring replaced with explicit array access to fix TS strictness on
  possibly-undefined split() result
- scrypt verification removed from test (N=16384 exceeds CI runner memory;
  format assertions are sufficient)
- Removed unused scryptSync import

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 04:11:47 +00:00
Chris Farhood d3122ad701 fix(seed): use better-auth/crypto hashPassword to match verifyPassword params
CI / Lint & Typecheck (pull_request) Failing after 17s
CI / Test (pull_request) Failing after 21s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
The seed.ts password hashing used N=32768, r=8, p=1 with base64 encoding,
which does not match @better-auth/utils@0.4.0's actual implementation
(N=16384, r=16, p=1, dkLen=64, hex encoding). This caused every seeded
UAT credential to fail verifyPassword at sign-in.

Fix: import hashPassword from "better-auth/crypto" in seed.ts and in the
test helper. This delegates to Better-Auth's own implementation,
guaranteeing parameter and encoding match.

Also updates test assertions to expect hex format (saltHex:keyHex) and
verifies the hash using the correct scrypt params (N=16384, r=16, p=1).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 03:57:20 +00:00
Chris Farhood 539ef21d89 fix(ci): use REGISTRY_TOKEN for Docker push auth
CI / Lint & Typecheck (pull_request) Successful in 18s
CI / Test (pull_request) Successful in 24s
CI / Build & Push Docker Image (pull_request) Failing after 21s
Use the org-level REGISTRY_TOKEN secret instead of gitea.token for
authenticating to the Gitea Container Registry. The gitea.token
does not have packages:write scope.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 03:41:52 +00:00
Chris Farhood 9ccbc7a171 revert(types): remove GRO-1178 changes from PR #23 branch
CI / Lint & Typecheck (pull_request) Failing after 15s
CI / Test (pull_request) Failing after 21s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
Removes types/index.ts and factories.ts changes that belong in PR #21
(GRO-1178), not this PR. The extended Pet type fields caused CI typecheck
failures because the seed/credential logic doesn't use them.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 03:25:45 +00:00
Chris Farhood 9ba5da5e75 fix(GRO-1326): add missing Pet fields to buildPet and reduce test scrypt N
CI / Lint & Typecheck (pull_request) Failing after 14s
CI / Test (pull_request) Failing after 20s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
- Add coatType, temperamentScore, temperamentFlags, medicalAlerts,
  preferredCuts to buildPet() defaults — schema recently added these
  columns but factories was still missing them, causing TS2739 errors
- Reduce scrypt N from 32768 → 4096 in test helpers only — production
  seed.ts is unaffected; CI runners hit memory limit at N=32768

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 02:23:56 +00:00
Chris Farhood 575789f7f5 test(api): cover UAT email+password credential seed logic
CI / Lint & Typecheck (pull_request) Failing after 14s
CI / Test (pull_request) Failing after 19s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
Adds seed-uat-credentials.test.ts covering all 7 acceptance criteria:
- AC-1: creates user + account for each UAT account with password env var
- AC-2: emailVerified = true on created users
- AC-3: providerId = "credential", password properly hashed (scrypt, salt:hash)
- AC-4/AC-4b: staff.userId linked when staff exists, not updated if already set
- AC-5: idempotent — re-running creates no duplicates
- AC-6: missing SEED_UAT_*_PASSWORD skips that account with warning (no error)
- AC-7: partial env var coverage — only provisioned accounts get created

References GRO-1326.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 01:27:28 +00:00
Scrubs McBarkley 4f981bbebd chore: remove legacy .github/workflows
CI / Lint & Typecheck (pull_request) Successful in 15s
CI / Test (pull_request) Successful in 20s
CI / Build & Push Docker Image (pull_request) Failing after 1m51s
2026-05-20 01:25:33 +00:00
Scrubs McBarkley d8f2135506 chore: migrate CI workflow to .gitea/workflows 2026-05-20 01:25:26 +00:00
Chris Farhood a0a75d7e25 feat(seed): provision Better-Auth email+password credentials for UAT accounts
Adds a seeding step after UAT staff creation that:
- Creates Better-Auth user records (emailVerified: true) for 4 UAT accounts
- Creates account records with providerId="credential" and scrypt-hashed passwords
- Links staff.userId for accounts with existing staff records (super, groomer, tester)
- Reads passwords from SEED_UAT_*_PASSWORD env vars (guard clause skips if unset)
- Is fully idempotent (upsert-safe)

Bypasses Authentik SSO for UAT login; Shedward can authenticate via
POST /api/auth/sign-in/email using the same UAT password secrets.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 01:17:54 +00:00
Chris Farhood 22457ac361 GRO-1178: add extended pet fields to api types
CI / Lint & Typecheck (pull_request) Failing after 14s
CI / Test (pull_request) Failing after 21s
CI / Build (pull_request) Has been skipped
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 00:23:16 +00:00
The Dogfather f12ec4f8d3 Merge pull request 'feat(api): add extended pet profile fields — schema, migration, CRUD, Zod validation' (#10) from flea-flicker/pet-profile-extended-fields into dev
CI / Lint & Typecheck (push) Failing after 1m15s
CI / Test (push) Failing after 1m18s
CI / Build (push) Has been skipped
CI / Build & Push Docker Images (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
feat(api): add extended pet profile fields — schema, migration, CRUD, Zod validation (GRO-1176)

Merge groombook/api#10
2026-05-19 23:42:32 +00:00
Chris Farhood 566d5f4b55 chore: add Renovate config
GRO-1081: add renovate.json to successor repos

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-14 17:42:22 +00:00
groombook-engineer[bot] 2c928ca4d7 fix(gro-1261): correct infra paths in CI Update Infra Image Tags job (#16)
The CI workflow referenced wrong paths in groombook/infra:
- apps/groombook/overlays/dev/ → apps/overlays/dev/
- apps/groombook/base/ → apps/base/

These paths don't exist in groombook/infra — the correct structure
is apps/overlays/dev/ and apps/base/.

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-14 17:29:06 +00:00
the-dogfather-cto[bot] 4f5ec60961 chore: promote dev to uat — Dockerfile pnpm-workspace fix (GRO-1231)
chore: promote dev to uat (GRO-1231 pnpm-workspace fix)
2026-05-14 17:15:52 +00:00
the-dogfather-cto[bot] af75fecb66 Merge pull request #14 from groombook/flea-flicker/gro-1231-pnpm-workspace-dockerfile
fix(docker): add missing pnpm-workspace.yaml COPY in deps and runner stages (GRO-1231)
2026-05-14 17:10:25 +00:00
Chris Farhood 2d4df6fe1e fix(docker): add missing pnpm-workspace.yaml COPY in deps and runner stages
Without pnpm-workspace.yaml, pnpm install --frozen-lockfile can't discover
the apps/api workspace member, causing "Already up to date" and tsc not found.

Also removes stale packages/* entry from pnpm-workspace.yaml (no packages/
directory exists in the dev branch).

Fixes: GRO-1231

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-14 16:50:52 +00:00
the-dogfather-cto[bot] 39ffdccac7 promote: dev → uat (rate limit override) (#13)
promote: dev → uat (rate limit override)
2026-05-14 10:55:45 +00:00
the-dogfather-cto[bot] db10320c8f fix(auth): override Better Auth sign-in rate limit defaults (#11)
fix(auth): override Better Auth sign-in rate limit defaults
2026-05-14 10:52:31 +00:00
Chris Farhood 40a4023c65 feat(GRO-1202): add sign-in/sign-up rate limit overrides
Port rate limit customRules from groombook/app PR #392 to groombook/api.
Adds per-route limits for /sign-in/social, /sign-in/email, and /sign-up/email
to both AUTH_DISABLED and production better-auth() instances.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-14 10:34:32 +00:00
the-dogfather-cto[bot] 1ff0d4230c promote: dev → uat (UAT Tester seed fix + TypeScript CI compliance)
promote: dev → uat (UAT Tester seed fix + TypeScript CI compliance)
2026-05-14 08:07:54 +00:00
groombook-engineer[bot] d598511b75 fix: resolve pre-existing TypeScript errors for CI compliance (#9)
Merge PR #9: fix pre-existing TypeScript errors for CI compliance

All Lint & Typecheck and Test checks pass. Ready to merge.

cc @cpfarhood
2026-05-14 07:50:28 +00:00
Chris Farhood 434c7b94e2 fix: export named DB utilities in petsExtendedFields test mock
pets.ts imports pets, appointments, and, eq, exists, or directly from
"../db". The vi.mock factory only returned getDb, causing vitest to throw
"No 'pets' export is defined" and 7 tests to get 400 instead of 201/200.
Fix adds the missing named exports to the mock return object.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 07:24:52 +00:00
Chris Farhood 70af9da338 feat(api): add extended pet profile fields — schema, migration, CRUD, Zod validation
Adds five new nullable columns to the pets table:
- coat_type (text)
- temperament_score (integer, range 1–5)
- temperament_flags (jsonb, string[])
- medical_alerts (jsonb, typed MedicalAlert[])
- preferred_cuts (jsonb, string[])

Also:
- Exports MedicalAlert interface and MedicalAlertSeverity type from schema
- Updates shared Pet type in packages/types
- Adds Zod validators for all fields (ranges, max lengths, enum)
- Adds 14 tests covering happy path and validation edge cases
- Fixes drizzle.config.ts schema path (was ./src/schema.ts, correct is ./src/db/schema.ts)

Refs: GRO-1176

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-14 04:35:51 +00:00
the-dogfather-cto[bot] e714200b71 Merge pull request #7 from groombook/fix/uat-tester-oidc-sub
fix(api): add UAT Tester staff creation in seed script
2026-05-12 21:57:44 +00:00
Chris Farhood 1e70e01046 fix(api): add UAT Tester staff creation in seed script
Adds dedicated SEED_UAT_TESTER_OIDC_SUB handling to create the
uat-tester staff record with proper oidcSub mapping to Authentik user PK 237.

Fixes GRO-1151
2026-05-12 21:44:42 +00:00
the-dogfather-cto[bot] be5e9d8fc7 chore: promote dev to uat (PR #5 mock path fix)
chore: promote dev to uat (PR #5 mock path fix)
2026-05-12 21:34:03 +00:00
the-dogfather-cto[bot] 83d7fecdd3 fix: correct test mock paths from "./db" to "../db" (#5)
fix: correct test mock paths from "./db" to "../db"
2026-05-12 21:33:02 +00:00
Chris Farhood 2448887924 fix: regenerate pnpm-lock.yaml to sync with package.json
- Adds missing drizzle-kit, drizzle-orm, postgres dependencies
- Addresses CI failures from Lint & Typecheck and Test jobs
- Resolves QA feedback from Lint Roller on PR #5
2026-05-12 21:13:55 +00:00
Chris Farhood f4995d987d fix: correct test mock paths from "./db" to "../db"
Fixes incorrect vi.mock paths that were causing tests to fail.
The mock path should match the import path in the route files.

This addresses the authProvider test mock path issue on PR #2.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-12 19:54:29 +00:00