77
88router = APIRouter (prefix = "/api/bookings" , tags = ["Bookings" ])
99
10+ @router .get ("/my" , response_model = list [BookingResponse ])
11+ def get_my_bookings (
12+ current_user : User = Depends (get_current_user ),
13+ db : Session = Depends (get_db )
14+ ):
15+ """Отримати мої бронювання"""
16+ bookings = db .query (Booking ).filter (
17+ Booking .user_id == current_user .id
18+ ).all ()
19+ return bookings
20+
21+ @router .get ("/occupied/{route_id}" )
22+ def get_occupied_seats (route_id : int , db : Session = Depends (get_db )):
23+
24+ bookings = db .query (Booking ).filter (
25+ Booking .route_id == route_id ,
26+ Booking .status == "active"
27+ ).all ()
28+
29+ occupied = [
30+ {"carriage" : b .carriage , "seat" : b .seat_number }
31+ for b in bookings
32+ ]
33+
34+ return {"occupied_seats" : occupied }
35+
1036@router .post ("" , response_model = BookingResponse )
1137def create_booking (
1238 booking_data : BookingCreate ,
@@ -20,18 +46,27 @@ def create_booking(
2046 if route .available_seats <= 0 :
2147 raise HTTPException (status_code = 400 , detail = "No available seats" )
2248
49+ # Перевірка валідності вагону і місця
50+ if booking_data .carriage < 1 or booking_data .carriage > 10 :
51+ raise HTTPException (status_code = 400 , detail = "Carriage must be between 1-10" )
52+
53+ if booking_data .seat_number < 1 or booking_data .seat_number > 20 :
54+ raise HTTPException (status_code = 400 , detail = "Seat must be between 1-20" )
55+
2356 existing_booking = db .query (Booking ).filter (
2457 Booking .route_id == booking_data .route_id ,
58+ Booking .carriage == booking_data .carriage ,
2559 Booking .seat_number == booking_data .seat_number ,
2660 Booking .status == "active"
2761 ).first ()
2862
2963 if existing_booking :
30- raise HTTPException (status_code = 400 , detail = "Seat already booked" )
64+ raise HTTPException (status_code = 400 , detail = "This seat is already booked" )
3165
3266 new_booking = Booking (
3367 user_id = current_user .id ,
3468 route_id = booking_data .route_id ,
69+ carriage = booking_data .carriage ,
3570 seat_number = booking_data .seat_number
3671 )
3772
@@ -43,15 +78,6 @@ def create_booking(
4378
4479 return new_booking
4580
46- @router .get ("/my" , response_model = list [BookingResponse ])
47- def get_my_bookings (
48- current_user : User = Depends (get_current_user ),
49- db : Session = Depends (get_db )
50- ):
51- bookings = db .query (Booking ).filter (
52- Booking .user_id == current_user .id
53- ).all ()
54- return bookings
5581
5682@router .delete ("/{booking_id}" )
5783def cancel_booking (
@@ -67,7 +93,6 @@ def cancel_booking(
6793 if not booking :
6894 raise HTTPException (status_code = 404 , detail = "Booking not found" )
6995
70- # Повернути місце
7196 route = db .query (Route ).filter (Route .id == booking .route_id ).first ()
7297 route .available_seats += 1
7398
0 commit comments