SmartPot-API es una API RESTful desarrollada en Java 17 con Spring Boot 3.5.7, diseñada para gestionar el sistema de cultivos inteligentes SmartPot. La aplicación utiliza MongoDB como base de datos principal, Redis para almacenamiento en caché, y cuenta con autenticación mediante JWT (JSON Web Tokens). La API está completamente documentada con Swagger/OpenAPI y ofrece múltiples interfaces de documentación (Swagger UI, ReDoc, Scalar).
- Java 17 - Lenguaje de programación
- Spring Boot 3.5.7 - Framework principal
- Spring Data MongoDB - Persistencia de datos
- Spring Data Redis - Sistema de caché
- Spring Security - Autenticación y autorización
- JWT (jjwt 0.13.0) - Tokens de autenticación
- Lombok - Reducción de código boilerplate
- MapStruct 1.6.3 - Mapeo de objetos DTO/Entity
- SpringDoc OpenAPI 2.8.14 - Documentación automática de API
- Spring Mail - Envío de correos electrónicos
- Maven - Gestión de dependencias
SmartPot-API/
├── .github/ # Configuración de GitHub
│ ├── ISSUE_TEMPLATE/ # Templates para issues
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ └── workflows/ # GitHub Actions CI/CD
│ ├── codeql.yml # Análisis de seguridad CodeQL
│ ├── defender-for-devops.yml # Microsoft Defender
│ ├── deployment.yml # Pipeline de despliegue
│ ├── noir-security.yml # OWASP Noir Security
│ └── packaging.yml # Publicación de packages
│
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── app.smartpot.api/
│ │ │ ├── cache/ # Configuración de caché (Redis)
│ │ │ │ └── RedisConfig.java
│ │ │ │
│ │ │ ├── commands/ # Gestión de comandos IoT
│ │ │ │ ├── controller/ # CommandController
│ │ │ │ ├── mapper/ # CommandMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # CommandDTO
│ │ │ │ │ └── entity/ # Command
│ │ │ │ ├── repository/ # CommandRepository
│ │ │ │ └── service/ # CommandService, CommandServiceImpl
│ │ │ │
│ │ │ ├── crops/ # Gestión de cultivos
│ │ │ │ ├── controller/ # CropController
│ │ │ │ ├── mapper/ # CropMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # CropDTO
│ │ │ │ │ └── entity/ # Crop, CropStatus, CropType
│ │ │ │ ├── repository/ # CropRepository
│ │ │ │ ├── service/ # CropService, CropServiceImpl
│ │ │ │ └── validator/ # CropValidator, CropValidatorImpl
│ │ │ │
│ │ │ ├── documentation/ # Configuración de documentación API
│ │ │ │ ├── DocumentController.java
│ │ │ │ └── SwaggerConfig.java
│ │ │ │
│ │ │ ├── exception/ # Manejo global de excepciones
│ │ │ │ ├── ApiException.java
│ │ │ │ ├── ApiHandler.java
│ │ │ │ ├── ApiResponse.java
│ │ │ │ ├── EncryptionException.java
│ │ │ │ └── InvalidTokenException.java
│ │ │ │
│ │ │ ├── mail/ # Sistema de correo electrónico
│ │ │ │ ├── config/ # AsyncConfig
│ │ │ │ ├── controller/ # EmailController
│ │ │ │ ├── mapper/ # EmailMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # EmailDTO
│ │ │ │ │ └── entity/ # EmailDetails
│ │ │ │ ├── repository/ # EmailRepository
│ │ │ │ ├── service/ # EmailService, EmailServiceImpl
│ │ │ │ └── validator/ # EmailValidator, EmailValidatorImpl
│ │ │ │
│ │ │ ├── notifications/ # Sistema de notificaciones
│ │ │ │ ├── controller/ # NotificationController
│ │ │ │ ├── mapper/ # NotificationMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # NotificationDTO
│ │ │ │ │ └── entity/ # Notification
│ │ │ │ ├── repository/ # NotificationRepository
│ │ │ │ └── service/ # NotificationService, NotificationServiceImpl
│ │ │ │
│ │ │ ├── records/ # Historial y registros de mediciones
│ │ │ │ ├── controller/ # RecordController
│ │ │ │ ├── mapper/ # RecordMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # CropRecordDTO, MeasuresDTO, RecordDTO
│ │ │ │ │ └── entity/ # DateRange, History, Measures
│ │ │ │ ├── repository/ # RecordRepository
│ │ │ │ └── service/ # RecordService, RecordServiceImpl
│ │ │ │
│ │ │ ├── responses/ # DTOs de respuestas comunes
│ │ │ │ ├── DeleteResponse.java
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ └── TokenResponse.java
│ │ │ │
│ │ │ ├── security/ # Seguridad y autenticación
│ │ │ │ ├── config/
│ │ │ │ │ ├── filters/ # JwtAuthFilter, RateLimitingFilter
│ │ │ │ │ ├── headers/ # CorsConfig
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/ # AuthController
│ │ │ │ ├── model/dto/ # ResetTokenDTO
│ │ │ │ └── service/ # JwtService, JwtServiceImpl
│ │ │ │ # EncryptionService, EncryptionServiceImpl
│ │ │ │
│ │ │ ├── sessions/ # Gestión de sesiones de usuario
│ │ │ │ ├── Service/ # SessionService, SessionServiceImpl
│ │ │ │ ├── controller/ # SessionController
│ │ │ │ ├── mapper/ # SessionMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # SessionDTO
│ │ │ │ │ └── entity/ # Session
│ │ │ │ └── repository/ # SessionRepository
│ │ │ │
│ │ │ ├── users/ # Gestión de usuarios
│ │ │ │ ├── controller/ # UserController
│ │ │ │ ├── mapper/ # UserMapper
│ │ │ │ ├── model/
│ │ │ │ │ ├── dto/ # UserDTO
│ │ │ │ │ └── entity/ # User, UserRole
│ │ │ │ ├── repository/ # UserRepository
│ │ │ │ ├── service/ # UserService, UserServiceImpl
│ │ │ │ └── validator/ # UserRegex, UserValidator, UserValidatorImpl
│ │ │ │
│ │ │ └── SmartPotApiApplication.java # Clase principal de la aplicación
│ │ │
│ │ └── resources/
│ │ ├── templates/ # Templates HTML para documentación
│ │ │ ├── redoc.html # ReDoc UI
│ │ │ └── scalar.html # Scalar UI
│ │ ├── application.yml # Configuración de Spring Boot
│ │ └── banner.txt # Banner personalizado
│ │
│ └── test/
│ └── java/
│ └── app.smartpot.api/
│ ├── users/controller/ # UserControllerTest
│ └── SmartPotApiApplicationTest.java
│
├── .dockerignore # Archivos excluidos de Docker
├── .env.example # Ejemplo de variables de entorno
├── .gitignore # Archivos excluidos de Git
├── .gitattributes # Configuración de Git
├── CONTRIBUTING.md # Guía de contribución
├── Dockerfile # Configuración de contenedor Docker
├── LICENSE # Licencia MIT
├── README.md # Este archivo
├── SECURITY.md # Política de seguridad
├── mvnw / mvnw.cmd # Maven Wrapper
└── pom.xml # Configuración de Maven
Propósito: Configuración de Redis para almacenamiento en caché.
RedisConfig.java: Configuración de conexión y serialización de Redis.
Propósito: Gestión de comandos enviados a dispositivos IoT SmartPot.
- Controlador: Endpoints REST para crear, leer, actualizar y eliminar comandos.
- Servicio: Lógica de negocio para procesamiento de comandos.
- Repositorio: Persistencia de comandos en MongoDB.
Propósito: Administración completa del ciclo de vida de cultivos.
- Entidades:
Crop,CropStatus,CropType. - Validación: Validadores personalizados para integridad de datos de cultivos.
- Mapper: Conversión entre DTOs y entidades usando MapStruct.
Propósito: Configuración de documentación automática de la API.
SwaggerConfig.java: Configuración de OpenAPI/Swagger.DocumentController.java: Endpoints para servir múltiples UIs de documentación.- Interfaces disponibles:
- Swagger UI
- ReDoc
- Scalar
Propósito: Manejo centralizado de errores y excepciones.
ApiHandler.java: Manejador global de excepciones con@ControllerAdvice.ApiException.java: Excepción personalizada base.InvalidTokenException.java: Excepción específica para tokens JWT inválidos.EncryptionException.java: Excepción para errores de cifrado.
Propósito: Sistema de envío de correos electrónicos.
- Configuración asíncrona:
AsyncConfig.javapara envío no bloqueante. - Validación: Validadores para verificar formato de correos.
- Repositorio: Historial de correos enviados.
Propósito: Sistema de notificaciones a usuarios.
- Gestión de notificaciones push y en tiempo real.
- Registro de historial de notificaciones.
Propósito: Gestión de historial de mediciones de sensores.
- Entidades:
History,Measures,DateRange. - DTOs:
RecordDTO,MeasuresDTO,CropRecordDTO. - Almacena datos de temperatura, humedad, pH, etc.
Propósito: Autenticación, autorización y seguridad.
- JWT: Generación y validación de tokens.
- Filtros:
JwtAuthFilter: Validación de tokens en cada request.RateLimitingFilter: Limitación de tasa de peticiones.
- CORS: Configuración de orígenes permitidos.
- Encriptación: Servicios de cifrado AES para datos sensibles.
Propósito: Gestión completa de usuarios del sistema.
- Entidades:
User,UserRole. - Validación: Expresiones regulares personalizadas (
UserRegex). - Autenticación y gestión de perfiles.
Propósito: Gestión de sesiones activas de usuarios.
- Registro de dispositivos y tokens activos.
- Control de sesiones concurrentes.
- Java 17 o superior
- Maven 3.9+
- Docker (opcional, para contenedorización)
- MongoDB 4.4+
- Redis 6.0+
bash
# Compilar sin ejecutar tests
mvn clean package -DskipTests -P docker -f pom.xml
Explicación:
clean: Limpia compilaciones previas.package: Empaqueta la aplicación en un JAR.-DskipTests: Omite la ejecución de tests.-P docker: Activa el perfil de compilación para Docker.
bash
# Construir imagen para arquitectura AMD64
docker build --platform linux/amd64 -t sebastian190030/api-smartpot:latest .
bash
# Login en Docker Hub
docker login
# Subir imagen
docker push sebastian190030/api-smartpot:latest
- Crear cuenta en Render.com
- Crear nuevo Web Service
- Seleccionar Docker como tipo de despliegue
- Configurar repositorio:
sebastian190030/api-smartpot - Configurar variables de entorno (ver sección Variables de Entorno)
bash
# Usando deploy hook (Windows)
cmd /c deploy.render.cmd
# Usando curl directamente
curl -X POST https://api.render.com/deploy/srv-YOUR_SERVICE_ID?key=YOUR_DEPLOY_KEY
Copia el archivo .env.example a .env y configura las siguientes variables:
bash
APP_NAME=SmartPot-API
PORT=8091
TITLE=SmartPot API
DESCRIPTION=Documentación de la API REST de SmartPot
VERSION=1.0.0
AUTHOR=SmartPot Developers
bash
DATA_CONNECTION_METHOD=mongodb
DATA_SOURCE_USERNAME=admin
DATA_SOURCE_PASSWORD=admin
DATA_SOURCE_DOMAIN=db-smartpot:27017
DATA_SOURCE_DB=smartpot
DATA_PARAMS=authSource=admin&directConnection=true&serverSelectionTimeoutMS=100000&socketTimeoutMS=10000&appName=mongo
bash
CACHE_TYPE=redis
CACHE_HOST=cache-smartpot
CACHE_PORT=6379
CACHE_DB=0
CACHE_USERNAME=default
CACHE_PASSWORD=root
CACHE_TIMEOUT=2000
CACHE_LETTUCE_POOL_MAX_ACTIVE=8
CACHE_LETTUCE_POOL_MAX_WAIT=-1
CACHE_LETTUCE_POOL_MAX_IDLE=8
CACHE_LETTUCE_POOL_MIN_IDLE=8
# Configuración de caché
CACHE_TIME_TO_LIVE=300000
CACHE_NULL_VALUES=false
bash
MAIL_HOST=mail-smartpot
MAIL_PORT=1025
MAIL_USERNAME=smartpotadmin@example.com
MAIL_PASSWORD=password123
MAIL_PROPERTIES_SMTP_AUTH=true
MAIL_PROPERTIES_SMTP_STARTTLS_ENABLE=false
bash
SECURITY_JWT_SECRET_KEY=your-secret-key-here
SECURITY_JWT_EXPIRATION=86400000
SECURITY_PUBLIC_ROUTES=/auth/login,/auth/verify
SECURITY_AES_KEY=your-aes-key-here
SECURITY_SCHEME_NAME=bearerAuth
bash
RATE_LIMITING_MAX_REQUESTS=5
RATE_LIMITING_TIME_WINDOW=60000
RATE_LIMITING_PUBLIC_ROUTES=/swagger-ui/,/v3/api-docs,/swagger-resources/,/webjars/
bash
HEADER_CORS_ALLOWED_ORIGINS=http://localhost:5173
bash
SERVER_TOMCAT_TIMEOUT=600000
SERVER_FORWARD_HEADERS_STRATEGY=framework
bash
SWAGGER_API_DOCS_ENABLED=true
SWAGGER_API_DOCS_PATH=/v3/api-docs
SWAGGER_REDOC_ENABLED=true
SWAGGER_REDOC_PATH=/redoc
SCALAR_ENABLED=true
SCALAR_PATH=/scalar
SWAGGER_UI_ENABLED=true
SWAGGER_UI_PATH=/
SWAGGER_UI_URL=/v3/api-docs
SWAGGER_UI_DEFAULT_MODEL_EXPAND_DEPTH=1
SWAGGER_UI_DEFAULT_MODEL_RENDERING=example
SWAGGER_UI_DISPLAY_OPERATION_ID=true
SWAGGER_UI_DISPLAY_REQUEST_DURATION=true
SWAGGER_UI_DOC_EXPANSION=list
OPENAPI_SERVER_URL=http://localhost:8091
bash
DEBUGGER_MODE=INFO
bash
docker run -d --name smartpot-api-dev -p 8091:8091 \
-e APP_NAME=SmartPot-API \
-e PORT=8091 \
-e TITLE="SmartPot API" \
-e DESCRIPTION="Documentación de la API REST de SmartPot" \
-e VERSION=1.0.0 \
-e AUTHOR="SmartPot Developers" \
\
-e DATA_CONNECTION_METHOD=mongodb \
-e DATA_SOURCE_USERNAME=admin \
-e DATA_SOURCE_PASSWORD=admin \
-e DATA_SOURCE_DOMAIN=db-smartpot:27017 \
-e DATA_SOURCE_DB=smartpot \
-e DATA_PARAMS="authSource=admin&directConnection=true&serverSelectionTimeoutMS=100000&socketTimeoutMS=10000&appName=mongo" \
\
-e CACHE_TYPE=redis \
-e CACHE_HOST=cache-smartpot \
-e CACHE_PORT=6379 \
-e CACHE_DB=0 \
-e CACHE_USERNAME=default \
-e CACHE_PASSWORD=root \
-e CACHE_TIMEOUT=2000 \
-e CACHE_LETTUCE_POOL_MAX_ACTIVE=8 \
-e CACHE_LETTUCE_POOL_MAX_WAIT=-1 \
-e CACHE_LETTUCE_POOL_MAX_IDLE=8 \
-e CACHE_LETTUCE_POOL_MIN_IDLE=8 \
\
-e CACHE_TIME_TO_LIVE=300000 \
-e CACHE_NULL_VALUES=false \
\
-e MAIL_HOST=mail-smartpot \
-e MAIL_PORT=1025 \
-e MAIL_USERNAME=smartpotadmin@example.com \
-e MAIL_PASSWORD=password123 \
-e MAIL_PROPERTIES_SMTP_AUTH=true \
-e MAIL_PROPERTIES_SMTP_STARTTLS_ENABLE=false \
\
-e SECURITY_JWT_SECRET_KEY=c8e9b6803afbcfa6edd9569c94c75ff4b144622b0a0570a636dffd62c24a3476 \
-e SECURITY_JWT_EXPIRATION=86400000 \
-e SECURITY_PUBLIC_ROUTES="/auth/login,/auth/verify" \
\
-e RATE_LIMITING_MAX_REQUESTS=5 \
-e RATE_LIMITING_TIME_WINDOW=60000 \
-e RATE_LIMITING_PUBLIC_ROUTES="/swagger-ui/,/v3/api-docs,/swagger-resources/,/webjars/" \
\
-e HEADER_CORS_ALLOWED_ORIGINS=http://localhost:5173 \
\
-e SERVER_TOMCAT_TIMEOUT=600000 \
\
-e DEBUGGER_MODE=INFO \
sebastian190030/api-smartpot:latest
bash
# Ejecutar todos los tests
mvn test
# Ejecutar tests específicos
mvn test -Dtest=UserControllerTest
Una vez que la aplicación esté en ejecución, accede a las interfaces de documentación:
- Swagger UI:
http://localhost:8091/(o tu URL configurada) - ReDoc:
http://localhost:8091/redoc - Scalar:
http://localhost:8091/scalar - OpenAPI JSON:
http://localhost:8091/v3/api-docs
- Autenticación JWT: Todas las rutas (excepto las públicas) requieren un token JWT válido.
- Rate Limiting: Límite de 5 peticiones por minuto por IP en endpoints protegidos.
- CORS: Configurado para aceptar peticiones desde orígenes específicos.
- Encriptación AES: Datos sensibles cifrados antes de almacenarse.
El proyecto utiliza GitHub Actions para automatización:
- CodeQL: Análisis de seguridad de código.
- Deployment: Compilación, construcción de imagen Docker y despliegue automático.
- Microsoft Defender: Escaneo de vulnerabilidades.
- OWASP Noir: Análisis de seguridad adicional.
- Packaging: Publicación automática en GitHub Container Registry.
Lee CONTRIBUTING.md para más detalles sobre cómo contribuir al proyecto.
Este proyecto está bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.
Consulta SECURITY.md para información sobre la política de seguridad y cómo reportar vulnerabilidades.
SmartPot Tech Team