|
- from fastapi import Depends, APIRouter, HTTPException, status
- from sqlalchemy.orm import Session
- from db.session import get_db
- from core.config import settings
- from db.repository.drivetask import (
- create_new_task,
- get_task_driver,
- change_task_status,
- get_all_tasks,
- get_task_by_id,
- get_tasks_by_driver,
- edit_task,
- get_active_route_by_driver,
- get_my_routes,
- )
- from schemas.drivetask import CreateTask, ShowTask
- from db.models.user import User
- from apis.v1.route_auth import get_current_user
- from typing import List
-
- router = APIRouter()
-
-
- @router.post("/", status_code=status.HTTP_201_CREATED)
- def create_task(
- task: CreateTask,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Admin":
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- task_res = create_new_task(task=task, db=db)
- if task_res == "notdriver":
- raise HTTPException(
- status_code=404, detail=f"Driver with id {task.DriverId} not found"
- )
- return task
-
-
- @router.patch("/", status_code=status.HTTP_200_OK)
- def changeStatus(
- task_id: int,
- status: str,
- distance: float = 0,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role == "Admin" or current_user.Role == "Driver":
- if status not in settings.ALLOWED_TASK_STATUS:
- raise HTTPException(
- status_code=400,
- detail=f"Status {status} is not allowed. Allowed status are {settings.ALLOWED_TASK_STATUS}",
- )
- if current_user.Role == "Driver":
- verification = get_task_driver(task_id, db)
- if verification.Id != current_user.Id:
- raise HTTPException(
- status_code=403,
- detail="You are not authorized to perform this action",
- )
- task = change_task_status(task_id, status, distance, db)
- if task == "notaskfound":
- raise HTTPException(
- status_code=404, detail=f"Task with id {task_id} not found"
- )
- return task
- else:
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
-
-
- @router.get("/", response_model=List[ShowTask], status_code=status.HTTP_200_OK)
- def getAllTasks(
- status: str = "Any",
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role == "Admin":
- tasks = get_all_tasks(status, db)
- return tasks
- else:
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
-
-
- @router.get("/{task_id}", response_model=ShowTask, status_code=status.HTTP_200_OK)
- def getTaskById(
- task_id: int,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Admin":
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- task = get_task_by_id(task_id, db)
- if task == "notaskfound":
- raise HTTPException(status_code=404, detail=f"Task with id {task_id} not found")
- return task
-
-
- @router.get("/driver/{driver_id}", status_code=status.HTTP_200_OK)
- def getTasksByDriver(
- driver_id: int,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Admin" and current_user.Role != "Driver":
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- if current_user.Role == "Driver":
- if current_user.Id != driver_id:
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- tasks = get_tasks_by_driver(driver_id, db)
- if tasks == "notdriver":
- raise HTTPException(
- status_code=404, detail=f"Driver with id {driver_id} not found"
- )
- return tasks
-
-
- @router.put("/{task_id}", status_code=status.HTTP_200_OK)
- def updateTask(
- task_id: int,
- task: CreateTask,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Admin":
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- task = edit_task(task_id, task, db)
- if task == "notaskfound":
- raise HTTPException(status_code=404, detail=f"Task with id {task_id} not found")
- return task
-
-
- @router.get("/active/{driver_id}", status_code=status.HTTP_200_OK)
- def getActiveRoute(
- driver_id: int,
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Admin" and current_user.Id != driver_id:
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- route = get_active_route_by_driver(driver_id, db)
- if route == "notdriver":
- raise HTTPException(
- status_code=404, detail=f"Driver with id {driver_id} not found"
- )
- if route == "noroute":
- raise HTTPException(
- status_code=404, detail=f"Driver with id {driver_id} has no active route"
- )
- return route
-
-
- @router.get("/myroutes", status_code=status.HTTP_200_OK)
- def getMyRoutes(
- db: Session = Depends(get_db),
- current_user: User = Depends(get_current_user),
- ):
- if current_user.Role != "Driver":
- raise HTTPException(
- status_code=403, detail="You are not authorized to perform this action"
- )
- routes = get_my_routes(current_user.Id, db)
- if routes == "notdriver":
- raise HTTPException(
- status_code=404, detail=f"Driver with id {current_user.Id} not found"
- )
- if not routes:
- raise HTTPException(
- status_code=404, detail=f"Driver with id {current_user.Id} has no routes"
- )
- return routes
|