516 Commits

Author SHA1 Message Date
Chris Farhood 3604049222 Add .mcp.json
CI / Test (push) Successful in 1m20s
CI / Lint & Typecheck (push) Successful in 1m23s
CI / Build (push) Successful in 31s
CI / E2E Tests (push) Failing after 3m59s
CI / Web E2E (Dev) (push) Has been skipped
CI / Build & Push Docker Images (push) Has been skipped
CI / Deploy PR to groombook-dev (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
2026-05-24 18:14:26 +00:00
Chris Farhood 8f2deaa6d7 Delete opencode.json
CI / Test (push) Successful in 58s
CI / Lint & Typecheck (push) Successful in 55s
CI / Build (push) Successful in 25s
CI / E2E Tests (push) Successful in 2m14s
CI / Build & Push Docker Images (push) Successful in 1m27s
CI / Deploy PR to groombook-dev (push) Has been skipped
CI / Update Infra Image Tags (push) Failing after 0s
CI / Web E2E (Dev) (push) Has been skipped
2026-05-24 18:14:06 +00:00
Scrubs McBarkley 9e8723de57 Merge pull request 'fix(ci): use REGISTRY_TOKEN + E2E DinD networking on main' (#424) from fix/ci-registry-auth-main into main
CI / Deploy PR to groombook-dev (push) Has been skipped
CI / Web E2E (Dev) (push) Has been skipped
CI / Lint & Typecheck (push) Successful in 22s
CI / Test (push) Successful in 24s
CI / Build (push) Successful in 21s
CI / Build & Push Docker Images (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
CI / E2E Tests (push) Failing after 3m32s
fix(ci): use REGISTRY_TOKEN + E2E DinD networking on main

Merging per GRO-1355 org-wide PR backlog cleanup.
2026-05-20 12:10:22 +00:00
Scrubs McBarkley e037748c85 Merge pull request 'docs: archive monorepo and link to successor repos (GRO-1081)' (#411) from archived-readme into main
CI / Lint & Typecheck (push) Successful in 21s
CI / Test (push) Successful in 24s
CI / Deploy PR to groombook-dev (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
CI / Build (push) Successful in 23s
CI / Web E2E (Dev) (push) Has been skipped
CI / E2E Tests (push) Failing after 3m34s
CI / Build & Push Docker Images (push) Has been skipped
docs(GRO-1081): archive monorepo, link to successor repos

Merging per GRO-1355 org-wide PR backlog cleanup.
2026-05-20 12:10:19 +00:00
Chris Farhood 93716afd1a fix(ci): use REGISTRY_TOKEN + E2E DinD networking on main
CI / Update Infra Image Tags (pull_request) Has been skipped
CI / Lint & Typecheck (pull_request) Successful in 24s
CI / Test (pull_request) Successful in 24s
CI / Build (pull_request) Successful in 23s
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Web E2E (Dev) (pull_request) Has been skipped
CI / E2E Tests (pull_request) Failing after 3m27s
CI / Deploy PR to groombook-dev (pull_request) Has been skipped
- Change Docker login password from gitea.token to secrets.REGISTRY_TOKEN
- Add PLAYWRIGHT_BASE_URL env var for E2E DinD networking
- GRO-1345

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 10:56:40 +00:00
The Dogfather 503c3dbdbb Merge pull request 'chore: migrate .github/workflows to .gitea/workflows' (#422) from gitea/migrate-workflows into main
CI / Lint & Typecheck (push) Successful in 21s
CI / Test (push) Successful in 23s
CI / E2E Tests (push) Failing after 4m18s
CI / Deploy PR to groombook-dev (push) Has been skipped
CI / Web E2E (Dev) (push) Has been skipped
CI / Build (push) Successful in 22s
CI / Build & Push Docker Images (push) Has been skipped
CI / Update Infra Image Tags (push) Has been skipped
chore: migrate .github/workflows to .gitea/workflows

Migrate all 4 workflow files from GitHub Actions to Gitea Actions:
- ci.yml, promote-prod.yml, promote-to-uat.yml (renamed)
- helm-release.yml (recreated for Gitea Pages)
- Registry: ghcr.io → git.farh.net
- Auth: github-app-token → gitea.token
- API calls: gh CLI / actions/github-script → Gitea REST API

Part of GRO-1315.
2026-05-20 01:34:07 +00:00
Scrubs McBarkley b3517bf746 chore: remove legacy .github/workflows
CI / Test (pull_request) Successful in 24s
CI / Lint & Typecheck (pull_request) Successful in 23s
CI / Build (pull_request) Successful in 23s
CI / Build & Push Docker Images (pull_request) Has been skipped
CI / Update Infra Image Tags (pull_request) Has been skipped
CI / E2E Tests (pull_request) Failing after 4m22s
CI / Deploy PR to groombook-dev (pull_request) Has been skipped
CI / Web E2E (Dev) (pull_request) Has been skipped
2026-05-20 01:30:11 +00:00
Scrubs McBarkley 604e79bab4 chore: remove legacy .github/workflows 2026-05-20 01:30:09 +00:00
Scrubs McBarkley 29015cffec chore: remove legacy .github/workflows 2026-05-20 01:30:08 +00:00
Scrubs McBarkley c67f731f69 chore: remove legacy .github/workflows 2026-05-20 01:30:06 +00:00
Scrubs McBarkley db3bcf8094 chore: migrate workflows to .gitea/ 2026-05-20 01:29:57 +00:00
Scrubs McBarkley 7836511baa chore: migrate workflows to .gitea/ 2026-05-20 01:29:54 +00:00
Scrubs McBarkley b69650af15 chore: migrate workflows to .gitea/ 2026-05-20 01:29:52 +00:00
Scrubs McBarkley b0d1a4def4 chore: migrate workflows to .gitea/ 2026-05-20 01:29:50 +00:00
Chris Farhood d407b895be docs: archive monorepo and link to successor repos
GRO-1081: Execute groombook/app monorepo decommission

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-14 17:39:49 +00:00
scrubs-mcbarkley-ceo[bot] 53ab415713 promote: uat → main (GRO-887/GRO-958 chart hygiene)
promote: uat → main (GRO-887/GRO-958 chart hygiene)
2026-05-03 18:16:03 +00:00
The Dogfather a330e342e1 Merge main into uat to resolve PR #373 conflicts
Conflicts:
- apps/api/src/routes/invoices.ts — kept uat's stripeRefundId field (GRO-818)
- packages/db/src/seed.ts — kept main's deterministic stripePaymentIntentId
  population (GRO-890); removed duplicate uat declaration that survived auto-merge

Brings GRO-609 (refund/stats fixes), GRO-890 (seed stripe pi), GRO-898 (CI dev
branch) and prior GRO-865 logo proxy promote from main into uat so the
uat → main promote (GRO-958) becomes mergeable.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-03 18:03:59 +00:00
the-dogfather-cto[bot] 0f841e27fc Merge pull request #371 from groombook/dev
chore(uat): promote dev → uat (includes GRO-887 chart hygiene)
2026-05-03 17:58:14 +00:00
groombook-engineer[bot] a7bcce8b80 fix(GRO-887): wire OIDC + BETTER_AUTH env vars into API deployment (#369)
Wire BETTER_AUTH_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, BETTER_AUTH_SECRET
into API deployment. Add conditional OIDC_INTERNAL_BASE env var. Add new values
betterAuthUrl + internalBaseUrl in values.yaml. Add authSecretName helper.

Cherry-picked from e26718b (original GRO-898 fix).

Co-authored-by: Paperclip <paperclip@noreply.com>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-03 17:44:10 +00:00
groombook-engineer[bot] 5f1582a3b6 Merge pull request #367 from groombook/fix/gro-818-uat-defects
fix(GRO-818): UAT defects — refund button, cardLast4, manual refund, seed data
2026-05-02 21:02:32 +00:00
Test User c76ea93c29 fix(GRO-818): refund button for all paid invoices, inline cardLast4, manual refund for non-Stripe
- Backend refund endpoint: allow refunds on paid invoices without stripePaymentIntentId (manual refund path)
- Backend GET /invoices/🆔 inline fetch cardLast4 + paymentStatus from Stripe when stripePaymentIntentId present
- Frontend: show Refund button on all paid invoices for managers (not just Stripe-backed ones)
- Seed: add stripePaymentIntentId (pi_test_*) to ~20% of paid invoices for Stripe-path testing

cc @cpfarhood
2026-04-24 16:18:48 +00:00
the-dogfather-cto[bot] cd25d98384 Merge pull request #366 from groombook/fix/gro-898-ci-dev-branch
fix(GRO-898): update CI to deploy on dev branch pushes
2026-04-24 15:53:15 +00:00
Test User e9fceb78b3 fix(GRO-898): update CI to deploy on dev branch pushes
Update the Update Infra Image Tags job condition to also trigger
on pushes to the dev branch, not just main.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-24 15:46:50 +00:00
the-dogfather-cto[bot] 0cae8adef8 Merge pull request #365 from groombook/promote/dev-to-uat-gro876
promote: dev → uat (GRO-876 refund button fix)
2026-04-24 15:27:25 +00:00
Test User 674626ba1e Merge remote-tracking branch 'origin/dev' into uat 2026-04-24 15:24:11 +00:00
the-dogfather-cto[bot] aa5686bed1 Merge pull request #361 from groombook/fix/gro-876-refund-button-dev
Merging GRO-876 refund button fix to dev. CTO + QA approved. All CI passes.
2026-04-24 15:22:26 +00:00
the-dogfather-cto[bot] 903fbf55d5 promote: dev → uat (GRO-766 portal mobile overflow fix)
promote: dev → uat (GRO-766 portal mobile overflow fix)
2026-04-24 15:02:13 +00:00
the-dogfather-cto[bot] 775e2e544b fix(GRO-766): portal mobile overflow CSS fix at 390px viewport
fix(GRO-766): portal mobile overflow CSS fix at 390px viewport
2026-04-24 14:57:57 +00:00
Test User fb9c922182 fix(GRO-766): fix portal mobile overflow at 390px viewport
- CustomerPortal.tsx: change main from overflow-x-hidden to overflow-hidden
  to properly clip child overflow in both axes
- BillingPayments.tsx: add overflow-x-auto to tab button row so long
  button labels scroll instead of causing page-level overflow
- PetProfiles.tsx: already has overflow-x-auto on tab row — no change needed

Discovered in UAT by Shedward (DEF-2 and DEF-3 on GRO-754).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-24 11:35:13 +00:00
Test User 1cc48f0b88 fix(GRO-876): add partial refund validation and fix modal indentation 2026-04-23 23:24:04 +00:00
Test User 1b8d7087c0 fix(GRO-876): remove dead issueRefund function from InvoiceDetailModal
The inline async onClick handler already calls the refund API directly. The
separate issueRefund function was defined but never called, causing
@typescript-eslint/no-unused-vars CI failure on PR #351.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 23:23:27 +00:00
Test User d65d121a5d fix(GRO-876): wire up refund button in invoice detail modal
Cherry-pick of 628ed34 to fix @typescript-eslint/no-unused-vars
error on PR #351 Lint & Typecheck.

The issueRefund function was defined but never called. This commit:
- Removes the inline async onClick handler that bypassed issueRefund
- Wires the Refund button to open setShowRefundDialog(true) instead
- Uses issueRefund function (with refundAmount/refundError/refunding state)
- Adds manager role check before showing refund button
- Shows "Refunded" badge when invoice.stripeRefundId is set

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 23:23:27 +00:00
groombook-engineer[bot] b8fd7ec18f fix(gro-609): cherry-pick refund/stats fixes to dev (#358)
* fix(gro-609): include stripePaymentIntentId in invoice list and wrap stats endpoint in try/catch

- Add stripePaymentIntentId to the GET /invoices list query so the refund button
  renders when seed data includes a payment intent ID
- Wrap /api/invoices/stats/summary in try/catch so errors return 200 with zero
  defaults instead of 5xx, preventing the Invoices page from crashing on
  mount for groomer-role sessions

Parent: GRO-882
Grandparent: GRO-816

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix(gro-609): add payment stats to admin dashboard (AppointmentsPage)

- Fetch /api/invoices/stats/summary on mount and display Revenue/Outstanding/Refunds
  summary cards above the calendar view on /admin
- Mirrors the same stats section already on /admin/invoices
- Gracefully handles errors via try/catch on the stats endpoint

Parent: GRO-882
Grandparent: GRO-816

Co-Authored-By: Paperclip <noreply@paperclip.ing>

---------

Co-authored-by: Test User <test@example.com>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-23 22:38:13 +00:00
the-dogfather-cto[bot] 7bf9cf9734 Merge pull request #359 from groombook/fix/gro-890-seed-stripe-payment-intent
fix(GRO-890): populate stripePaymentIntentId on paid seed invoices
2026-04-23 22:36:27 +00:00
groombook-engineer[bot] bf159f8b1f fix(GRO-890): populate stripePaymentIntentId on all paid seed invoices
All paid invoices created by the seed script now get a deterministic
stripePaymentIntentId of the form pi_test_seed_NNNNNN, unblocking the
refund button conditional in Invoices.tsx:514 during UAT.

Pending/draft invoices retain null as before.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 19:29:45 +00:00
the-dogfather-cto[bot] 2f3d4d8d01 fix(gro-609): refund button, stats 5xx, dashboard payment stats (#357)
fix(gro-609): include stripePaymentIntentId in invoice list and wrap stats endpoint in try/catch
2026-04-23 14:01:41 +00:00
Test User db9bb31702 fix(gro-609): add payment stats to admin dashboard (AppointmentsPage)
- Fetch /api/invoices/stats/summary on mount and display Revenue/Outstanding/Refunds
  summary cards above the calendar view on /admin
- Mirrors the same stats section already on /admin/invoices
- Gracefully handles errors via try/catch on the stats endpoint

Parent: GRO-882
Grandparent: GRO-816

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 13:51:15 +00:00
Test User b38db65dde fix(gro-609): include stripePaymentIntentId in invoice list and wrap stats endpoint in try/catch
- Add stripePaymentIntentId to the GET /invoices list query so the refund button
  renders when seed data includes a payment intent ID
- Wrap /api/invoices/stats/summary in try/catch so errors return 200 with zero
  defaults instead of 5xx, preventing the Invoices page from crashing on
  mount for groomer-role sessions

Parent: GRO-882
Grandparent: GRO-816

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-23 13:47:27 +00:00
scrubs-mcbarkley-ceo[bot] 3178f81b99 promote: uat → main (GRO-865 logo proxy mixed content fix)
All SDLC gates cleared. Logo proxy fix ships to production. cc @cpfarhood
2026-04-22 03:50:15 +00:00
scrubs-mcbarkley-ceo[bot] 544d65959d promote: dev → uat (GRO-867 + GRO-870 logo proxy fixes)
Promoting logo proxy fixes to UAT. All SDLC gates passed. cc @cpfarhood
2026-04-22 03:49:30 +00:00
the-dogfather-cto[bot] fe2e093b92 Merge pull request #353 from groombook/fix/gro-867-logo-proxy
fix(GRO-870): /api/branding returns raw S3 URL — add public logo proxy
2026-04-22 03:21:15 +00:00
Flea Flicker 2af1671891 fix(GRO-870): /api/branding returns raw S3 URL — add public logo proxy
Add GET /api/branding/logo as a public endpoint that proxies logo bytes
from S3, and change /api/branding to return logoUrl: "/api/branding/logo"
instead of calling getPresignedGetUrl(). Eliminates mixed-content warnings
when the branding context is consumed on unauthenticated pages (portal,
login).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-22 03:08:36 +00:00
the-dogfather-cto[bot] ad80722eee Merge pull request #352 from groombook/fix/gro-867-logo-proxy
fix(GRO-867): proxy logo download through API server — eliminate mixed content
2026-04-22 02:48:54 +00:00
Flea Flicker c811b58c62 fix(GRO-867): remove unused getPresignedGetUrl import from settings.ts
ESLint @typescript-eslint/no-unused-vars flagged the import.
The logo proxy no longer uses pre-signed GET URLs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-21 22:20:55 +00:00
Flea Flicker 1dfcdcc2cb fix(GRO-867): c.body does not accept Buffer in Hono 4.x
c.body() signature only accepts string | ArrayBuffer | ReadableStream | Uint8Array
in Hono 4.x, not Node.js Buffer. Return a plain Response directly instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-21 22:19:26 +00:00
Flea Flicker f74e034495 fix(GRO-867): replace transformToBuffer with async iteration over S3 stream
transformToBuffer() does not exist on StreamingBlobPayloadOutputTypes
in the AWS SDK v3 client. Use for-await-of over the async iterable body
to collect chunks and Buffer.concat instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-21 22:16:08 +00:00
Flea Flicker 4c46cec4e3 fix(GRO-867): proxy logo download through API server — eliminate mixed content
All logo S3 interactions are now server-proxied:
- GET /api/admin/settings/logo streams image bytes directly instead of
  returning a presigned S3 URL to the browser
- Upload already went through POST /api/admin/settings/logo/upload
- Frontend uses relative /api/admin/settings/logo path as img src,
  never a raw S3 URL
- Appends cache-buster query param (?t=Date.now()) after upload so
  the browser fetches the fresh image instead of serving a stale cache

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-21 22:07:21 +00:00
lint-roller-qa[bot] f38bb244a4 Merge pull request #339 from groombook/dev
Promote dev → uat
2026-04-20 14:06:22 +00:00
the-dogfather-cto[bot] 251b36b863 fix(e2e): mock /api/invoices/stats/summary to prevent Invoices page crash
fix(e2e): mock /api/invoices/stats/summary to prevent Invoices page crash
2026-04-20 13:59:10 +00:00
the-dogfather-cto[bot] 3c366ccc46 Merge pull request #346 from groombook/fix/gro-816-portal-pets-crash
fix(GRO-816): fix PetProfiles crash from appointments response shape change
2026-04-19 11:02:07 +00:00