@@ -1,10 +1,19 @@ | |||||
# Base API router -- collecting all APIs here to not clutter main.py | # Base API router -- collecting all APIs here to not clutter main.py | ||||
from fastapi import APIRouter | 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 = APIRouter() | ||||
api_router.include_router(route_user.router, prefix="/user", tags=["users"]) | 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_vehicle.router, prefix="/vehicle", tags=["vehicles"]) | ||||
api_router.include_router(route_auth.router, prefix="", tags=["auth"]) | 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_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 sqlalchemy.orm import Session | ||||
from fastapi import status, HTTPException | |||||
from typing import Annotated | |||||
from db.session import get_db | from db.session import get_db | ||||
from core.config import settings | from core.config import settings | ||||
from db.repository.drivetask import ( | from db.repository.drivetask import ( | ||||
@@ -15,7 +13,6 @@ from db.repository.drivetask import ( | |||||
from schemas.drivetask import CreateTask | from schemas.drivetask import CreateTask | ||||
from db.models.user import User | from db.models.user import User | ||||
from apis.v1.route_auth import get_current_user | from apis.v1.route_auth import get_current_user | ||||
from db.models.drivetask import DriveTask | |||||
router = APIRouter() | router = APIRouter() | ||||
@@ -2,3 +2,6 @@ | |||||
from db.base_class import Base | from db.base_class import Base | ||||
from db.models.user import User | from db.models.user import User | ||||
from db.models.vehicle import Vehicle | 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(...) |