126 lines
3.9 KiB
Python

from typing import Any, List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from app import crud, models, schemas
from app.api import deps
router = APIRouter()
@router.get("/", response_model=List[schemas.doctor.Doctor])
def read_doctors(
db: Session = Depends(deps.get_db),
skip: int = 0,
limit: int = 100,
specialty: Optional[str] = Query(None, description="Filter doctors by specialty"),
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Retrieve doctors.
"""
if specialty:
doctors = crud.crud_doctor.doctor.get_multi_by_specialty(
db, specialty=specialty, skip=skip, limit=limit
)
else:
doctors = crud.crud_doctor.doctor.get_multi(db, skip=skip, limit=limit)
return doctors
@router.post("/", response_model=schemas.doctor.Doctor)
def create_doctor(
*,
db: Session = Depends(deps.get_db),
doctor_in: schemas.doctor.DoctorCreate,
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Create new doctor.
"""
# Check if user exists
user = crud.crud_user.user.get(db, id=doctor_in.user_id)
if not user:
raise HTTPException(
status_code=404,
detail="The user with this id does not exist in the system",
)
# Check if doctor already exists for this user
doctor = crud.crud_doctor.doctor.get_by_user_id(db, user_id=doctor_in.user_id)
if doctor:
raise HTTPException(
status_code=400,
detail="The doctor with this user_id already exists in the system",
)
# Check if license number is already registered
doctor = crud.crud_doctor.doctor.get_by_license_number(db, license_number=doctor_in.license_number)
if doctor:
raise HTTPException(
status_code=400,
detail="The doctor with this license_number already exists in the system",
)
doctor = crud.crud_doctor.doctor.create(db, obj_in=doctor_in)
return doctor
@router.get("/{doctor_id}", response_model=schemas.doctor.Doctor)
def read_doctor(
*,
db: Session = Depends(deps.get_db),
doctor_id: int,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Get doctor by ID.
"""
doctor = crud.crud_doctor.doctor.get(db, id=doctor_id)
if not doctor:
raise HTTPException(status_code=404, detail="Doctor not found")
return doctor
@router.put("/{doctor_id}", response_model=schemas.doctor.Doctor)
def update_doctor(
*,
db: Session = Depends(deps.get_db),
doctor_id: int,
doctor_in: schemas.doctor.DoctorUpdate,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Update a doctor.
"""
doctor = crud.crud_doctor.doctor.get(db, id=doctor_id)
if not doctor:
raise HTTPException(status_code=404, detail="Doctor not found")
# Check permissions
if not crud.crud_user.user.is_superuser(current_user):
# Regular users can only update their own doctor data
if not current_user.doctor or current_user.doctor.id != doctor_id:
raise HTTPException(status_code=403, detail="Not enough permissions")
doctor = crud.crud_doctor.doctor.update(db, db_obj=doctor, obj_in=doctor_in)
return doctor
@router.delete("/{doctor_id}", response_model=schemas.doctor.Doctor)
def delete_doctor(
*,
db: Session = Depends(deps.get_db),
doctor_id: int,
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Delete a doctor.
"""
doctor = crud.crud_doctor.doctor.get(db, id=doctor_id)
if not doctor:
raise HTTPException(status_code=404, detail="Doctor not found")
doctor = crud.crud_doctor.doctor.remove(db, id=doctor_id)
return doctor