diff --git a/backend/handlers/bookings/bookings.go b/backend/handlers/bookings/bookings.go index 4ae9ff8..85861b6 100644 --- a/backend/handlers/bookings/bookings.go +++ b/backend/handlers/bookings/bookings.go @@ -1268,6 +1268,18 @@ func CreateBookingHandler(w http.ResponseWriter, r *http.Request) { return } + // Check for overlapping bookings with confirmed/in_progress/completed status + // Users cannot book a time slot that overlaps with these statuses + var cnt int + db.DB.QueryRow(r.Context(), ` + SELECT COUNT(*) FROM bookings WHERE status IN ('confirmed','in_progress','completed') AND start_time < $2 AND start_time + (INTERVAL '1 minute' * (SELECT COALESCE(SUM(COALESCE(bs.override_duration_minutes,s.duration_minutes)),60) FROM booking_services bs JOIN services s ON bs.service_id=s.id WHERE bs.booking_id=bookings.id)) > $1 + `, req.StartTime, endTime).Scan(&cnt) + if cnt > 0 { + http.Error(w, "Cannot book this time - slot overlaps with an existing booking", http.StatusConflict) + return + } + + // Get created by from context (if available) var createdBy *string