| @@ -9,6 +9,7 @@ from db.repository.drivetask import ( | |||
| get_all_tasks, | |||
| get_task_by_id, | |||
| get_tasks_by_driver, | |||
| edit_task | |||
| ) | |||
| from schemas.drivetask import CreateTask | |||
| from db.models.user import User | |||
| @@ -118,3 +119,21 @@ def getTasksByDriver( | |||
| 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 | |||
| @@ -5,9 +5,9 @@ from fastapi import Depends | |||
| from typing import List, Annotated | |||
| from apis.v1.route_auth import get_current_user | |||
| from db.models.user import User | |||
| from schemas.user import UserCreate, ShowUser | |||
| from schemas.user import UserCreate, ShowUser, ShowDriver, DriverCreate | |||
| from db.session import get_db | |||
| from db.repository.user import create_new_user, list_users, get_user_by_id, replace_user_data | |||
| from db.repository.user import create_new_user, list_users, get_user_by_id, replace_user_data, create_new_driver | |||
| router = APIRouter() | |||
| @@ -26,6 +26,16 @@ def create_user( | |||
| user = create_new_user(user=user, db=db) | |||
| return user | |||
| @router.post("/driver", response_model=ShowDriver, status_code=status.HTTP_201_CREATED) | |||
| def create_driver( | |||
| driver: DriverCreate, | |||
| 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") | |||
| driver = create_new_driver(driver=driver, db=db) | |||
| return driver | |||
| @router.get("/", response_model=List[ShowUser], status_code=status.HTTP_200_OK) | |||
| def get_all_users(db: Session = Depends(get_db), role: str = None): | |||
| @@ -63,3 +73,13 @@ def get_user(user_id: int, db: Session = Depends(get_db)): | |||
| if not user: | |||
| raise HTTPException(status_code=404, detail="User not found") | |||
| return user | |||
| @router.get("/driver/{driver_id}", response_model=ShowDriver, status_code=status.HTTP_200_OK) | |||
| def get_driver(driver_id: int, db: Session = Depends(get_db)): | |||
| driver = get_user_by_id(user_id=driver_id, role = "Driver", db=db) | |||
| res = driver.__dict__ | |||
| res["AssignedVehicle"] = driver.vehicle | |||
| if not driver: | |||
| raise HTTPException(status_code=404, detail="Driver not found") | |||
| return driver | |||
| @@ -64,3 +64,14 @@ def get_task_by_id(task_id: int, db: Session): | |||
| def get_all_tasks(db: Session): | |||
| tasks = db.query(DriveTask).all() | |||
| return tasks | |||
| def edit_task(task_id: int, task: CreateTask, db: Session): | |||
| tasks = db.query(DriveTask).filter(DriveTask.Id == task_id).first() | |||
| if not tasks: | |||
| return "notaskfound" | |||
| tasks.Description = task.Description | |||
| tasks.StartLocation = task.StartLocation | |||
| tasks.EndLocation = task.EndLocation | |||
| db.commit() | |||
| db.refresh(tasks) | |||
| return tasks | |||
| @@ -1,7 +1,7 @@ | |||
| # Creating a new user in the database | |||
| from sqlalchemy.orm import Session | |||
| from schemas.user import UserCreate | |||
| from schemas.user import UserCreate, DriverCreate | |||
| from db.models.user import User | |||
| from core.hashing import Hasher | |||
| @@ -22,10 +22,28 @@ def create_new_user(user: UserCreate, db: Session): | |||
| db.commit() | |||
| db.refresh(user_object) | |||
| return user_object | |||
| def create_new_driver(driver: DriverCreate, db: Session): | |||
| driver_object = User( | |||
| Email=driver.Email, | |||
| Name=driver.Name, | |||
| MiddleName=driver.MiddleName, | |||
| LastName=driver.LastName, | |||
| GovernmentId=driver.GovernmentId, | |||
| Address=driver.Address, | |||
| ContactNumber=driver.ContactNumber, | |||
| Role="Driver", | |||
| HashedPassword=Hasher.get_password_hash(driver.Password), | |||
| DrivingLicenseNumber=driver.DrivingLicenseNumber | |||
| ) | |||
| db.add(driver_object) | |||
| db.commit() | |||
| db.refresh(driver_object) | |||
| return driver_object | |||
| def get_user_by_id(user_id: int, db: Session): | |||
| def get_user_by_id(user_id: int, role: str, db: Session): | |||
| user = db.query(User).filter(User.Id == user_id).first() | |||
| if user.Role != role: | |||
| return False | |||
| return user | |||
| @@ -1,7 +1,7 @@ | |||
| # Purpose: User schema for pydantic (validation, inside-api usage) | |||
| from pydantic import BaseModel, EmailStr, Field | |||
| from schemas.vehicle import OutputVehicle | |||
| class UserCreate(BaseModel): | |||
| Email: EmailStr | |||
| @@ -13,8 +13,10 @@ class UserCreate(BaseModel): | |||
| GovernmentId: str = Field(...) | |||
| Address: str = Field(...) | |||
| Email: EmailStr = Field(...) | |||
| Role: str = Field(..., min_length=3, max_length=50) | |||
| class DriverCreate(UserCreate): | |||
| DrivingLicenseNumber: str = Field(...) | |||
| class ShowUser(BaseModel): | |||
| Id: int | |||
| @@ -26,9 +28,12 @@ class ShowUser(BaseModel): | |||
| Address: str | |||
| Email: EmailStr | |||
| Role: str | |||
| AssignedVehicle: int | None | |||
| class Config: | |||
| orm_mode = True | |||
| validate_assignment = True | |||
| class ShowDriver(ShowUser): | |||
| DrivingLicenseNumber: str | None | |||
| AssignedVehicle: OutputVehicle | None | |||