Demonicade's picture
Upload folder using huggingface_hub
2d7db98 verified
Raw
History Blame Contribute Delete
4.86 kB
from fastapi import APIRouter, UploadFile, File, HTTPException
import pandas as pd
import io
from app.data.data_store import store
from app.database import log_activity, log_upload
router = APIRouter(prefix="/upload", tags=["Data Upload"])
@router.post("/bms")
async def upload_bms(file: UploadFile = File(...)):
"""Upload BMS telemetry CSV. Required: timestamp, vehicle_id, soc, voltage, current, temperature, cycle_count"""
try:
contents = await file.read()
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
store.set_bms(df)
data = store.get_bms()
n_rows = sum(len(v) for v in data.values())
log_upload("bms", file.filename, n_rows)
log_activity(
action = f"Uploaded BMS data: {len(data)} vehicles, {n_rows} readings",
endpoint = "/upload/bms",
method = "POST",
details = {"filename": file.filename, "vehicles": len(data), "rows": n_rows}
)
return {"message": "BMS data uploaded successfully", "vehicles": len(data), "total_readings": n_rows}
except Exception as e:
log_upload("bms", file.filename, 0, status="error", error_msg=str(e))
raise HTTPException(status_code=400, detail=str(e))
@router.post("/fleet")
async def upload_fleet(file: UploadFile = File(...)):
"""Upload fleet operational data CSV. Required: asset_id, category, route_distance_km, payload_tons, duty_cycle_hrs, dwell_time_hrs, terrain_score, diesel_l_per_100km, age_years"""
try:
contents = await file.read()
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
records = df.to_dict('records')
store.set_fleet(records)
log_upload("fleet", file.filename, len(records))
log_activity(
action = f"Uploaded fleet data: {len(records)} assets",
endpoint = "/upload/fleet",
method = "POST",
details = {"filename": file.filename, "assets": len(records)}
)
return {"message": "Fleet data uploaded successfully", "assets": len(records)}
except Exception as e:
log_upload("fleet", file.filename, 0, status="error", error_msg=str(e))
raise HTTPException(status_code=400, detail=str(e))
@router.post("/suppliers")
async def upload_suppliers(file: UploadFile = File(...)):
"""Upload supplier master CSV. Required: supplier_id, name, tier, material, country, geopolitical_risk, esg_score, quality_score, lead_time_days, concentration_pct"""
try:
contents = await file.read()
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
records = df.to_dict('records')
store.set_suppliers(records)
log_upload("suppliers", file.filename, len(records))
log_activity(
action = f"Uploaded supplier data: {len(records)} suppliers",
endpoint = "/upload/suppliers",
method = "POST",
details = {"filename": file.filename, "suppliers": len(records)}
)
return {"message": "Supplier data uploaded successfully", "suppliers": len(records)}
except Exception as e:
log_upload("suppliers", file.filename, 0, status="error", error_msg=str(e))
raise HTTPException(status_code=400, detail=str(e))
@router.post("/inspections")
async def upload_inspections(file: UploadFile = File(...)):
"""Upload incoming inspection CSV. Required: lot_id, supplier_id, material, defect_rate, inspection_date"""
try:
contents = await file.read()
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
records = df.to_dict('records')
store.set_inspections(records)
log_upload("inspections", file.filename, len(records))
log_activity(
action = f"Uploaded inspection data: {len(records)} records",
endpoint = "/upload/inspections",
method = "POST",
details = {"filename": file.filename, "inspections": len(records)}
)
return {"message": "Inspection data uploaded successfully", "inspections": len(records)}
except Exception as e:
log_upload("inspections", file.filename, 0, status="error", error_msg=str(e))
raise HTTPException(status_code=400, detail=str(e))
@router.post("/reset")
async def reset_data():
"""Reset all data back to synthetic demo datasets and clear DB tables."""
store.reset()
log_activity(
action = "Reset all data to synthetic demo datasets",
endpoint = "/upload/reset",
method = "POST"
)
return {"message": "Data reset to synthetic demo datasets"}
@router.get("/history")
def upload_history():
"""Return the upload history from the database."""
from app.database import get_upload_history
return get_upload_history(limit=50)