from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from typing import List
from app.api.dependencies.database import get_async_session
from app.api.dependencies.auth import get_current_active_user
from app.schemas.doctor import DoctorCreate, DoctorUpdate, DoctorResponse
from app.models.doctor import Doctor
from app.models.user import User
router = APIRouter(prefix="/doctors", tags=["doctors"])
@router.post("/", response_model=DoctorResponse)
async def create_doctor(
doctor_data: DoctorCreate,
db: AsyncSession = Depends(get_async_session),
current_user: User = Depends(get_current_active_user),
):
doctor = Doctor(**doctor_data.model_dump())
db.add(doctor)
await db.commit()
await db.refresh(doctor)
return doctor
@router.get("/", response_model=List[DoctorResponse],operation_id="get_doctors")
async def get_doctors(
skip: int = 0,
limit: int = 100,
db: AsyncSession = Depends(get_async_session),
current_user: User = Depends(get_current_active_user),
):
result = await db.execute(select(Doctor).offset(skip).limit(limit))
doctors = result.scalars().all()
return doctors
@router.get("/{doctor_id}", response_model=DoctorResponse,operation_id="get_doctor")
async def get_doctor(
doctor_id: int,
db: AsyncSession = Depends(get_async_session),
current_user: User = Depends(get_current_active_user),
):
result = await db.execute(select(Doctor).where(Doctor.id == doctor_id))
doctor = result.scalar_one_or_none()
if not doctor:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Doctor not found"
)
return doctor
@router.put("/{doctor_id}", response_model=DoctorResponse,operation_id="update_doctor")
async def update_doctor(
doctor_id: int,
doctor_data: DoctorUpdate,
db: AsyncSession = Depends(get_async_session),
current_user: User = Depends(get_current_active_user),
):
result = await db.execute(select(Doctor).where(Doctor.id == doctor_id))
doctor = result.scalar_one_or_none()
if not doctor:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Doctor not found"
)
update_data = doctor_data.model_dump(exclude_unset=True)
for field, value in update_data.items():
setattr(doctor, field, value)
await db.commit()
await db.refresh(doctor)
return doctor
@router.delete("/{doctor_id}")
async def delete_doctor(
doctor_id: int,
db: AsyncSession = Depends(get_async_session),
current_user: User = Depends(get_current_active_user),
):
result = await db.execute(select(Doctor).where(Doctor.id == doctor_id))
doctor = result.scalar_one_or_none()
if not doctor:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Doctor not found"
)
await db.delete(doctor)
await db.commit()
return {"message": "Doctor deleted successfully"}