| @@ -1,10 +1,19 @@ | |||
| # Base API router -- collecting all APIs here to not clutter main.py | |||
| from fastapi import APIRouter | |||
| from apis.v1 import route_user, route_vehicle, route_auth, route_task | |||
| from apis.v1 import ( | |||
| route_user, | |||
| route_vehicle, | |||
| route_auth, | |||
| route_task, | |||
| route_maintenancejob, | |||
| ) | |||
| api_router = APIRouter() | |||
| api_router.include_router(route_user.router, prefix="/user", tags=["users"]) | |||
| api_router.include_router(route_vehicle.router, prefix="/vehicle", tags=["vehicles"]) | |||
| api_router.include_router(route_auth.router, prefix="", tags=["auth"]) | |||
| api_router.include_router(route_task.router, prefix="/task", tags=["task"]) | |||
| api_router.include_router( | |||
| route_maintenancejob.router, prefix="/maintenancejob", tags=["maintenancejob"] | |||
| ) | |||
| @@ -0,0 +1,76 @@ | |||
| from fastapi import Depends, APIRouter, HTTPException, status | |||
| from sqlalchemy.orm import Session | |||
| from db.session import get_db | |||
| from db.repository.maintenancejob import ( | |||
| create_new_maintenancejob, | |||
| create_car_part, | |||
| get_all_maintenance_jobs, | |||
| get_maintenance_job, | |||
| ) | |||
| from schemas.maintenancejob import CreateMaintenanceJob | |||
| from schemas.carpart import CreateCarPart | |||
| from db.models.user import User | |||
| from apis.v1.route_auth import get_current_user | |||
| router = APIRouter() | |||
| @router.post("/", status_code=status.HTTP_201_CREATED) | |||
| def create_maintenancejob( | |||
| maintenancejob: CreateMaintenanceJob, | |||
| db: Session = Depends(get_db), | |||
| current_user: User = Depends(get_current_user), | |||
| ): | |||
| if current_user.Role != "Maintenance" and current_user.Role != "Admin": | |||
| raise HTTPException( | |||
| status_code=403, detail="You are not authorized to perform this action" | |||
| ) | |||
| maintenancejob_res = create_new_maintenancejob( | |||
| maintenancejob=maintenancejob, maintenanceworker=current_user.Id, db=db | |||
| ) | |||
| return maintenancejob_res | |||
| @router.post("/carpart", status_code=status.HTTP_201_CREATED) | |||
| def create_carpart( | |||
| car_part: CreateCarPart, | |||
| db: Session = Depends(get_db), | |||
| current_user: User = Depends(get_current_user), | |||
| ): | |||
| if current_user.Role != "Maintenance" and current_user.Role != "Admin": | |||
| raise HTTPException( | |||
| status_code=403, detail="You are not authorized to perform this action" | |||
| ) | |||
| car_part_res = create_car_part(car_part=car_part, db=db) | |||
| return car_part_res | |||
| @router.get("/", status_code=status.HTTP_200_OK) | |||
| def get_all_maintenancejobs( | |||
| db: Session = Depends(get_db), | |||
| current_user: User = Depends(get_current_user), | |||
| ): | |||
| if current_user.Role != "Maintenance" and current_user.Role != "Admin": | |||
| raise HTTPException( | |||
| status_code=403, detail="You are not authorized to perform this action" | |||
| ) | |||
| maintenancejobs = get_all_maintenance_jobs(db) | |||
| return maintenancejobs | |||
| @router.get("/{maintenance_job_id}", status_code=status.HTTP_200_OK) | |||
| def get_maintenancejob( | |||
| maintenance_job_id: int, | |||
| db: Session = Depends(get_db), | |||
| current_user: User = Depends(get_current_user), | |||
| ): | |||
| if current_user.Role != "Maintenance" and current_user.Role != "Admin": | |||
| raise HTTPException( | |||
| status_code=403, detail="You are not authorized to perform this action" | |||
| ) | |||
| maintenancejob = get_maintenance_job(maintenance_job_id, db) | |||
| return maintenancejob | |||
| @@ -1,7 +1,5 @@ | |||
| from fastapi import Depends, APIRouter | |||
| from fastapi import Depends, APIRouter, HTTPException, status | |||
| from sqlalchemy.orm import Session | |||
| from fastapi import status, HTTPException | |||
| from typing import Annotated | |||
| from db.session import get_db | |||
| from core.config import settings | |||
| from db.repository.drivetask import ( | |||
| @@ -15,7 +13,6 @@ from db.repository.drivetask import ( | |||
| from schemas.drivetask import CreateTask | |||
| from db.models.user import User | |||
| from apis.v1.route_auth import get_current_user | |||
| from db.models.drivetask import DriveTask | |||
| router = APIRouter() | |||
| @@ -2,3 +2,6 @@ | |||
| from db.base_class import Base | |||
| from db.models.user import User | |||
| from db.models.vehicle import Vehicle | |||
| from db.models.carpart import CarPart | |||
| from db.models.maintenancejob import MaintenanceJob | |||
| from db.models.drivetask import DriveTask | |||
| @@ -0,0 +1,15 @@ | |||
| from sqlalchemy import Column, Integer, String, ForeignKey | |||
| from sqlalchemy.orm import relationship | |||
| from db.base import Base | |||
| class CarPart(Base): | |||
| Id = Column(Integer, primary_key=True, index=True) | |||
| # a list of weak entities of class CarPart | |||
| ParentId = Column(Integer, ForeignKey("maintenancejob.Id"), nullable=False) | |||
| parent = relationship("MaintenanceJob", back_populates="CarParts") | |||
| Name = Column(String, nullable=False) | |||
| Number = Column(String, nullable=False) | |||
| Condition = Column(String, nullable=False) | |||
| ImageURL = Column(String, nullable=False) | |||
| Cost = Column(Integer, nullable=False) | |||
| @@ -0,0 +1,12 @@ | |||
| from sqlalchemy import Column, Integer, String, DateTime, ForeignKey | |||
| from sqlalchemy.orm import relationship | |||
| from db.base import Base | |||
| class MaintenanceJob(Base): | |||
| Id = Column(Integer, primary_key=True, index=True) | |||
| # a list of weak entities of class CarPart | |||
| CarParts = relationship("CarPart", back_populates="parent") | |||
| Description = Column(String, nullable=False) | |||
| Date = Column(DateTime, nullable=False) | |||
| MaintenanceWorker = Column(ForeignKey("user.Id"), nullable=False) | |||
| @@ -0,0 +1,63 @@ | |||
| from sqlalchemy.orm import Session | |||
| from schemas.maintenancejob import CreateMaintenanceJob | |||
| from db.models.maintenancejob import MaintenanceJob | |||
| from schemas.carpart import CreateCarPart | |||
| from db.models.carpart import CarPart | |||
| def create_new_maintenancejob( | |||
| maintenancejob: CreateMaintenanceJob, maintenanceworker, db: Session | |||
| ): | |||
| maintenancejob_object = MaintenanceJob( | |||
| MaintenanceWorker=maintenanceworker, | |||
| Description=maintenancejob.Description, | |||
| Date=maintenancejob.Date, | |||
| ) | |||
| print("OBJECT CREATED") | |||
| db.add(maintenancejob_object) | |||
| db.commit() | |||
| db.refresh(maintenancejob_object) | |||
| return maintenancejob_object | |||
| def create_car_part(car_part: CreateCarPart, db: Session): | |||
| car_part_object = CarPart( | |||
| ParentId=car_part.ParentId, | |||
| Name=car_part.Name, | |||
| Number=car_part.Number, | |||
| Condition=car_part.Condition, | |||
| ImageURL=car_part.ImageURL, | |||
| Cost=car_part.Cost, | |||
| ) | |||
| print("OBJECT CREATED") | |||
| db.add(car_part_object) | |||
| db.commit() | |||
| db.refresh(car_part_object) | |||
| return car_part_object | |||
| def calculate_total_cost(car_parts: CarPart): | |||
| total_cost = 0 | |||
| for part in car_parts: | |||
| total_cost += part["Cost"] | |||
| return total_cost | |||
| def get_all_maintenance_jobs(db: Session): | |||
| maintenancejobs = db.query(MaintenanceJob).all() | |||
| result = [] | |||
| for job in maintenancejobs: | |||
| job_dict = job.__dict__ | |||
| job_dict["CarParts"] = [part.__dict__ for part in job.CarParts] | |||
| job_dict["TotalCost"] = calculate_total_cost(job.CarParts) | |||
| result.append(job_dict) | |||
| return maintenancejobs | |||
| def get_maintenance_job(maintenancejob_id: int, db: Session): | |||
| maintenancejob = ( | |||
| db.query(MaintenanceJob).filter(MaintenanceJob.Id == maintenancejob_id).first() | |||
| ) | |||
| result = maintenancejob.__dict__ | |||
| result["CarParts"] = [part.__dict__ for part in maintenancejob.CarParts] | |||
| return result | |||
| @@ -0,0 +1,10 @@ | |||
| from pydantic import BaseModel, Field | |||
| class CreateCarPart(BaseModel): | |||
| ParentId: int = Field(...) | |||
| Name: str = Field(...) | |||
| Number: str = Field(...) | |||
| Condition: str = Field(...) | |||
| ImageURL: str = Field(...) | |||
| Cost: int = Field(...) | |||
| @@ -0,0 +1,7 @@ | |||
| from pydantic import BaseModel, Field | |||
| from datetime import datetime | |||
| class CreateMaintenanceJob(BaseModel): | |||
| Description: str = Field(...) | |||
| Date: datetime = Field(...) | |||