Compare commits

...

2 Commits

Author SHA1 Message Date
Paperclip 03f1dd3bfa fix(db): add missing 'short' value to coat_type enum (GRO-1953)
CI / Test (pull_request) Successful in 17s
CI / Lint & Typecheck (pull_request) Successful in 24s
CI / Build & Push Docker Images (pull_request) Successful in 1m6s
The seed file coatTypePool includes 'short', but migration 0031
created the coat_type enum without it. The ALTER TYPE ... ADD VALUE
statement makes the migration idempotent so it is safe to re-run.
2026-05-30 04:19:30 +00:00
Flea Flicker a14bb5e17d fix(api): repair root src/routes/pets.ts visit-count query (GRO-1945)
CI / Test (pull_request) Successful in 11s
CI / Lint & Typecheck (pull_request) Successful in 14s
CI / Build & Push Docker Images (pull_request) Successful in 1m4s
Use sql\`count(*)::int\` instead of selecting appointments.id, which was
causing TS2339 under noUncheckedIndexedAccess (arr[0] is T | undefined).

Import sql from @groombook/db. Use countRow?.count ?? 0 to stay
noUncheckedIndexedAccess-safe.

Matches the working implementation in apps/api/src/routes/pets.ts:365.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-30 03:21:28 +00:00
3 changed files with 27 additions and 5 deletions
@@ -0,0 +1,14 @@
-- Migration: 0035_add_short_to_coat_type_enum.sql
-- GRO-1953: Adds missing "short" value to the coat_type enum so that seed data
-- (which uses coatTypePool including "short") can be inserted without error.
--
-- The seed file defines coatTypePool as:
-- ["short", "medium", "long", "double", "wire", "silky", "curly", "hairless"]
-- but migration 0031 created the enum without "short", causing:
-- PostgresError: invalid input value for enum coat_type: "short"
BEGIN;
ALTER TYPE "coat_type" ADD VALUE IF NOT EXISTS 'short';
COMMIT;
@@ -246,6 +246,13 @@
"when": 1751140800000,
"tag": "0034_extend_pet_profile_columns",
"breakpoints": true
},
{
"idx": 35,
"version": "7",
"when": 1751140800000,
"tag": "0035_add_short_to_coat_type_enum",
"breakpoints": true
}
]
}
+6 -5
View File
@@ -12,6 +12,7 @@ import {
appointments,
staff,
services,
sql,
} from "@groombook/db";
import type { AppEnv } from "../middleware/rbac.js";
import {
@@ -153,11 +154,11 @@ petsRouter.get("/:id/profile-summary", async (c) => {
.limit(10);
// Visit count (completed appointments)
const [{ count }] = await db
.select({ count: appointments.id })
const [countRow] = await db
.select({ count: sql<number>`count(*)::int` })
.from(appointments)
.where(and(eq(appointments.petId, petId), eq(appointments.status, "completed")))
.limit(1);
.where(and(eq(appointments.petId, petId), eq(appointments.status, "completed")));
const visitCount = countRow?.count ?? 0;
// Upcoming appointment (next scheduled or confirmed)
const [upcoming] = await db
@@ -195,7 +196,7 @@ petsRouter.get("/:id/profile-summary", async (c) => {
serviceName: h.serviceName,
staffName: h.staffName,
})),
visitCount: Number(count ?? 0),
visitCount,
upcomingAppointment: upcoming
? {
id: upcoming.id,