You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
Python
95 lines
2.8 KiB
Python
from typing import List, Optional
|
|
from fastapi import APIRouter, Depends
|
|
from fastapi.responses import JSONResponse, FileResponse
|
|
from pydantic import BaseModel
|
|
import os
|
|
|
|
|
|
from src.auth.service import JWTBearer
|
|
|
|
|
|
from src.masterdata.router import router as masterdata_router
|
|
from src.plant_masterdata.router import router as plant_masterdata
|
|
from src.plant_transaction_data.router import router as plant_transaction_data
|
|
from src.equipment.router import router as equipment_router
|
|
from src.yeardata.router import router as yeardata_router
|
|
from src.equipment_master.router import router as equipment_master_router
|
|
from src.uploaded_file.router import router as uploaded_file_router
|
|
|
|
|
|
class ErrorMessage(BaseModel):
|
|
msg: str
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
detail: Optional[List[ErrorMessage]]
|
|
|
|
|
|
api_router = APIRouter(
|
|
default_response_class=JSONResponse,
|
|
responses={
|
|
400: {"model": ErrorResponse},
|
|
401: {"model": ErrorResponse},
|
|
403: {"model": ErrorResponse},
|
|
404: {"model": ErrorResponse},
|
|
500: {"model": ErrorResponse},
|
|
},
|
|
)
|
|
|
|
|
|
@api_router.get("/healthcheck", include_in_schema=False)
|
|
def healthcheck():
|
|
return {"status": "ok"}
|
|
|
|
|
|
authenticated_api_router = APIRouter(
|
|
dependencies=[Depends(JWTBearer())],
|
|
)
|
|
|
|
authenticated_api_router.include_router(
|
|
uploaded_file_router, prefix="/uploaded-files", tags=["uploaded_files"]
|
|
)
|
|
|
|
# Master Data
|
|
authenticated_api_router.include_router(
|
|
masterdata_router, prefix="/masterdata", tags=["masterdata"]
|
|
)
|
|
|
|
authenticated_api_router.include_router(
|
|
plant_masterdata, prefix="/plant-masterdata", tags=["plant_masterdata"]
|
|
)
|
|
authenticated_api_router.include_router(
|
|
plant_transaction_data,
|
|
prefix="/plant-transaction-data",
|
|
tags=["plant_transaction_data"],
|
|
)
|
|
|
|
authenticated_api_router.include_router(
|
|
equipment_router, prefix="/equipment", tags=["equipment"]
|
|
)
|
|
|
|
authenticated_api_router.include_router(
|
|
equipment_master_router, prefix="/equipment-master", tags=["equipment_master"]
|
|
)
|
|
|
|
authenticated_api_router.include_router(
|
|
yeardata_router, prefix="/yeardata", tags=["yeardata"]
|
|
)
|
|
|
|
@api_router.get("/uploads/{file_path:path}", include_in_schema=False)
|
|
def uploads(file_path: str):
|
|
"""Endpoint to static folder on backend ."""
|
|
uploads_dir = os.path.join(os.path.dirname(__file__), "uploads")
|
|
abs_file_path = os.path.abspath(os.path.join(uploads_dir, file_path))
|
|
|
|
# Security check: ensure abs_file_path is inside uploads_dir
|
|
if not abs_file_path.startswith(os.path.abspath(uploads_dir)):
|
|
return JSONResponse(status_code=403, content={"detail": [{"msg": "Forbidden"}]})
|
|
|
|
if not os.path.isfile(abs_file_path):
|
|
return JSONResponse(status_code=404, content={"detail": [{"msg": "File not found"}]})
|
|
|
|
return FileResponse(abs_file_path)
|
|
|
|
api_router.include_router(authenticated_api_router)
|