Compare commits

..

23 Commits

Author SHA1 Message Date
The Dogfather e7032e46bf Merge pull request 'promote: dev → uat (GRO-1489 lint fixes)' (#433) from dev into uat
promote: dev → uat (GRO-1489 lint fixes) (#433)
2026-05-23 19:27:34 +00:00
The Dogfather fdd35a4cde Merge pull request 'fix(GRO-1489): resolve 7 lint errors blocking dev CI' (#429) from flea-flicker/gro-1489-lint-fixes into dev
CI / Lint & Typecheck (push) Successful in 21s
CI / Test (push) Successful in 24s
CI / Build (push) Successful in 22s
CI / Build & Push Docker Images (push) Failing after 42s
CI / Update Infra Image Tags (push) Has been skipped
CI / Web E2E (Dev) (push) Has been cancelled
CI / Deploy PR to groombook-dev (push) Has been cancelled
fix(GRO-1489): resolve 7 lint errors blocking dev CI (#429)
2026-05-23 19:10:13 +00:00
Scrubs McBarkley 559274becd Merge pull request 'docs: add MCP-driven execution method to UAT playbook (GRO-1502)' (#432) from docs/GRO-1502-uat-mcp-migration into dev
CI / Web E2E (Dev) (push) Has been cancelled
CI / Deploy PR to groombook-dev (push) Has been cancelled
CI / Lint & Typecheck (push) Successful in 22s
CI / Build (push) Successful in 21s
CI / Test (push) Successful in 24s
CI / Build & Push Docker Images (push) Successful in 33s
CI / Update Infra Image Tags (push) Failing after 1s
docs: add MCP-driven UAT execution method (GRO-1502)
2026-05-22 11:48:03 +00:00
The Dogfather 09edd1b8ec Merge pull request 'Promote dev → uat: fix(e2e) PLAYWRIGHT_BASE_URL + host.docker.internal (GRO-1496)' (#431) from dev into uat
Promote dev → uat: fix(e2e) PLAYWRIGHT_BASE_URL + host.docker.internal (GRO-1496) (#431)
2026-05-21 21:04:20 +00:00
The Dogfather 7bb7d8c32b Merge pull request 'promote: dev → uat (GRO-1369 types sync)' (#428) from dev into uat
Merge dev → uat: GRO-1369 types sync, cascade logic, SMS consent
2026-05-21 20:53:19 +00:00
Flea Flicker 0d191743e2 fix(GRO-1489): resolve 7 lint errors blocking dev CI
CI / E2E Tests (pull_request) Successful in 1m24s
CI / Lint & Typecheck (pull_request) Successful in 21s
CI / Test (pull_request) Successful in 23s
CI / Build (pull_request) Successful in 25s
CI / Build & Push Docker Images (pull_request) Successful in 1m35s
CI / Update Infra Image Tags (pull_request) Has been skipped
CI / Web E2E (Dev) (pull_request) Has been cancelled
CI / Deploy PR to groombook-dev (pull_request) Has been cancelled
- Remove unused gte, lt, ne imports from cascade.ts
- Rename originalEndTime → _originalEndTime in detectAndCascadeOverrun params
- Rename originalStartTime/newStartTime → _originalStartTime/_newStartTime in isOverrun params
- Remove unused petCoatType assignment in book.ts availability route
- Align x-large → xlarge in Book.tsx size option value and duration display

Unblocks: GRO-1481 promotion (PR #428)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 20:44:16 +00:00
The Dogfather 6f160dde51 Merge pull request 'promote: dev → uat (GRO-1248 path prefix fix)' (#425) from dev into uat
promote: dev → uat (GRO-1248 path prefix fix) (#425)
2026-05-20 13:01:26 +00:00
the-dogfather-cto[bot] 733af4f5f2 Merge pull request #420 from groombook/dev
chore: promote dev → uat (GRO-1289 CI path fix)
2026-05-14 21:03:16 +00:00
the-dogfather-cto[bot] 13abbdcec8 chore: promote dev to uat — GRO-1287 ci.yml path fix (#419)
chore: promote dev to uat (GRO-1287 ci.yml path fix)
2026-05-14 20:49:13 +00:00
the-dogfather-cto[bot] e4e783dec6 chore: promote dev to uat — VITE_API_URL fix (GRO-1280, GRO-1206)
chore: promote dev to uat — VITE_API_URL fix (GRO-1280)
2026-05-14 20:32:09 +00:00
the-dogfather-cto[bot] 1a88528eae promote: dev → uat (GRO-1236 OAuth callback fix)
promote: dev → uat (GRO-1236 OAuth callback fix)
2026-05-14 19:36:13 +00:00
Chris Farhood 0f6a5ebe35 Promote dev→uat: OAuth callback session fix (GRO-1236) 2026-05-14 19:25:42 +00:00
the-dogfather-cto[bot] 121735edca promote: dev → uat (GRO-1207 portal Communication tab real backend)
promote: dev → uat (GRO-1207 portal Communication tab real backend)
2026-05-14 16:59:09 +00:00
the-dogfather-cto[bot] 5b2f45e5f3 chore: promote dev → uat (GRO-1212 portal test mock fix)
chore: promote dev → uat (GRO-1212 portal test mock fix)
2026-05-14 12:08:38 +00:00
the-dogfather-cto[bot] ff0bd2903e promote: dev → uat (GRO-1208 conversations API + GRO-1211 telnyx webhook fix)
promote: dev → uat (GRO-1208 conversations API + GRO-1211 telnyx webhook fix)
2026-05-14 08:45:38 +00:00
the-dogfather-cto[bot] 831b90dbe2 Merge dev→uat: auth rate limiting (GRO-1024)
chore: promote dev → uat (fix auth rate limits)
2026-05-11 03:40:46 +00:00
the-dogfather-cto[bot] 4b4ffa0ca4 Promote dev → uat: TELNYX_WEBHOOK_SECRET .env.example
Promote dev → uat: TELNYX_WEBHOOK_SECRET .env.example
2026-05-11 02:27:54 +00:00
the-dogfather-cto[bot] f0f271e046 feat(GRO-106): inbound Telnyx webhook + persistence (#378) (#388)
* feat(GRO-106): messaging schema + migrations

- Add conversations, messages, message_attachments, message_consent_events tables
- Add messagingChannelEnum, messageDirectionEnum, messageStatusEnum, messageConsentKindEnum
- Extend business_settings with messagingPhoneNumber and telnyxMessagingProfileId columns
- Add required indexes and unique constraints with cascade-on-delete FKs
- Add migration 0030_messaging.sql



* fix(GRO-981): restore journal entries and add DESC to indexes

- _journal.json: restore idx 28 (0028_sms_reminders), add idx 29
  (0029_db_indexes_constraints), renumber 0030_messaging to idx 30
  (was missing 0028 and 0029 entries — they were silently skipped)
- schema.ts: add .desc() to conversations.lastMessageAt and
  messages.createdAt indexes per spec
- 0030_messaging.sql: add DESC to both generated index statements



* feat(GRO-106): inbound Telnyx webhook + persistence

- Add POST /api/webhooks/telnyx/messaging route with HMAC signature verification
- Add services/messaging/inbound.ts: findOrCreateConversation, upsertMessage (idempotent on providerMessageId), delivery receipt handling
- Register telnyxWebhooksRouter in index.ts (before auth middleware)
- Add unit tests for signature validation, find-or-create, idempotent insert, delivery receipt



* fix(GRO-982): address all QA blocking failures

- #7: Extract validateTelnyxSignature in sms.ts as standalone exported fn,
  reuse in TelnyxProvider.validateWebhookSignature and telnyx.ts route
- #1: Replace uuid v4 import with crypto.randomUUID() (built-in, no dep)
- #2: Remove updatedAt from messages update in handleMessageFinalized
  (no such column exists)
- #3: Fix test import path ../../ → ../../../ for telnyx route import
- #4: validateTelnyxSignature accepts string | undefined | null to match
  Hono c.req.header() return type
- #5&6: Add null guards for .returning() results in findOrCreateConversation
  and upsertMessage
- #8: Remove dead buildFindOrCreateConversationParams function
- #9: Remove unused imports (messageDirectionEnum, messageStatusEnum,
  resolveBusinessIdByMessagingNumber in test)
- #10: Wrap upsertMessage insert in try/catch; unique violation returns
  {isNew: false} instead of crashing
- #11: Add EOF newlines to all modified files



* chore: add uuid dependency for messaging services

* fix(GRO-982): address 5 test failures in inbound webhook

- Fix signature route tests: use /messaging not full mount path
- Fix handleMessageReceived mock order: business lookup first
- Fix stale mock state: add full mockReset in handleMessageFinalized beforeEach
- Fix delivery logic: set delivered for all message.finalized events
- Deduplicate test that was accidentally added twice



* fix(GRO-982): look up or create client by phone before inserting conversation

Fixes FK constraint violation where clientId was set to businessSettings.id
or a random UUID. Now looks up clients.phone = clientPhone first; if no match,
creates a placeholder client with phone as name and a placeholder email.

* fix(GRO-982): address QA round 4 blocking failures

- Fix URL in signature tests: use /messaging not full path
- Reorder mocks: businessSettings first, then conversations, clients, messages
- Add mockDb.mockReset in handleMessageFinalized beforeEach
- Remove direction guard: set delivered for any message.finalized

* fix(GRO-982): add missing message insert mock in handleMessageReceived test

* fix(GRO-982): simplify test mocks to match actual code flow

---------

Co-authored-by: groombook-engineer[bot] <269742240+groombook-engineer[bot]@users.noreply.github.com>
Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-11 00:51:17 +00:00
the-dogfather-cto[bot] 673b85b64b Merge pull request #386 from groombook/dev
chore: promote dev → uat (GRO-1036 security fixes)
2026-05-04 22:53:58 +00:00
the-dogfather-cto[bot] a368d567d8 promote dev → uat: portal mobile overflow fix (GRO-730) (#384)
promote dev → uat: portal mobile overflow fix (GRO-730)
2026-05-04 21:25:36 +00:00
the-dogfather-cto[bot] 5332147ac1 Merge dev → uat: 10DLC pilot registration runbook (GRO-106)
promote dev → uat: 10DLC pilot registration runbook (GRO-106)
2026-05-04 20:55:50 +00:00
the-dogfather-cto[bot] b38de28d2e Merge pull request #380 from groombook/dev
promote: dev → uat (GRO-693 E2E mock fixes)
2026-05-04 15:16:52 +00:00
the-dogfather-cto[bot] 66a80cf9e7 Merge pull request #376 from groombook/dev
promote: GRO-106 messaging schema → UAT
2026-05-04 02:25:31 +00:00
+1 -1
View File
@@ -121,7 +121,7 @@ The scripted Playwright suites in `apps/e2e/` and `apps/web/e2e/` are retained f
| TC-APP-4.5.5 | Appointment groups | 1. Create multiple appointments for same time slot<br>2. View in calendar | Appointments are grouped/linked appropriately |
| TC-APP-4.5.6 | Appointment availability check | 1. Attempt to book appointment during unavailable slot | System shows conflict or prevents double-booking |
| TC-APP-4.5.7 | Booking wizard — size/coat selection | 1. Start new appointment booking wizard<br>2. Select a pet with sizeCategory and coatType set<br>3. Observe the service/slot selection step | Size and coat type dropdowns are displayed and persist the pet's existing values |
| TC-APP-4.5.8 | Large/X-Large pet slot duration reflects buffer | 1. Add a pet with sizeCategory = "large" or "x-large" to an appointment<br>2. Note the service duration<br>3. Complete booking and inspect the appointment | Appointment slot includes the service duration plus the configured buffer for the pet's size category |
| TC-APP-4.5.8 | Large/Xlarge pet slot duration reflects buffer | 1. Add a pet with sizeCategory = "large" or "xlarge" to an appointment<br>2. Note the service duration<br>3. Complete booking and inspect the appointment | Appointment slot includes the service duration plus the configured buffer for the pet's size category |
| TC-APP-4.5.9 | Appointment overrun cascades downstream | 1. Book three consecutive same-groomer appointments (A → B → C)<br>2. Manually extend appointment A's endTime so it overlaps B's startTime by ≥15 min<br>3. Observe appointment B | Appointment B (and C if still overlapping) is automatically shifted forward by the overrun delta + buffer; no error thrown |
| TC-APP-4.5.10 | Cascaded appointments appear at new times | 1. Complete TC-APP-4.5.9<br>2. Check the calendar/list view | Appointments B and C are now shown at their shifted start/end times |
| TC-APP-4.5.11 | Client receives reschedule notification email | 1. Complete TC-APP-4.5.9<br>2. Check the client's email (or notification log) | Client receives an email with subject/lines indicating their appointment was rescheduled from original time to new time |