25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

142 lines
4.8 KiB

  1. from fastapi import APIRouter, Depends, HTTPException, status
  2. from typing import List
  3. from schemas.reslevis import (
  4. BuildingItem, PlanItem, ZoneItem, GatewayItem, TrackerItem,
  5. OperatorItem, SubjectItem, AlarmItem, TrackItem
  6. )
  7. from logica_reslevis.gateway import GatewayJsonRepository
  8. # importa le dipendenze di sicurezza
  9. from security import get_current_user, require_roles
  10. gateway_repo = GatewayJsonRepository()
  11. router = APIRouter()
  12. # -----------------------
  13. # Endpoints pubblici (se vuoi che restino pubblici, niente Depends)
  14. # -----------------------
  15. @router.get("/getBuildings", response_model=List[BuildingItem], tags=["Reslevis"])
  16. def getBuildings():
  17. return []
  18. @router.get("/getPlans", response_model=List[PlanItem], tags=["Reslevis"])
  19. def getPlans():
  20. return []
  21. @router.get("/getZones", response_model=List[ZoneItem], tags=["Reslevis"])
  22. def getZones():
  23. return []
  24. # -----------------------
  25. # Endpoints protetti: richiedono almeno un Bearer token valido
  26. # -----------------------
  27. @router.get("/getGateways", response_model=List[GatewayItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  28. def getGateways():
  29. return gateway_repo.list()
  30. @router.get("/getTrackers", response_model=List[TrackerItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  31. def getTrackers():
  32. return []
  33. @router.get("/getOperators", response_model=List[OperatorItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  34. def getOperators():
  35. return []
  36. @router.get("/getSubjects", response_model=List[SubjectItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  37. def getSubjects():
  38. return []
  39. @router.get("/getAlarms", response_model=List[AlarmItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  40. def getAlarms():
  41. return []
  42. @router.get("/getTracks", response_model=List[TrackItem], tags=["Reslevis"], dependencies=[Depends(get_current_user)])
  43. def getTracks():
  44. return []
  45. # -----------------------
  46. # Operazioni di scrittura su Gateway:
  47. # - Token valido
  48. # - Ruolo richiesto (esempio: "reslevis:write")
  49. # Cambia il nome ruolo per allinearlo a come lo hai definito in Keycloak
  50. # -----------------------
  51. write_role = "reslevis:write" # esempio; usa il tuo realm/client role
  52. @router.post(
  53. "/postGateway",
  54. tags=["Reslevis"],
  55. dependencies=[Depends(require_roles(write_role))]
  56. )
  57. def postGateway(item: GatewayItem):
  58. try:
  59. gateway_repo.add(item)
  60. return {"message": "OK"}
  61. except ValueError as e:
  62. raise HTTPException(status_code=409, detail=str(e))
  63. except Exception as e:
  64. raise HTTPException(status_code=500, detail=f"Errore interno: {e}")
  65. @router.put(
  66. "/updateGateway",
  67. tags=["Reslevis"],
  68. dependencies=[Depends(require_roles(write_role))]
  69. )
  70. def updateGateway(item: GatewayItem):
  71. try:
  72. gateway_repo.update(item)
  73. return {"message": "OK"}
  74. except ValueError as e:
  75. msg = str(e)
  76. if "non trovato" in msg:
  77. raise HTTPException(status_code=404, detail=msg)
  78. raise HTTPException(status_code=409, detail=msg)
  79. except Exception as e:
  80. raise HTTPException(status_code=500, detail=f"Errore interno: {e}")
  81. @router.delete(
  82. "/removeGateway/{gateway_id}",
  83. tags=["Reslevis"],
  84. dependencies=[Depends(require_roles(write_role))]
  85. )
  86. def removeGateway(gateway_id: str):
  87. try:
  88. gateway_repo.remove(gateway_id)
  89. return {"message": "OK"}
  90. except ValueError as e:
  91. raise HTTPException(status_code=404, detail=str(e))
  92. except Exception as e:
  93. raise HTTPException(status_code=500, detail=f"Errore interno: {e}")
  94. @router.post("/postBuilding", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  95. def postBuilding(item: BuildingItem):
  96. return {"message": "OK"}
  97. @router.post("/postPlan", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  98. def postPlan(item: PlanItem):
  99. return {"message": "OK"}
  100. @router.post("/postZone", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  101. def postZone(item: ZoneItem):
  102. return {"message": "OK"}
  103. @router.post("/postTracker", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  104. def postTracker(item: TrackerItem):
  105. return {"message": "OK"}
  106. @router.post("/postOperator", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  107. def postOperator(item: OperatorItem):
  108. return {"message": "OK"}
  109. @router.post("/postSubject", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  110. def postSubject(item: SubjectItem):
  111. return {"message": "OK"}
  112. @router.post("/postAlarm", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  113. def postAlarm(item: AlarmItem):
  114. return {"message": "OK"}
  115. @router.post("/postTrack", tags=["Reslevis"], dependencies=[Depends(require_roles(write_role))])
  116. def postTrack(item: TrackItem):
  117. return {"message": "OK"}