From 97ac0e50ec0167fd39120e5efcf8c347e0753c51 Mon Sep 17 00:00:00 2001 From: Gabriel Gazola Milan Date: Tue, 14 Nov 2023 13:44:53 -0300 Subject: [PATCH] feat: add endpoints for AI flooding detection --- api_dados_rio/v2/clima_alagamento/urls.py | 10 +++ api_dados_rio/v2/clima_alagamento/views.py | 77 ++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/api_dados_rio/v2/clima_alagamento/urls.py b/api_dados_rio/v2/clima_alagamento/urls.py index 3a96b16..88534bb 100644 --- a/api_dados_rio/v2/clima_alagamento/urls.py +++ b/api_dados_rio/v2/clima_alagamento/urls.py @@ -24,3 +24,13 @@ views.LastUpdate120MinFloodView, basename="ultima_atualizacao_alagamento_120min", ) +router.register( + r"alagamento_detectado_ia", + views.AIFloodingDetectionView, + basename="alagamento_detectado_ia", +) +router.register( + r"ultima_atualizacao_alagamento_detectado_ia", + views.LastUpdateAIFloodingDetectionView, + basename="ultima_atualizacao_alagamento_detectado_ia", +) diff --git a/api_dados_rio/v2/clima_alagamento/views.py b/api_dados_rio/v2/clima_alagamento/views.py index 3f7f080..7dbb9ce 100644 --- a/api_dados_rio/v2/clima_alagamento/views.py +++ b/api_dados_rio/v2/clima_alagamento/views.py @@ -177,3 +177,80 @@ def list(self, request): {"error": "Something went wrong. Try again later."}, status=500, ) + + +@method_decorator( + name="list", + decorator=swagger_auto_schema( + operation_summary="Retorna os pontos de alagamento detectados por IA.", + operation_description=""" + **Resultado**: Retorna uma lista contendo todos os pontos de alagamento detectados por IA + no seguinte formato: + + ```json + [ + { + "datetime": "", + "id_camera": "", + "url_camera": "", + "latitude": 0.0, + "longitude": 0.0, + "image_base64": "", + "ai_classification": [ + { + "object": "alagamento", + "label": false, + "confidence": "", + }, + ... + ], + }, + ... + ] + ``` + """, + ), +) +class AIFloodingDetectionView(LoggingMixin, ViewSet): + def list(self, request): + data_key = "flooding_detection_data" + try: + redis_url = getenv("REDIS_URL") + assert redis_url is not None + redis = RedisPal.from_url(redis_url) + # Get data and set cache + data = redis.get(data_key) + assert data is not None + assert isinstance(data, list) + assert len(data) > 0 + return Response(data) + except Exception: + return Response( + {"error": "Something went wrong. Try again later."}, + status=500, + ) + + +@method_decorator( + name="list", + decorator=swagger_auto_schema( + operation_summary="Retorna o horário de atualização dos pontos de alagamento detectados por IA.", + operation_description=""" + **Resultado**: Retorna um texto contendo o horário de atualização dos pontos de alagamento detectados por IA. + """, + ), +) +class LastUpdateAIFloodingDetectionView(LoggingMixin, ViewSet): + def list(self, request): + last_update_key = "flooding_detection_last_update" + try: + redis_url = getenv("REDIS_URL") + assert redis_url is not None + redis = RedisPal.from_url(redis_url) + data = redis.get(last_update_key) + return Response(data) + except Exception: + return Response( + {"error": "Something went wrong. Try again later."}, + status=500, + )