main.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from fastapi import FastAPI, Request
  2. from fastapi.exceptions import RequestValidationError
  3. from fastapi.responses import JSONResponse
  4. from app.api.bacnet import router as bacnet_router
  5. from app.api.modbus import router as modbus_router
  6. from app.api.s7 import router as s7_router
  7. from app.response import response_payload
  8. def validation_error_message(exc: RequestValidationError) -> str:
  9. messages: list[str] = []
  10. for error in exc.errors():
  11. location = ".".join(str(item) for item in error.get("loc", []) if item != "body")
  12. message = error.get("msg", "validation error")
  13. messages.append(f"{location}: {message}" if location else message)
  14. return "; ".join(messages) or "validation error"
  15. def create_app() -> FastAPI:
  16. app = FastAPI(title="Data Collector Gateway")
  17. app.include_router(modbus_router, prefix="/api/dc-gateway")
  18. app.include_router(s7_router, prefix="/api/dc-gateway")
  19. app.include_router(bacnet_router, prefix="/api/dc-gateway")
  20. @app.exception_handler(RequestValidationError)
  21. async def request_validation_exception_handler(
  22. request: Request,
  23. exc: RequestValidationError,
  24. ) -> JSONResponse:
  25. data: dict[str, list] = {}
  26. if request.url.path.endswith("/modbus/read"):
  27. data = {"communication": []}
  28. elif request.url.path.endswith(("/modbus/read_points", "/modbus/read-points")):
  29. data = {"points": []}
  30. elif request.url.path.endswith("/s7/read"):
  31. data = {"communication": []}
  32. elif request.url.path.endswith("/s7/read_points"):
  33. data = {"points": []}
  34. elif request.url.path.endswith("/s7/connect_scan"):
  35. data = {"available": []}
  36. elif request.url.path.endswith(("/bacnet/read_points", "/bacnet/search_points")):
  37. data = {"points": []}
  38. return JSONResponse(
  39. status_code=200,
  40. content=response_payload(1, validation_error_message(exc), data),
  41. )
  42. return app
  43. app = create_app()
  44. def main() -> None:
  45. import uvicorn
  46. uvicorn.run(app, host="0.0.0.0", port=8000)