Feedback Integracion de aplicaciones v007

Equipo 001

1. Diseño de Servicios Web

  • Acoplamiento fuerte. Integración directa con la base de datos dentro de las rutas.
  • Falta de separación de responsabilidades.main.py contiene lógica de negocio y presentación.

2. Buenas Prácticas de Código

  • Código repetido. Código duplicado para ciertas operaciones.
  • Antipatrón: Nombres de variables no descriptivos. Nombres de variables y funciones poco claros.

3. Patrones de Diseño

  • Singleton mal implementado. Implementación incorrecta del patrón Singleton.
  • Uso inapropiado de patrones. Aplicación de patrones sin entender su propósito.

4. Seguridad

  • Información sensible en el código. Credenciales codificadas directamente en el código.
  • Falta de validación y sanitización de datos. Ausencia de mecanismos claros para validar y sanitizar entradas.

5. Manejo de Errores

  • Manejo de errores genérico. Captura de excepciones generales sin diferenciación.
  • Falta de logs. Ausencia de registros detallados de errores.

6. Base de Datos

  • No Normalización

7. Alcance

  • Cantidad de servicios insuficiente. No se desarrollaron suficientes servicios para analizar el uso de patrones a nivel de base de datos.

8.Similud

  • Fork del equipo 2

Equipo 002

1. Diseño de Servicios Web

  • API sin Versionado
  • Paginacion, filtros

2. Buenas Prácticas de Código

  • Código Espagueti
  • Hardcoding de Valores

3. Patrones de Diseño

  • Singleton mal implementado
  • Uso incorrecto de DAO
  • God Object. Clase main tiene toda la responsabilidad

4. Seguridad

  • Exposición de Datos Sensibles
  • Falta de Validación de Entradas

5. Manejo de Errores

  • Captura de Excepciones Genéricas
  • No Loguear Errores
  • Ignorar Excepciones

6. Base de Datos

  • No Normalización

7. Alcance

  • Cantidad de servicios insuficiente: No se desarrollaron suficientes servicios para analizar el uso de patrones a nivel de base de datos.

8.Similud

  • Fork del equipo 1

Equipo 003

1. Diseño de Servicios Web

  • API sin versionado: No se observa una estructura de versionado en las rutas de la API, lo cual puede causar problemas de compatibilidad en futuras actualizaciones.
  • Endpoints monolíticos: Algunos endpoints manejan múltiples responsabilidades, dificultando el mantenimiento y la escalabilidad.

2. Buenas Prácticas de Código

  • Hardcoding de valores: Existen valores hardcodeados en lugar de utilizar variables de entorno, afectando la flexibilidad y seguridad del código.

3. Patrones de Diseño

  • Falta de separación de capas: La lógica de negocio y la lógica de acceso a datos no están claramente separadas, violando el principio de separación de responsabilidad.
  • No uso de interfaces: La falta de interfaces y abstracciones limita la flexibilidad y la capacidad de extender o modificar el sistema.
  • Acoplamiento fuerte: Existe un acoplamiento fuerte entre componentes, dificultando la reutilización de código y la realización de pruebas unitarias.

4. Seguridad

  • Manejo inadecuado de JWT: En user_jwt.py, el manejo de tokens JWT podría mejorarse implementando mejores prácticas de seguridad, como la rotación de claves y la verificación de expiración. Solo se valida que el token pueda ser decode, pero no si ya expiro.
  • Exposición de información sensible: No se observa un adecuado manejo de variables de entorno para proteger información sensible.
  • Falta de validación de entrada: Falta de validaciones robustas en las entradas del usuario, abriendo vulnerabilidades a ataques como SQL Injection o XSS.

5. Manejo de Errores

  • Falta de manejo centralizado de errores: No se implementa un middleware o mecanismo centralizado para el manejo de errores, llevando a respuestas inconsistentes y dificultando el mantenimiento.
  • Mensajes de error poco informativos: Los mensajes de error devueltos al cliente no son lo suficientemente descriptivos para permitir una rápida resolución de problemas.
  • No uso de logs estructurados: La falta de un sistema de logging estructurado dificulta la monitorización y el diagnóstico de problemas en producción.

6. Base de Datos

  • Consultas en el código: Las consultas SQL se encuentran embebidas directamente en el código en lugar de usar un ORM o abstracción de datos.
  • No uso de migraciones: No se observan scripts o herramientas para la gestión de migraciones de la base de datos, complicando el mantenimiento y la evolución del esquema.
  • Falta de índices: No hay indicios de que se utilicen índices en la base de datos, afectando el rendimiento de las consultas a gran escala.

Equipo 004

1. Diseño de Servicios Web

  • Endpoints no RESTful: Algunos endpoints no siguen las convenciones REST, dificultando la comprensión y mantenimiento.
  • Falta de versionado: No se implementa versionado en la API, lo que puede causar problemas de compatibilidad futura.

2. Buenas Prácticas de Código

  • Código duplicado: Existe duplicación de lógica en varias rutas, lo que dificulta el mantenimiento.
  • Nombres de variables poco claros: Uso de nombres de variables no descriptivos, dificultando la legibilidad.
  • Hardcoding de valores: Existen valores hardcodeados en lugar de utilizar variables de entorno, afectando la flexibilidad y seguridad del código.

3. Patrones de Diseño

  • Lógica de negocio en controladores: Se coloca demasiada lógica en los controladores en lugar de separarla en servicios.
  • Acoplamiento fuerte: Dependencias entre módulos sin interfaces claras, lo que aumenta el acoplamiento.
  • Implementacion de algun patron. Ej: MVC con responsabilidades claras

4. Seguridad

  • Validación insuficiente: Falta de validación adecuada en las entradas del usuario.
  • Gestión de sesiones: Uso de sesiones sin medidas adecuadas para evitar hijacking.
  • Sin ORM: Posibilidad de SQL injection

5. Manejo de Errores

  • Errores genéricos: Retorno de errores genéricos sin información adecuada para el cliente.
  • Falta de logging: Insuficiente registro de errores para diagnósticos.
  • Propagación de excepciones: Propagación de excepciones sin manejadores adecuados.

6. Base de Datos

  • Consultas no optimizadas: Consultas a la base de datos no optimizadas, lo que puede afectar el rendimiento.
  • Falta de índices: No se utilizan índices en tablas, lo que puede ralentizar las consultas.
  • Estructura de base de datos rígida: Diseño de base de datos que no permite cambios o expansiones fáciles.
  • Falta implementacion de un ORM

Equipo 005

1. Diseño de Servicios Web

  • Acoplamiento fuerte: Los servicios están altamente interdependientes.
  • Uso incorrecto de HTTP: No se siguen las convenciones RESTful. Ej. ordenes/index app get/productos no tiene codigo status.
  • Implementacion de algun patron. Ej: MVC con responsabilidades claras

2. Buenas Prácticas de Código

  • Código repetitivo: Existe código duplicado en varias partes.
  • Nombres de variables no descriptivos: Nombres de variables poco claros.

3. Patrones de Diseño

  • Singleton mal implementado: Problemas con el estado compartido.
  • God Object: Objetos que manejan demasiadas responsabilidades.
  • Implementacion de algun patron. Ej: MVC con responsabilidades claras

4. Seguridad

  • Falta de validación de entradas: Riesgo de inyecciones SQL o XSS.
  • Información sensible en el código: Inclusión de credenciales en el código fuente.
  • Uso de versiones desactualizadas de librerías: Librerías obsoletas con vulnerabilidades.

5. Manejo de Errores

  • Exceptions silenciosas: Capturar excepciones sin manejarlas adecuadamente.
  • Información de errores no específica: Mensajes de error poco útiles.
  • Dependencia de excepciones para el control de flujo: Uso excesivo de excepciones para el flujo normal.

6. Base de Datos

  • N+1 Queries: Múltiples consultas en lugar de una optimizada.
  • Falta de índices: Problemas de rendimiento por falta de índices adecuados.
  • Datos no normalizados: Estructuras de datos redundantes y no normalizadas.
  • ORM: SQL hardcodeado

Equipo 006

1. Diseño de Servicios Web

  • Falta de documentación en la API, lo que dificulta la comprensión y uso de los endpoints.
  • No utilizar métodos HTTP correctamente (por ejemplo, usar GET para operaciones que deberían ser POST).

2. Buenas Prácticas de Código

  • Nombres de variables y funciones no descriptivos, lo que reduce la legibilidad del código.
  • Hardcoding de valores: Existen valores hardcodeados en lugar de utilizar variables de entorno, afectando la flexibilidad y seguridad del código.

3. Patrones de Diseño

  • No utilizar patrones de diseño como Singleton o Factory, llevando a una pobre organización del código.
  • Dependencias directas entre clases sin utilizar inyección de dependencias, lo que dificulta las pruebas unitarias.

4. Seguridad

  • No validar adecuadamente los datos de entrada del usuario, lo que podría llevar a vulnerabilidades como inyecciones SQL.

5. Manejo de Errores

  • No capturar y manejar excepciones correctamente, lo que puede llevar a caídas inesperadas del sistema.
  • Mensajes de error poco informativos que no ayudan a identificar y solucionar problemas.

6. Base de Datos

  • No normalizar adecuadamente las tablas, lo que lleva a redundancia de datos y posibles inconsistencias.
  • Falta de índices en las tablas, lo que puede causar problemas de rendimiento en consultas frecuentes.

Equipo 007

1. Diseño de servicios web

  • Sin versionamiento de api (en codigo no aprecie algun /api/v1/endpoint)

2. Buenas prácticas de código

  • Manejar constantes en vez de valores en duro. Ej: HTTP status codes

3. Patrones de diseño

  • Como es un service bus de un privado, revisar documentacion. https://www.oracle.com/technical-resources/articles/middleware/soa-jellema-esb-pattern.html

4. Seguridad

  • Propenso a SQL Inyection
  • Hardcodign de valores. Ej: Tbk-Api-Key-Id

5. Manejo de errores

  • Manejo escaso de flujos de error

6. Base de datos

  • Dado que es un producto oracle, potencia la implementacion de procedimientos de Oracle. Todo esta con SQL plano. Esto seria el equivalente a tener un ORM en otros lenguajes de programacion.

Generales

  • Dado que utlizan un producto muy cerrado, es dificil tener una matriz de buenas practicas. Por ello, la documentacion oficial es la que deberia definir su estrategia de coding y pienso que cometen los mismos errores que el resto de los equipos, pero con otra tecnologia mas cerrada. Favor revisen el feedback de los otros equipos.

Equipo 008

1. Diseño de servicios web

  • Acoplamiento fuerte entre servicios
  • No utilizar contratos explícitos. No hay una gestion de interfaces que permitan la generalizacion de objetos de python.
  • Sobrecarga de un solo servicio

2. Buenas prácticas de código

  • Código duplicado
  • Nombres de variables no descriptivos

3. Patrones de diseño

  • Antipatrones Singleton abusivo sin utilizar inyeccion de dependencia
  • Abstract Factory para la craecion de objetos

4. Seguridad

  • Hardcoding de valores en codigo. Ej. Tbk-Api-Key-Id
  • Falta de validación de entrada: No validar adecuadamente la entrada de los usuarios, permitiendo ataques como XSS o inyección de código.

5. Manejo de errores

  • Captura general de excepciones: Usar bloques de captura que capturen excepciones genéricas, lo que dificulta la identificación y manejo adecuado de errores específicos.
  • Exceptions silenciosas: Capturar excepciones y no tomar ninguna acción, lo que puede ocultar errores y dificultar la detección de problemas.
  • Falta de logs detallados: No registrar suficiente información sobre los errores, dificultando la depuración y resolución de problemas.

6. Base de datos

  • Nombres de tablas y columnas no descriptivos
  • Falta de normalización
  • No uso de índices

7.Similud

  • Fork del equipo 9

Equipo 009

1. Diseño de servicios web

  • Acoplamiento fuerte entre servicios
  • No utilizar contratos explícitos. No hay una gestion de interfaces que permitan la generalizacion de objetos de python.
  • Sobrecarga de un solo servicio

2. Buenas prácticas de código

  • Código duplicado
  • Nombres de variables no descriptivos

3. Patrones de diseño

  • Antipatrones Singleton abusivo sin utilizar inyeccion de dependencia
  • Abstract Factory para la craecion de objetos

4. Seguridad

  • Hardcoding de valores en codigo. Ej. Tbk-Api-Key-Id
  • Falta de validación de entrada: No validar adecuadamente la entrada de los usuarios, permitiendo ataques como XSS o inyección de código.

5. Manejo de errores

  • Captura general de excepciones: Usar bloques de captura que capturen excepciones genéricas, lo que dificulta la identificación y manejo adecuado de errores específicos.
  • Exceptions silenciosas: Capturar excepciones y no tomar ninguna acción, lo que puede ocultar errores y dificultar la detección de problemas.
  • Falta de logs detallados: No registrar suficiente información sobre los errores, dificultando la depuración y resolución de problemas.

6. Base de datos

  • Nombres de tablas y columnas no descriptivos
  • Falta de normalización
  • No uso de índices

7.Similud

  • Fork del equipo 8

Recomendaciones Generales

  • Seguir principios SOLID en el diseño de software.
  • Realizar revisiones de seguridad y utilizar herramientas de análisis estático.
  • Optimizar las consultas a la base de datos y asegurar la normalización adecuada de los datos.

Ejemplos FLASK

Como se deberia ver SQLAclvhemy como ORM

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Usuario(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

# Suponiendo que ya tienes una instancia de Flask y SQLAlchemy configurada
from your_application import db, Usuario

# Realizando una consulta para obtener todos los usuarios
usuarios = Usuario.query.all()

# Imprimiendo los usuarios obtenidos
for usuario in usuarios:
    print(f"ID: {usuario.id}, Nombre: {usuario.nombre}, Email: {usuario.email}")

Ejemplos Buenas practicas de codigo

Antipatrón: Credenciales en el Código

  • Descripción: Las credenciales de base de datos o API keys están hardcodeadas en el código fuente.
  • Ejemplo: Variables en duro en codigo *.py.
  • Solución: Utilizar variables de entorno para manejar credenciales sensibles.
# Inseguro
DB_USER = "user"
DB_PASSWORD = "password"

# Seguro
import os
DB_USER = os.getenv("DB_USER")
DB_PASSWORD = os.getenv("DB_PASSWORD")

Antipatrón: Errores Silenciosos

  • Descripción: Errores son capturados y suprimidos sin informar al usuario o registrar los detalles para análisis futuro.
  • Ejemplo: Uso de try/except sin un manejo adecuado del error.
  • Solución: Implementar un sistema de logging y manejo de excepciones informativo.
# Manejo de errores incorrecto
try:
    # código
except Exception:
    pass

# Correcto
import logging

try:
    # código
except Exception as e:
    logging.error(f"Error occurred: {e}")
    raise

Antipatrón: DB multi-instanciacion

  • Descripción: Uso incorrecto de la instancia de conexion
  • Ejemplo: Instanciacion en cada metodo que requiere conexion a la db
  • Solución: Implementar un patron singleton para la conexion. Este debe ir acompañado de un patron de diseño: Inyeccion de dependencia.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os

DATABASE_URL = os.getenv('DATABASE_URL')

engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

# Uso de la sesión en una función
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Link de interes