{"id":23231150,"url":"https://github.com/smartpottech/smartpot-api","last_synced_at":"2026-05-10T06:47:28.556Z","repository":{"id":258914729,"uuid":"875870441","full_name":"SmartPotTech/SmartPot-API","owner":"SmartPotTech","description":"SmartPot API acts as the bridge between the IoT ecosystem and the management portal, facilitating efficient communication between devices, the database and the user. Provides real-time access to data on hydroponic garden environmental conditions, such as temperature, humidity, and pH.","archived":false,"fork":false,"pushed_at":"2025-02-03T14:33:59.000Z","size":573,"stargazers_count":1,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-02-11T17:16:28.692Z","etag":null,"topics":["api-rest","java","mongodb","mongodb-atlas","render","spring-boot"],"latest_commit_sha":null,"homepage":"https://api-smartpot.onrender.com/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SmartPotTech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-21T02:22:50.000Z","updated_at":"2025-01-20T03:50:14.000Z","dependencies_parsed_at":"2024-11-03T21:22:13.378Z","dependency_job_id":"b29d55a9-e722-4079-8995-9dfdb40440b6","html_url":"https://github.com/SmartPotTech/SmartPot-API","commit_stats":null,"previous_names":["smarpot/smartpot-api","smartpottech/smartpot-api"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmartPotTech%2FSmartPot-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmartPotTech%2FSmartPot-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmartPotTech%2FSmartPot-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmartPotTech%2FSmartPot-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SmartPotTech","download_url":"https://codeload.github.com/SmartPotTech/SmartPot-API/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247387990,"owners_count":20930933,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","java","mongodb","mongodb-atlas","render","spring-boot"],"created_at":"2024-12-19T02:13:21.887Z","updated_at":"2026-05-10T06:47:28.549Z","avatar_url":"https://github.com/SmartPotTech.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SmartPot-API\n\n[![wakatime](https://wakatime.com/badge/user/45f93d1b-ca86-4c83-a72b-206ab33d0abb/project/950184a8-5fa5-45eb-bbfe-126402c81529.svg)](https://wakatime.com/badge/user/45f93d1b-ca86-4c83-a72b-206ab33d0abb/project/950184a8-5fa5-45eb-bbfe-126402c81529)\n\n## Estado del Proyecto\n\n[![CI/CD Pipeline for Deployment](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/deployment.yml/badge.svg)](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/deployment.yml)\n[![CodeQL Advanced](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/codeql.yml/badge.svg)](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/codeql.yml)\n[![Dependabot Updates](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/dependabot/dependabot-updates)\n[![Microsoft Defender For Devops](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/defender-for-devops.yml/badge.svg)](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/defender-for-devops.yml)\n[![Publish Package](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/packaging.yml/badge.svg)](https://github.com/SmartPotTech/SmartPot-API/actions/workflows/packaging.yml)\n\n## Descripción\n\nSmartPot-API es una API RESTful desarrollada en **Java 17** con **Spring Boot 3.5.7**, diseñada para gestionar el\nsistema de cultivos inteligentes SmartPot. La aplicación utiliza **MongoDB** como base de datos principal, **Redis**\npara almacenamiento en caché, y cuenta con autenticación mediante **JWT** (JSON Web Tokens). La API está completamente\ndocumentada con **Swagger/OpenAPI** y ofrece múltiples interfaces de documentación (Swagger UI, ReDoc, Scalar).\n\n## Tecnologías Principales\n\n- **Java 17** - Lenguaje de programación\n- **Spring Boot 3.5.7** - Framework principal\n- **Spring Data MongoDB** - Persistencia de datos\n- **Spring Data Redis** - Sistema de caché\n- **Spring Security** - Autenticación y autorización\n- **JWT (jjwt 0.13.0)** - Tokens de autenticación\n- **Lombok** - Reducción de código boilerplate\n- **MapStruct 1.6.3** - Mapeo de objetos DTO/Entity\n- **SpringDoc OpenAPI 2.8.14** - Documentación automática de API\n- **Spring Mail** - Envío de correos electrónicos\n- **Maven** - Gestión de dependencias\n\n## Estructura del Proyecto\n\n```\n\nSmartPot-API/\n├── .github/                          # Configuración de GitHub\n│   ├── ISSUE_TEMPLATE/               # Templates para issues\n│   │   ├── bug_report.md\n│   │   └── feature_request.md\n│   └── workflows/                    # GitHub Actions CI/CD\n│       ├── codeql.yml                # Análisis de seguridad CodeQL\n│       ├── defender-for-devops.yml   # Microsoft Defender\n│       ├── deployment.yml            # Pipeline de despliegue\n│       ├── noir-security.yml         # OWASP Noir Security\n│       └── packaging.yml             # Publicación de packages\n│\n├── src/\n│   ├── main/\n│   │   ├── java/\n│   │   │   └── app.smartpot.api/\n│   │   │       ├── cache/                    # Configuración de caché (Redis)\n│   │   │       │   └── RedisConfig.java\n│   │   │       │\n│   │   │       ├── commands/                 # Gestión de comandos IoT\n│   │   │       │   ├── controller/           # CommandController\n│   │   │       │   ├── mapper/               # CommandMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # CommandDTO\n│   │   │       │   │   └── entity/           # Command\n│   │   │       │   ├── repository/           # CommandRepository\n│   │   │       │   └── service/              # CommandService, CommandServiceImpl\n│   │   │       │\n│   │   │       ├── crops/                    # Gestión de cultivos\n│   │   │       │   ├── controller/           # CropController\n│   │   │       │   ├── mapper/               # CropMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # CropDTO\n│   │   │       │   │   └── entity/           # Crop, CropStatus, CropType\n│   │   │       │   ├── repository/           # CropRepository\n│   │   │       │   ├── service/              # CropService, CropServiceImpl\n│   │   │       │   └── validator/            # CropValidator, CropValidatorImpl\n│   │   │       │\n│   │   │       ├── documentation/            # Configuración de documentación API\n│   │   │       │   ├── DocumentController.java\n│   │   │       │   └── SwaggerConfig.java\n│   │   │       │\n│   │   │       ├── exception/                # Manejo global de excepciones\n│   │   │       │   ├── ApiException.java\n│   │   │       │   ├── ApiHandler.java\n│   │   │       │   ├── ApiResponse.java\n│   │   │       │   ├── EncryptionException.java\n│   │   │       │   └── InvalidTokenException.java\n│   │   │       │\n│   │   │       ├── mail/                     # Sistema de correo electrónico\n│   │   │       │   ├── config/               # AsyncConfig\n│   │   │       │   ├── controller/           # EmailController\n│   │   │       │   ├── mapper/               # EmailMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # EmailDTO\n│   │   │       │   │   └── entity/           # EmailDetails\n│   │   │       │   ├── repository/           # EmailRepository\n│   │   │       │   ├── service/              # EmailService, EmailServiceImpl\n│   │   │       │   └── validator/            # EmailValidator, EmailValidatorImpl\n│   │   │       │\n│   │   │       ├── notifications/            # Sistema de notificaciones\n│   │   │       │   ├── controller/           # NotificationController\n│   │   │       │   ├── mapper/               # NotificationMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # NotificationDTO\n│   │   │       │   │   └── entity/           # Notification\n│   │   │       │   ├── repository/           # NotificationRepository\n│   │   │       │   └── service/              # NotificationService, NotificationServiceImpl\n│   │   │       │\n│   │   │       ├── records/                  # Historial y registros de mediciones\n│   │   │       │   ├── controller/           # RecordController\n│   │   │       │   ├── mapper/               # RecordMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # CropRecordDTO, MeasuresDTO, RecordDTO\n│   │   │       │   │   └── entity/           # DateRange, History, Measures\n│   │   │       │   ├── repository/           # RecordRepository\n│   │   │       │   └── service/              # RecordService, RecordServiceImpl\n│   │   │       │\n│   │   │       ├── responses/                # DTOs de respuestas comunes\n│   │   │       │   ├── DeleteResponse.java\n│   │   │       │   ├── ErrorResponse.java\n│   │   │       │   └── TokenResponse.java\n│   │   │       │\n│   │   │       ├── security/                 # Seguridad y autenticación\n│   │   │       │   ├── config/\n│   │   │       │   │   ├── filters/          # JwtAuthFilter, RateLimitingFilter\n│   │   │       │   │   ├── headers/          # CorsConfig\n│   │   │       │   │   └── SecurityConfiguration.java\n│   │   │       │   ├── controller/           # AuthController\n│   │   │       │   ├── model/dto/            # ResetTokenDTO\n│   │   │       │   └── service/              # JwtService, JwtServiceImpl\n│   │   │       │                             # EncryptionService, EncryptionServiceImpl\n│   │   │       │\n│   │   │       ├── sessions/                 # Gestión de sesiones de usuario\n│   │   │       │   ├── Service/              # SessionService, SessionServiceImpl\n│   │   │       │   ├── controller/           # SessionController\n│   │   │       │   ├── mapper/               # SessionMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # SessionDTO\n│   │   │       │   │   └── entity/           # Session\n│   │   │       │   └── repository/           # SessionRepository\n│   │   │       │\n│   │   │       ├── users/                    # Gestión de usuarios\n│   │   │       │   ├── controller/           # UserController\n│   │   │       │   ├── mapper/               # UserMapper\n│   │   │       │   ├── model/\n│   │   │       │   │   ├── dto/              # UserDTO\n│   │   │       │   │   └── entity/           # User, UserRole\n│   │   │       │   ├── repository/           # UserRepository\n│   │   │       │   ├── service/              # UserService, UserServiceImpl\n│   │   │       │   └── validator/            # UserRegex, UserValidator, UserValidatorImpl\n│   │   │       │\n│   │   │       └── SmartPotApiApplication.java   # Clase principal de la aplicación\n│   │   │\n│   │   └── resources/\n│   │       ├── templates/                    # Templates HTML para documentación\n│   │       │   ├── redoc.html                # ReDoc UI\n│   │       │   └── scalar.html               # Scalar UI\n│   │       ├── application.yml               # Configuración de Spring Boot\n│   │       └── banner.txt                    # Banner personalizado\n│   │\n│   └── test/\n│       └── java/\n│           └── app.smartpot.api/\n│               ├── users/controller/         # UserControllerTest\n│               └── SmartPotApiApplicationTest.java\n│\n├── .dockerignore                     # Archivos excluidos de Docker\n├── .env.example                      # Ejemplo de variables de entorno\n├── .gitignore                        # Archivos excluidos de Git\n├── .gitattributes                    # Configuración de Git\n├── CONTRIBUTING.md                   # Guía de contribución\n├── Dockerfile                        # Configuración de contenedor Docker\n├── LICENSE                           # Licencia MIT\n├── README.md                         # Este archivo\n├── SECURITY.md                       # Política de seguridad\n├── mvnw / mvnw.cmd                   # Maven Wrapper\n└── pom.xml                           # Configuración de Maven\n```\n\n## Descripción de Módulos\n\n### Cache\n\n**Propósito**: Configuración de Redis para almacenamiento en caché.\n\n- `RedisConfig.java`: Configuración de conexión y serialización de Redis.\n\n### Commands\n\n**Propósito**: Gestión de comandos enviados a dispositivos IoT SmartPot.\n\n- **Controlador**: Endpoints REST para crear, leer, actualizar y eliminar comandos.\n- **Servicio**: Lógica de negocio para procesamiento de comandos.\n- **Repositorio**: Persistencia de comandos en MongoDB.\n\n### Crops\n\n**Propósito**: Administración completa del ciclo de vida de cultivos.\n\n- **Entidades**: `Crop`, `CropStatus`, `CropType`.\n- **Validación**: Validadores personalizados para integridad de datos de cultivos.\n- **Mapper**: Conversión entre DTOs y entidades usando MapStruct.\n\n### Documentation\n\n**Propósito**: Configuración de documentación automática de la API.\n\n- `SwaggerConfig.java`: Configuración de OpenAPI/Swagger.\n- `DocumentController.java`: Endpoints para servir múltiples UIs de documentación.\n- **Interfaces disponibles**:\n    - Swagger UI\n    - ReDoc\n    - Scalar\n\n### Exception\n\n**Propósito**: Manejo centralizado de errores y excepciones.\n\n- `ApiHandler.java`: Manejador global de excepciones con `@ControllerAdvice`.\n- `ApiException.java`: Excepción personalizada base.\n- `InvalidTokenException.java`: Excepción específica para tokens JWT inválidos.\n- `EncryptionException.java`: Excepción para errores de cifrado.\n\n### Mail\n\n**Propósito**: Sistema de envío de correos electrónicos.\n\n- **Configuración asíncrona**: `AsyncConfig.java` para envío no bloqueante.\n- **Validación**: Validadores para verificar formato de correos.\n- **Repositorio**: Historial de correos enviados.\n\n### Notifications\n\n**Propósito**: Sistema de notificaciones a usuarios.\n\n- Gestión de notificaciones push y en tiempo real.\n- Registro de historial de notificaciones.\n\n### Records\n\n**Propósito**: Gestión de historial de mediciones de sensores.\n\n- **Entidades**: `History`, `Measures`, `DateRange`.\n- **DTOs**: `RecordDTO`, `MeasuresDTO`, `CropRecordDTO`.\n- Almacena datos de temperatura, humedad, pH, etc.\n\n### Security\n\n**Propósito**: Autenticación, autorización y seguridad.\n\n- **JWT**: Generación y validación de tokens.\n- **Filtros**:\n    - `JwtAuthFilter`: Validación de tokens en cada request.\n    - `RateLimitingFilter`: Limitación de tasa de peticiones.\n- **CORS**: Configuración de orígenes permitidos.\n- **Encriptación**: Servicios de cifrado AES para datos sensibles.\n\n### Users\n\n**Propósito**: Gestión completa de usuarios del sistema.\n\n- **Entidades**: `User`, `UserRole`.\n- **Validación**: Expresiones regulares personalizadas (`UserRegex`).\n- Autenticación y gestión de perfiles.\n\n### Sessions\n\n**Propósito**: Gestión de sesiones activas de usuarios.\n\n- Registro de dispositivos y tokens activos.\n- Control de sesiones concurrentes.\n\n## Guía de Despliegue\n\n### Requisitos Previos\n\n- Java 17 o superior\n- Maven 3.9+\n- Docker (opcional, para contenedorización)\n- MongoDB 4.4+\n- Redis 6.0+\n\n### 1. Compilación de la Aplicación\n\n```\nbash\n# Compilar sin ejecutar tests\nmvn clean package -DskipTests -P docker -f pom.xml\n```\n\n**Explicación**:\n\n- `clean`: Limpia compilaciones previas.\n- `package`: Empaqueta la aplicación en un JAR.\n- `-DskipTests`: Omite la ejecución de tests.\n- `-P docker`: Activa el perfil de compilación para Docker.\n\n### 2. Construcción de Imagen Docker\n\n```\nbash\n# Construir imagen para arquitectura AMD64\ndocker build --platform linux/amd64 -t sebastian190030/api-smartpot:latest .\n```\n\n### 3. Publicación en Docker Hub\n\n```\nbash\n# Login en Docker Hub\ndocker login\n\n# Subir imagen\ndocker push sebastian190030/api-smartpot:latest\n```\n\n### 4. Despliegue en Render.com\n\n#### 4.1 Configuración Inicial\n\n1. Crear cuenta en [Render.com](https://render.com)\n2. Crear nuevo **Web Service**\n3. Seleccionar **Docker** como tipo de despliegue\n4. Configurar repositorio: `sebastian190030/api-smartpot`\n5. Configurar variables de entorno (ver sección Variables de Entorno)\n\n#### 4.2 Despliegue Automático\n\n```\nbash\n# Usando deploy hook (Windows)\ncmd /c deploy.render.cmd\n\n# Usando curl directamente\ncurl -X POST https://api.render.com/deploy/srv-YOUR_SERVICE_ID?key=YOUR_DEPLOY_KEY\n```\n\n## 🔧 Configuración\n\n### Variables de Entorno\n\nCopia el archivo `.env.example` a `.env` y configura las siguientes variables:\n\n#### Configuración de la Aplicación\n\n```\nbash\nAPP_NAME=SmartPot-API\nPORT=8091\nTITLE=SmartPot API\nDESCRIPTION=Documentación de la API REST de SmartPot\nVERSION=1.0.0\nAUTHOR=SmartPot Developers\n```\n\n#### MongoDB\n\n```\nbash\nDATA_CONNECTION_METHOD=mongodb\nDATA_SOURCE_USERNAME=admin\nDATA_SOURCE_PASSWORD=admin\nDATA_SOURCE_DOMAIN=db-smartpot:27017\nDATA_SOURCE_DB=smartpot\nDATA_PARAMS=authSource=admin\u0026directConnection=true\u0026serverSelectionTimeoutMS=100000\u0026socketTimeoutMS=10000\u0026appName=mongo\n```\n\n#### Redis (Cache)\n\n```\nbash\nCACHE_TYPE=redis\nCACHE_HOST=cache-smartpot\nCACHE_PORT=6379\nCACHE_DB=0\nCACHE_USERNAME=default\nCACHE_PASSWORD=root\nCACHE_TIMEOUT=2000\nCACHE_LETTUCE_POOL_MAX_ACTIVE=8\nCACHE_LETTUCE_POOL_MAX_WAIT=-1\nCACHE_LETTUCE_POOL_MAX_IDLE=8\nCACHE_LETTUCE_POOL_MIN_IDLE=8\n\n# Configuración de caché\nCACHE_TIME_TO_LIVE=300000\nCACHE_NULL_VALUES=false\n```\n\n#### Email (SMTP)\n\n```\nbash\nMAIL_HOST=mail-smartpot\nMAIL_PORT=1025\nMAIL_USERNAME=smartpotadmin@example.com\nMAIL_PASSWORD=password123\nMAIL_PROPERTIES_SMTP_AUTH=true\nMAIL_PROPERTIES_SMTP_STARTTLS_ENABLE=false\n```\n\n#### Seguridad (JWT)\n\n```\nbash\nSECURITY_JWT_SECRET_KEY=your-secret-key-here\nSECURITY_JWT_EXPIRATION=86400000\nSECURITY_PUBLIC_ROUTES=/auth/login,/auth/verify\nSECURITY_AES_KEY=your-aes-key-here\nSECURITY_SCHEME_NAME=bearerAuth\n```\n\n#### Rate Limiting\n\n```\nbash\nRATE_LIMITING_MAX_REQUESTS=5\nRATE_LIMITING_TIME_WINDOW=60000\nRATE_LIMITING_PUBLIC_ROUTES=/swagger-ui/,/v3/api-docs,/swagger-resources/,/webjars/\n```\n\n#### CORS\n\n```\nbash\nHEADER_CORS_ALLOWED_ORIGINS=http://localhost:5173\n```\n\n#### Servidor\n\n```\nbash\nSERVER_TOMCAT_TIMEOUT=600000\nSERVER_FORWARD_HEADERS_STRATEGY=framework\n```\n\n#### Swagger/OpenAPI\n\n```\nbash\nSWAGGER_API_DOCS_ENABLED=true\nSWAGGER_API_DOCS_PATH=/v3/api-docs\nSWAGGER_REDOC_ENABLED=true\nSWAGGER_REDOC_PATH=/redoc\nSCALAR_ENABLED=true\nSCALAR_PATH=/scalar\nSWAGGER_UI_ENABLED=true\nSWAGGER_UI_PATH=/\nSWAGGER_UI_URL=/v3/api-docs\nSWAGGER_UI_DEFAULT_MODEL_EXPAND_DEPTH=1\nSWAGGER_UI_DEFAULT_MODEL_RENDERING=example\nSWAGGER_UI_DISPLAY_OPERATION_ID=true\nSWAGGER_UI_DISPLAY_REQUEST_DURATION=true\nSWAGGER_UI_DOC_EXPANSION=list\nOPENAPI_SERVER_URL=http://localhost:8091\n```\n\n#### Logging\n\n```\nbash\nDEBUGGER_MODE=INFO\n```\n\n### Ejemplo de Ejecución con Docker\n\n```\nbash\ndocker run -d --name smartpot-api-dev -p 8091:8091 \\\n-e APP_NAME=SmartPot-API \\\n-e PORT=8091 \\\n-e TITLE=\"SmartPot API\" \\\n-e DESCRIPTION=\"Documentación de la API REST de SmartPot\" \\\n-e VERSION=1.0.0 \\\n-e AUTHOR=\"SmartPot Developers\" \\\n\\\n-e DATA_CONNECTION_METHOD=mongodb \\\n-e DATA_SOURCE_USERNAME=admin \\\n-e DATA_SOURCE_PASSWORD=admin \\\n-e DATA_SOURCE_DOMAIN=db-smartpot:27017 \\\n-e DATA_SOURCE_DB=smartpot \\\n-e DATA_PARAMS=\"authSource=admin\u0026directConnection=true\u0026serverSelectionTimeoutMS=100000\u0026socketTimeoutMS=10000\u0026appName=mongo\" \\\n\\\n-e CACHE_TYPE=redis \\\n-e CACHE_HOST=cache-smartpot \\\n-e CACHE_PORT=6379 \\\n-e CACHE_DB=0 \\\n-e CACHE_USERNAME=default \\\n-e CACHE_PASSWORD=root \\\n-e CACHE_TIMEOUT=2000 \\\n-e CACHE_LETTUCE_POOL_MAX_ACTIVE=8 \\\n-e CACHE_LETTUCE_POOL_MAX_WAIT=-1 \\\n-e CACHE_LETTUCE_POOL_MAX_IDLE=8 \\\n-e CACHE_LETTUCE_POOL_MIN_IDLE=8 \\\n\\\n-e CACHE_TIME_TO_LIVE=300000 \\\n-e CACHE_NULL_VALUES=false \\\n\\\n-e MAIL_HOST=mail-smartpot \\\n-e MAIL_PORT=1025 \\\n-e MAIL_USERNAME=smartpotadmin@example.com \\\n-e MAIL_PASSWORD=password123 \\\n-e MAIL_PROPERTIES_SMTP_AUTH=true \\\n-e MAIL_PROPERTIES_SMTP_STARTTLS_ENABLE=false \\\n\\\n-e SECURITY_JWT_SECRET_KEY=c8e9b6803afbcfa6edd9569c94c75ff4b144622b0a0570a636dffd62c24a3476 \\\n-e SECURITY_JWT_EXPIRATION=86400000 \\\n-e SECURITY_PUBLIC_ROUTES=\"/auth/login,/auth/verify\" \\\n\\\n-e RATE_LIMITING_MAX_REQUESTS=5 \\\n-e RATE_LIMITING_TIME_WINDOW=60000 \\\n-e RATE_LIMITING_PUBLIC_ROUTES=\"/swagger-ui/,/v3/api-docs,/swagger-resources/,/webjars/\" \\\n\\\n-e HEADER_CORS_ALLOWED_ORIGINS=http://localhost:5173 \\\n\\\n-e SERVER_TOMCAT_TIMEOUT=600000 \\\n\\\n-e DEBUGGER_MODE=INFO \\\nsebastian190030/api-smartpot:latest\n```\n\n## Testing\n\n```\nbash\n# Ejecutar todos los tests\nmvn test\n\n# Ejecutar tests específicos\nmvn test -Dtest=UserControllerTest\n```\n\n## Documentación de la API\n\nUna vez que la aplicación esté en ejecución, accede a las interfaces de documentación:\n\n- **Swagger UI**: `http://localhost:8091/` (o tu URL configurada)\n- **ReDoc**: `http://localhost:8091/redoc`\n- **Scalar**: `http://localhost:8091/scalar`\n- **OpenAPI JSON**: `http://localhost:8091/v3/api-docs`\n\n## Seguridad\n\n- **Autenticación JWT**: Todas las rutas (excepto las públicas) requieren un token JWT válido.\n- **Rate Limiting**: Límite de 5 peticiones por minuto por IP en endpoints protegidos.\n- **CORS**: Configurado para aceptar peticiones desde orígenes específicos.\n- **Encriptación AES**: Datos sensibles cifrados antes de almacenarse.\n\n## CI/CD\n\nEl proyecto utiliza **GitHub Actions** para automatización:\n\n- **CodeQL**: Análisis de seguridad de código.\n- **Deployment**: Compilación, construcción de imagen Docker y despliegue automático.\n- **Microsoft Defender**: Escaneo de vulnerabilidades.\n- **OWASP Noir**: Análisis de seguridad adicional.\n- **Packaging**: Publicación automática en GitHub Container Registry.\n\n## Contribución\n\nLee [CONTRIBUTING.md](CONTRIBUTING.md) para más detalles sobre cómo contribuir al proyecto.\n\n## Licencia\n\nEste proyecto está bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.\n\n## Política de Seguridad\n\nConsulta [SECURITY.md](SECURITY.md) para información sobre la política de seguridad y cómo reportar vulnerabilidades.\n\n## Autores\n\n**SmartPot Tech Team**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartpottech%2Fsmartpot-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmartpottech%2Fsmartpot-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartpottech%2Fsmartpot-api/lists"}