Skip to content

Commit

Permalink
update record related endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
siwonKH committed Nov 2, 2023
1 parent 63d0664 commit e1d819e
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 13 deletions.
11 changes: 7 additions & 4 deletions bus_boarding_api/db/dao/boarding_record_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,18 @@ async def get_today_record_by_bus_id(self, bus_id: int) -> List[BoardingRecordMo
.where(BoardingRecordModel.time_created >= datetime.now().date())
)
result = await self.session.execute(stmt)
return list(result.scalars().all())
return list(result.scalars().fetchall())

async def get_all(self):
stmt = select(BoardingRecordModel)
async def get_all_today_records(self) -> List[BoardingRecordModel]:
stmt = (
select(BoardingRecordModel)
.where(BoardingRecordModel.time_created >= datetime.now().date())
)
stmt = stmt.options(joinedload(BoardingRecordModel.user))
stmt = stmt.options(joinedload(BoardingRecordModel.destination_stop))
stmt = stmt.options(joinedload(BoardingRecordModel.boarding_bus))
result = await self.session.execute(stmt)
return result.scalars().all()
return list(result.scalars().fetchall())

async def get_by_user(self, user_id: int):
stmt = (
Expand Down
2 changes: 2 additions & 0 deletions bus_boarding_api/db/dao/user_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ async def get_all_by_bus_id(self, bus_id: int, limit: int, offset: int) -> List[
UserModel.role != 'ADMINISTRATOR',
))
)
stmt = stmt.options(joinedload(UserModel.boarding_bus))
stmt = stmt.options(joinedload(UserModel.destination_stop))
result = await self.session.execute(stmt.limit(limit).offset(offset))
return list(result.scalars().fetchall())

Expand Down
36 changes: 36 additions & 0 deletions bus_boarding_api/web/api/boarding_record/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,38 @@
from pydantic import BaseModel, ConfigDict


class UserModelDTO(BaseModel):
id: int
student_id: str
name: str
phone_number: str

model_config = ConfigDict(from_attributes=True)


class JoinedUserModelDTO(BaseModel):
class BusModelDTO(BaseModel):
id: int
name: str
destination: int
description: str

class BusStopModelDTO(BaseModel):
id: int
name: str
location: str

id: int
student_id: str
name: str
phone_number: str

boarding_bus: BusModelDTO
destination_stop: BusStopModelDTO

model_config = ConfigDict(from_attributes=True)


class BoardingRecordModelDTO(BaseModel):
id: int
user_id: int
Expand All @@ -15,3 +47,7 @@ class BoardingRecordModelDTO(BaseModel):

class BoardingRecordInputDTO(BaseModel):
user_otp: str


class BoardingRecordBypassInputDTO(BaseModel):
user_id: int
54 changes: 47 additions & 7 deletions bus_boarding_api/web/api/boarding_record/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,66 @@
from bus_boarding_api.db.models.user import UserModel
from bus_boarding_api.permissions.models_permissions import (BusStop, BoardingRecord,
User, Bus)
from bus_boarding_api.web.api.boarding_record.schema import BoardingRecordInputDTO
from bus_boarding_api.web.api.boarding_record.schema import (BoardingRecordInputDTO,
UserModelDTO,
JoinedUserModelDTO,
BoardingRecordBypassInputDTO)

router = APIRouter()


@router.get("", dependencies=[Depends(PermissionChecker([User.permissions.READ, Bus.permissions.READ, BusStop.permissions.READ, BoardingRecord.permissions.READ]))])
@router.get(
"/today",
dependencies=[Depends(PermissionChecker([
User.permissions.READ, Bus.permissions.READ, BusStop.permissions.READ,
BoardingRecord.permissions.READ
]))],
response_model=JoinedUserModelDTO)
async def get_all_boarding_records(
boarding_record_dao: BoardingRecordDAO = Depends(),
):
return await boarding_record_dao.get_all()
return await boarding_record_dao.get_all_today_records()


@router.post("", dependencies=[Depends(PermissionChecker([
BoardingRecord.permissions.CREATE,
]))])
@router.post(
"/bypass",
dependencies=[Depends(PermissionChecker([BoardingRecord.permissions.CREATE]))],
response_model=UserModelDTO)
async def create_boarding_record_bypassing_otp(
new_boarding_record: BoardingRecordBypassInputDTO,
user_dao: UserDAO = Depends(),
bus_admin_dao: BusAdminDAO = Depends(),
boarding_record_dao: BoardingRecordDAO = Depends(),
current_user: UserModel = Depends(get_current_user),
) -> UserModel:
user = await user_dao.get(new_boarding_record.user_id)
if user is None:
raise HTTPException(status_code=404, detail="존재하지 않는 사용자 입니다.")

bus_admin = await bus_admin_dao.get(current_user.id, user.boarding_bus_id)
if bus_admin is None:
raise HTTPException(status_code=404, detail="해당 버스 탑승자가 아닙니다.")

await boarding_record_dao.create(
user_id=user.id,
bus_id=user.boarding_bus_id,
destination_stop_id=user.destination_stop_id,
)

return user


@router.post(
"",
dependencies=[Depends(PermissionChecker([BoardingRecord.permissions.CREATE]))],
response_model=UserModelDTO)
async def create_boarding_record(
new_boarding_record: BoardingRecordInputDTO,
user_dao: UserDAO = Depends(),
bus_admin_dao: BusAdminDAO = Depends(),
boarding_record_dao: BoardingRecordDAO = Depends(),
current_user: UserModel = Depends(get_current_user),
):
) -> UserModel:
decoded_user_otp = base64.b64decode(new_boarding_record.user_otp).decode('ascii')
otp, user_id = decoded_user_otp.split(';')
if otp is None or user_id is None:
Expand All @@ -58,3 +96,5 @@ async def create_boarding_record(
bus_id=user.boarding_bus_id,
destination_stop_id=user.destination_stop_id,
)

return user
17 changes: 17 additions & 0 deletions bus_boarding_api/web/api/bus/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,23 @@ class BusModelInputDTO(BaseModel):
description: str


class JoinedUserModelDTO(BaseModel):
class BusStopModelDTO(BaseModel):
id: int
name: str
location: str

id: int
student_id: str
name: str
phone_number: str

boarding_bus: BusModelDTO
destination_stop: BusStopModelDTO

model_config = ConfigDict(from_attributes=True)


class UserModelDTO(BaseModel):
id: int
student_id: str
Expand Down
5 changes: 3 additions & 2 deletions bus_boarding_api/web/api/bus/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
from bus_boarding_api.db.models.bus import BusModel
from bus_boarding_api.db.models.user import UserModel
from bus_boarding_api.web.api.bus.schema import (BusModelDTO, BusModelInputDTO,
UserModelDTO, BoardingRecordModelDTO)
BoardingRecordModelDTO,
JoinedUserModelDTO)
from bus_boarding_api.authentication import PermissionChecker
from bus_boarding_api.permissions.models_permissions import User, Bus, BusStop, BoardingRecord

Expand Down Expand Up @@ -63,7 +64,7 @@ async def get_bus_records(
@router.get("/{bus_id}/users",
dependencies=[Depends(PermissionChecker(
[Bus.permissions.READ, User.permissions.READ]))],
response_model=List[UserModelDTO])
response_model=List[JoinedUserModelDTO])
async def get_bus_users(
bus_id: int, limit: int = 1000, offset: int = 0, user_dao: UserDAO = Depends(),
) -> List[UserModel]:
Expand Down

0 comments on commit e1d819e

Please sign in to comment.