From 158b7c20253834175a1911190f89c247ba84ae32 Mon Sep 17 00:00:00 2001 From: Fernanda Date: Wed, 15 Apr 2026 13:36:29 -0300 Subject: [PATCH] Adiciona funcionalidade de leitura com o dao e o service --- app.py | 8 +++++++- dao/leitura_dao.py | 27 +++++++++++++++++++++++++ service/leitura_service.py | 41 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 dao/leitura_dao.py create mode 100644 service/leitura_service.py diff --git a/app.py b/app.py index 5ffc791..3073fd2 100644 --- a/app.py +++ b/app.py @@ -3,6 +3,8 @@ from flask import Flask from database import db from controller.usuario_controller import usuario_bp from controller.dispositivo_controller import dispositivo_bp +from controller.leitura_controller import leitura_bp +import os # Variaveis dinamicas que sao usadas para definir qual a porta do servidor e o host do mesmo host = str(os.environ.get("HOST", "localhost")) @@ -16,11 +18,15 @@ db_host = str(os.environ.get("POSTGRES_HOST_KEY", "127.0.0.1")) db_password = int(os.environ.get("POSTGRES_PASSWORD_KEY", 123456789)) app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///graphics_analytics.db' +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( + 'DATABASE_URL', + 'postgresql://postgres:postgres@localhost:5432/graphics_analytics' +) db.init_app(app) app.register_blueprint(usuario_bp) app.register_blueprint(dispositivo_bp) +app.register_blueprint(leitura_bp) with app.app_context(): db.create_all() diff --git a/dao/leitura_dao.py b/dao/leitura_dao.py new file mode 100644 index 0000000..6692a8a --- /dev/null +++ b/dao/leitura_dao.py @@ -0,0 +1,27 @@ +from model.leitura import Leitura +from database import db + + +class LeituraDao: + _instancia = None + + @classmethod + def instancia(cls): + if cls._instancia is None: + cls._instancia = cls() + return cls._instancia + + def criar(self, leitura): + db.session.add(leitura) + db.session.commit() + return leitura + + def listar_por_dispositivo(self, dispositivo_id, desde=None, ate=None, limite=100): + query = Leitura.query.filter_by(dispositivo_id=dispositivo_id) + + if desde: + query = query.filter(Leitura.criado_em >= desde) + if ate: + query = query.filter(Leitura.criado_em <= ate) + + return query.order_by(Leitura.criado_em.desc()).limit(limite).all() diff --git a/service/leitura_service.py b/service/leitura_service.py new file mode 100644 index 0000000..67886c2 --- /dev/null +++ b/service/leitura_service.py @@ -0,0 +1,41 @@ +from model.leitura import Leitura, LeituraNaoEncontrada +from dao.leitura_dao import LeituraDao + + +class LeituraService: + _instancia = None + + @classmethod + def instancia(cls): + if cls._instancia is None: + cls._instancia = cls() + return cls._instancia + + def __init__(self): + self.dao = LeituraDao.instancia() + + def criar(self, dispositivo_id, payload): + leitura = Leitura(dispositivo_id=dispositivo_id, payload=payload) + return self.dao.criar(leitura) + + def listar(self, dispositivo_id, desde=None, ate=None, limite=100): + return self.dao.listar_por_dispositivo(dispositivo_id, desde, ate, limite) + + def estatisticas(self, dispositivo_id, campo): + leituras = self.dao.listar_por_dispositivo(dispositivo_id) + + valores = [ + l.payload[campo] for l in leituras + if campo in l.payload and isinstance(l.payload[campo], (int, float)) + ] + + if not valores: + raise LeituraNaoEncontrada() + + return { + "campo": campo, + "contagem": len(valores), + "minimo": min(valores), + "maximo": max(valores), + "media": round(sum(valores) / len(valores), 2) + }