import { NextRequest, NextResponse } from 'next/server'; import { getSession } from '@/lib/session'; import { db } from '@/lib/db'; import { timeSlots } from '@/lib/db/schema'; import { eq } from 'drizzle-orm'; import { logActivity, ACTIONS, ENTITY_TYPES } from '@/lib/activity-logger'; export async function PUT(request: NextRequest, { params }: { params: { id: string } }) { try { const session = await getSession(); if (!session || session.role !== 'admin') { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const { id } = params; const { dayOfWeek, startTime, endTime, isActive } = await request.json(); // Check if time slot exists const existingTimeSlot = await db.select().from(timeSlots).where(eq(timeSlots.id, id)).limit(1); if (existingTimeSlot.length === 0) { return NextResponse.json({ error: 'Time slot not found' }, { status: 404 }); } // Validate inputs if provided if (dayOfWeek !== undefined && (dayOfWeek < 0 || dayOfWeek > 6)) { return NextResponse.json( { error: 'dayOfWeek must be between 0 (Sunday) and 6 (Saturday)' }, { status: 400 } ); } const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/; if (startTime && !timeRegex.test(startTime)) { return NextResponse.json( { error: 'Invalid startTime format. Use HH:MM format' }, { status: 400 } ); } if (endTime && !timeRegex.test(endTime)) { return NextResponse.json( { error: 'Invalid endTime format. Use HH:MM format' }, { status: 400 } ); } const updatedTimeSlot = await db .update(timeSlots) .set({ ...(dayOfWeek !== undefined && { dayOfWeek }), ...(startTime && { startTime }), ...(endTime && { endTime }), ...(isActive !== undefined && { isActive }), updatedAt: new Date(), }) .where(eq(timeSlots.id, id)) .returning(); await logActivity({ userId: session.userId, action: ACTIONS.TIME_SLOT_UPDATE, entityType: ENTITY_TYPES.TIME_SLOT, entityId: id, details: { dayOfWeek, startTime, endTime, isActive }, }); return NextResponse.json({ message: 'Time slot updated successfully', timeSlot: updatedTimeSlot[0], }); } catch (error) { console.error('Error updating time slot:', error); return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); } } export async function DELETE(request: NextRequest, { params }: { params: { id: string } }) { try { const session = await getSession(); if (!session || session.role !== 'admin') { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const { id } = params; // Check if time slot exists const existingTimeSlot = await db.select().from(timeSlots).where(eq(timeSlots.id, id)).limit(1); if (existingTimeSlot.length === 0) { return NextResponse.json({ error: 'Time slot not found' }, { status: 404 }); } await db.delete(timeSlots).where(eq(timeSlots.id, id)); await logActivity({ userId: session.userId, action: ACTIONS.TIME_SLOT_DELETE, entityType: ENTITY_TYPES.TIME_SLOT, entityId: id, details: { deleted: existingTimeSlot[0] }, }); return NextResponse.json({ message: 'Time slot deleted successfully', }); } catch (error) { console.error('Error deleting time slot:', error); return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); } }