Skip to content

Commit c49ce2b

Browse files
committed
Patch 3.0 MVP
1 parent ea1b5ed commit c49ce2b

22 files changed

Lines changed: 840 additions & 118 deletions
625 Bytes
Binary file not shown.
35 Bytes
Binary file not shown.
-4 Bytes
Binary file not shown.

backend/app/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ class Booking(Base):
4444
id = Column(Integer, primary_key=True, index=True)
4545
user_id = Column(Integer, ForeignKey("users.id"))
4646
route_id = Column(Integer, ForeignKey("routes.id"))
47-
seat_number = Column(Integer)
47+
carriage = Column(Integer)
48+
seat_number = Column(Integer)
4849
booking_date = Column(DateTime, default=datetime.utcnow)
49-
status = Column(String, default="active")
50+
status = Column(String, default="active")
5051

5152
user = relationship("User", back_populates="bookings")
5253
route = relationship("Route", back_populates="bookings")
1.22 KB
Binary file not shown.
14 Bytes
Binary file not shown.

backend/app/routers/bookings.py

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@
77

88
router = 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)
1137
def 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}")
5783
def 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

backend/app/routers/trains.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import APIRouter, Depends, Query
1+
from fastapi import APIRouter, HTTPException , Depends, Query
22
from sqlalchemy.orm import Session
33
from ..database import get_db
44
from ..models import Route, Train
45 Bytes
Binary file not shown.

backend/app/schemas/booking.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
from datetime import datetime
33
from .route import RouteResponse
44

5-
65
class BookingCreate(BaseModel):
76
route_id: int
7+
carriage: int
88
seat_number: int
99

1010
class BookingResponse(BaseModel):
1111
id: int
1212
user_id: int
1313
route_id: int
14+
carriage: int
1415
seat_number: int
1516
booking_date: datetime
1617
status: str

0 commit comments

Comments
 (0)