generated from bisco/codex-bootstrap
feat: add booking REST API
This commit is contained in:
88
backend/bookings/views.py
Normal file
88
backend/bookings/views.py
Normal file
@@ -0,0 +1,88 @@
|
||||
from django.shortcuts import get_object_or_404
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.response import Response
|
||||
|
||||
from shows.models import Performance
|
||||
|
||||
from .serializers import (
|
||||
ReservationConfirmResponseSerializer,
|
||||
ReservationConfirmSerializer,
|
||||
ReservationCreateResponseSerializer,
|
||||
ReservationCreateSerializer,
|
||||
)
|
||||
from .services import (
|
||||
AlreadyConfirmedReservation,
|
||||
ExpiredToken,
|
||||
InvalidToken,
|
||||
NotEnoughSeats,
|
||||
PerformanceNotAvailable,
|
||||
confirm_reservation_from_token,
|
||||
create_pending_reservation,
|
||||
)
|
||||
|
||||
|
||||
@api_view(["POST"])
|
||||
def create_reservation(request, performance_id):
|
||||
get_object_or_404(Performance, pk=performance_id, show__is_published=True)
|
||||
|
||||
serializer = ReservationCreateSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
try:
|
||||
result = create_pending_reservation(
|
||||
performance_id=performance_id,
|
||||
name=serializer.validated_data["name"],
|
||||
email=serializer.validated_data["email"],
|
||||
phone=serializer.validated_data.get("phone", ""),
|
||||
party_size=serializer.validated_data["party_size"],
|
||||
notes=serializer.validated_data.get("notes", ""),
|
||||
)
|
||||
except (NotEnoughSeats, PerformanceNotAvailable) as exc:
|
||||
return Response(
|
||||
{"status": "booking_unavailable", "detail": str(exc)},
|
||||
status=status.HTTP_409_CONFLICT,
|
||||
)
|
||||
|
||||
response_serializer = ReservationCreateResponseSerializer(
|
||||
{
|
||||
"id": result.reservation.id,
|
||||
"status": result.reservation.status,
|
||||
"performance_id": result.reservation.performance_id,
|
||||
"party_size": result.reservation.party_size,
|
||||
"message": "Reservation created. Please check your email to confirm it.",
|
||||
}
|
||||
)
|
||||
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
||||
@api_view(["POST"])
|
||||
def confirm_reservation(request):
|
||||
serializer = ReservationConfirmSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
try:
|
||||
result = confirm_reservation_from_token(serializer.validated_data["token"])
|
||||
except InvalidToken as exc:
|
||||
return Response(
|
||||
{"status": "invalid_token", "detail": str(exc)},
|
||||
status=status.HTTP_404_NOT_FOUND,
|
||||
)
|
||||
except ExpiredToken as exc:
|
||||
return Response(
|
||||
{"status": "token_expired", "detail": str(exc)},
|
||||
status=status.HTTP_410_GONE,
|
||||
)
|
||||
except NotEnoughSeats as exc:
|
||||
return Response(
|
||||
{"status": "not_enough_seats", "detail": str(exc)},
|
||||
status=status.HTTP_409_CONFLICT,
|
||||
)
|
||||
except AlreadyConfirmedReservation as exc:
|
||||
return Response(
|
||||
{"status": "already_confirmed", "detail": str(exc)},
|
||||
status=status.HTTP_409_CONFLICT,
|
||||
)
|
||||
|
||||
response_serializer = ReservationConfirmResponseSerializer(result)
|
||||
return Response(response_serializer.data)
|
||||
Reference in New Issue
Block a user