From da8a730867efd87e90eb608d23f64b1c0a43f8f0 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 3 Mar 2026 23:21:36 +0000 Subject: [PATCH] fix: handle isOpenPlay and map form values to Prisma enums in court API - Add isOpenPlay field to POST and PUT routes - Accept both hourlyRate and pricePerHour (form vs API naming) - Map lowercase type/status from form to uppercase Prisma enums Co-Authored-By: Claude Opus 4.6 --- apps/web/app/api/courts/[id]/route.ts | 17 ++++++++++++++--- apps/web/app/api/courts/route.ts | 19 +++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/apps/web/app/api/courts/[id]/route.ts b/apps/web/app/api/courts/[id]/route.ts index 1298a72..a9c9c20 100644 --- a/apps/web/app/api/courts/[id]/route.ts +++ b/apps/web/app/api/courts/[id]/route.ts @@ -125,23 +125,34 @@ export async function PUT( type, status, pricePerHour, + hourlyRate, description, features, displayOrder, isActive, + isOpenPlay, } = body; + const price = pricePerHour ?? hourlyRate; + + // Map lowercase form values to Prisma enum values + const typeMap: Record = { indoor: 'INDOOR', outdoor: 'OUTDOOR', covered: 'COVERED' }; + const statusMap: Record = { active: 'AVAILABLE', maintenance: 'MAINTENANCE', inactive: 'CLOSED' }; + const mappedType = type ? (typeMap[type.toLowerCase()] || type) : undefined; + const mappedStatus = status ? (statusMap[status.toLowerCase()] || status) : undefined; + const court = await db.court.update({ where: { id }, data: { ...(name !== undefined && { name }), - ...(type !== undefined && { type }), - ...(status !== undefined && { status }), - ...(pricePerHour !== undefined && { pricePerHour }), + ...(mappedType !== undefined && { type: mappedType }), + ...(mappedStatus !== undefined && { status: mappedStatus }), + ...(price !== undefined && { pricePerHour: price }), ...(description !== undefined && { description }), ...(features !== undefined && { features }), ...(displayOrder !== undefined && { displayOrder }), ...(isActive !== undefined && { isActive }), + ...(isOpenPlay !== undefined && { isOpenPlay }), }, include: { site: { diff --git a/apps/web/app/api/courts/route.ts b/apps/web/app/api/courts/route.ts index b54d006..a870571 100644 --- a/apps/web/app/api/courts/route.ts +++ b/apps/web/app/api/courts/route.ts @@ -97,14 +97,24 @@ export async function POST(request: NextRequest) { type, status, pricePerHour, + hourlyRate, description, features, displayOrder, isActive, + isOpenPlay, } = body; + const price = pricePerHour ?? hourlyRate; + + // Map lowercase form values to Prisma enum values + const typeMap: Record = { indoor: 'INDOOR', outdoor: 'OUTDOOR', covered: 'COVERED' }; + const statusMap: Record = { active: 'AVAILABLE', maintenance: 'MAINTENANCE', inactive: 'CLOSED' }; + const mappedType = typeMap[type?.toLowerCase()] || type || 'INDOOR'; + const mappedStatus = statusMap[status?.toLowerCase()] || status || 'AVAILABLE'; + // Validate required fields - if (!siteId || !name || pricePerHour === undefined) { + if (!siteId || !name || price === undefined) { return NextResponse.json( { error: 'Missing required fields: siteId, name, pricePerHour' }, { status: 400 } @@ -138,12 +148,13 @@ export async function POST(request: NextRequest) { data: { siteId, name, - type: type || 'INDOOR', - status: status || 'AVAILABLE', - pricePerHour, + type: mappedType, + status: mappedStatus, + pricePerHour: price, description: description || null, features: features || [], displayOrder: displayOrder ?? 0, + isOpenPlay: isOpenPlay ?? false, isActive: isActive ?? true, }, include: {