{"id":21915835,"url":"https://github.com/SmartPotTech/SmartPot-API","last_synced_at":"2025-07-21T19:31:36.845Z","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-07-17T17:34:40.000Z","size":595,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-17T20:31:53.222Z","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,"zenodo":null}},"created_at":"2024-10-21T02:22:50.000Z","updated_at":"2025-07-17T17:34:43.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,"purl":"pkg:github/SmartPotTech/SmartPot-API","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","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmartPotTech%2FSmartPot-API/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266364206,"owners_count":23917836,"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","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-11-28T19:14:26.504Z","updated_at":"2025-07-21T19:31:36.839Z","avatar_url":"https://github.com/SmartPotTech.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SmartPot-API\n\n## Deployment\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\n### 1. Compilación de la Aplicación\n\n- **Abre la terminal** y navega hasta la raíz de tu proyecto.\n- Ejecuta el comando:\n\n  ```bash\n  mvn clean package -DskipTests -P docker -f pom.xml\n  ```\n\n    - Esto limpiará el proyecto, compilará el código y empaquetará la aplicación en un archivo JAR. El uso de `-DskipTests` omite las pruebas durante la construcción, esto con la finalidad de que no genere error, dado que se cambia las properties por variables de entorno. El uso de `-P docker` es porque se definió un perfil de build especifico donde compila ignorando él .env\n\n### 2. Creación de la Imagen Docker\n\n- **Asegúrate de tener un `Dockerfile`** en la raíz de tu proyecto. Este archivo define cómo se debe construir la imagen Docker.\n- **Ejecuta el siguiente comando** para construir la imagen:\n\n  ```bash\n  docker build --platform linux/amd64 -t sebastian190030/api-smartpot:latest .\n  ```\n\n    - Esto crea una imagen basada en tu aplicación.\n\n### 3. Publicación de la Imagen en Docker Hub\n\n- **Inicia sesión en Docker Hub** desde la terminal:\n\n  ```bash\n  docker login\n  ```\n\n- **Sube la imagen** a tu repositorio (cambiando sebastian190030 por tu usuario) en Docker Hub:\n\n  ```bash\n  docker push sebastian190030/api-smartpot:latest\n  ```\n\n    - Esto hace que tu imagen esté disponible en línea públicamente\n\n### 4. Despliegue en Render.com\n\n#### 4.1 Creación de Web Service\n\n- **Inicia sesión en tu cuenta de Render.com**.\n- **Crea un nuevo servicio** seleccionando \"New\" y luego \"Web Service\".\n- **Elige Docker** como tipo de despliegue.\n- **Proporciona el nombre de tu repositorio** de Docker Hub: `sebastian190030/api-smarpot`.\n- **Configura las variables de entorno** necesarias para tu aplicación.\n- **Haz clic en \"Crear\"** para iniciar el despliegue.\n\n#### 4.2 Despliegue\n- **Usa el Deploy hook** para hacer deploy automático\n\n  ```bash\n  cmd /c deploy.render.cmd\n  ```\n  - Esto ejecuta un CURL -X POST https://api.render.com/deploy/srv-csgeg0lumphs73b48veg?key={key}\n\n## 📦 Estructura del Proyecto – SmartPot API\nEste proyecto es una API RESTful desarrollada en Java con Spring Boot, diseñada para gestionar la información de cultivos y dispositivos SmartPot. Utiliza MongoDB como base de datos y Redis para almacenamiento en caché. La API está documentada con Swagger/OpenAPI y cuenta con autenticación JWT.\n\n### 📁 Estructura de Directorios\n\n```\nsrc/\n └── main/\n      ├── java/\n      │    └── smartpot/\n      │         └── com/\n      │              └── api/\n      │                   ├── Cache/\n      │                   ├── Commands/\n      │                   ├── Crops/\n      │                   ├── Documentation/\n      │                   ├── Exception/\n      │                   ├── Mail/\n      │                   ├── Notifications/\n      │                   ├── Records/\n      │                   ├── Responses/\n      │                   ├── Security/\n      │                   ├── Sessions/\n      │                   ├── Users/\n      │                   └── SmartPotApiApplication.java\n      └── resources/\n           ├── application.yml\n           └── banner.txt\n```\n\n---\n\n## 📂 Descripción de Directorios\n\n### `Cache/`\n\nConfiguraciones relacionadas con mecanismos de caché como Redis.\n\n* `RedisConfig.java`: Configura el uso de Redis como sistema de almacenamiento temporal.\n\n---\n\n### `Commands/`\n\nManejo de comandos automatizados en la aplicación.\n\n* **Controller**: `CommandController.java`\n* **DTO**: `CommandDTO.java`\n* **Entity**: `Command.java`\n* **Repository**: `RCommand.java`\n* **Service**: `SCommand.java`, `SCommandI.java`\n* **Mapper**: `MCommand.java`\n* **Validator**: *(vacío o por implementar)*\n\n---\n\n### `Crops/`\n\nAdministración de cultivos y su estado.\n\n* **Controller**: `CropController.java`\n* **DTO**: `CropDTO.java`\n* **Entity**: `Crop.java`, `CropStatus.java`, `CropType.java`\n* **Repository**: `RCrop.java`\n* **Service**: `SCrop.java`, `SCropI.java`\n* **Mapper**: `MCrop.java`\n* **Validator**: `VCrop.java`, `VCropI.java`\n\n---\n\n### `Documentation/`\n\nConfiguración de Swagger/OpenAPI.\n\n* `SwaggerConfig.java`: Habilita y configura la documentación automática de la API.\n\n---\n\n### `Exception/`\n\nManejo global de errores.\n\n* `ApiException.java`: Excepción personalizada.\n* `ApiHandler.java`: Manejador global de excepciones.\n* `ApiResponse.java`: Modelo de respuesta para errores.\n* `InvalidTokenException.java`: Excepción específica para tokens inválidos.\n\n---\n\n### `Mail/`\n\nEnvío de correos electrónicos y configuración relacionada.\n\n* **Config**: `AsyncConfig.java`\n* **Controller**: `EmailController.java`\n* **DTO**: `EmailDTO.java`\n* **Entity**: `EmailDetails.java`\n* **Repository**: `EmailRepository.java`\n* **Service**: `EmailService.java`, `EmailServiceI.java`\n* **Mapper**: `EmailMapper.java`\n* **Validator**: `EmailValidator.java`, `EmailValidatorI.java`\n\n---\n\n### `Notifications/`\n\nNotificaciones automáticas hacia el usuario.\n\n* **Controller**: `NotificationController.java`\n* **DTO**: `NotificationDTO.java`\n* **Entity**: `Notification.java`\n* **Repository**: `RNotification.java`\n* **Service**: `SNotification.java`, `SNotificationI.java`\n* **Mapper**: `MNotification.java`\n\n---\n\n### `Records/`\n\nHistorial y registros de medidas.\n\n* **Controller**: `HistoryController.java`\n* **DTO**: `CropRecordDTO.java`, `MeasuresDTO.java`, `RecordDTO.java`\n* **Entity**: `DateRange.java`, `History.java`, `Measures.java`\n* **Repository**: `RHistory.java`\n* **Service**: `SHistory.java`, `SHistoryI.java`\n* **Mapper**: `MRecords.java`\n\n---\n\n### `Responses/`\n\nModelos de respuestas comunes de la API.\n\n* `DeleteResponse.java`: Respuesta para operaciones DELETE exitosas.\n* `ErrorResponse.java`: Estructura para respuestas de error.\n* `TokenResponse.java`: Estructura para respuestas con tokens JWT.\n\n---\n\n### `Security/`\n\nGestión de autenticación, autorización y configuración de seguridad.\n\n* **Config**: `SecurityConfiguration.java`\n* **Filters**: `JwtAuthFilter.java`, `RateLimitingFilter.java`\n* **CORS**: `CorsConfig.java`\n* **Controller**: `AuthController.java`\n* **Service**: `JwtService.java`, `JwtServiceI.java`\n\n---\n\n### `Sessions/`\n\nGestión de sesiones de usuario.\n\n* **Controller**: `SessionController.java`\n* **DTO**: `SessionDTO.java`\n* **Entity**: `Session.java`\n* **Repository**: `RSession.java`\n* **Service**: `SSession.java`, `SSessionI.java`\n* **Mapper**: `MSession.java`\n\n---\n\n### `Users/`\n\nGestión de usuarios del sistema.\n\n* **Controller**: `UserController.java`\n* **DTO**: `UserDTO.java`\n* **Entity**: `User.java`, `UserRole.java`\n* **Repository**: `RUser.java`\n* **Service**: `SUser.java`, `SUserI.java`\n* **Mapper**: `MUser.java`\n* **Validator**: `UserRegex.java`, `VUser.java`, `VUserI.java`\n\n---\n\n### `SmartPotApiApplication.java`\n\nClase principal que inicia la aplicación Spring Boot. Marca el punto de entrada (`main`) del backend SmartPot API.\n\n---\n\n## 🧪 Estructura de Pruebas\n\n```\nsrc/\n └── test/\n      └── java/\n           └── smartpot/\n                └── com/\n                     └── api/\n                          ├── SmartPotApiApplicationTest.java\n                          └── Users/\n                               └── Controller/\n                                    └── UserControllerTest.java\n```\n\nPruebas unitarias utilizando JUnit para validar funcionalidad básica, incluyendo controladores y la clase principal.\n\n---\n\n## 🧱 Archivos adicionales relevantes\n\n* `Dockerfile`, `.dockerignore`: Contenedorización con Docker.\n* `.env`, `.env.example`: Configuración de entorno.\n* `.gitignore`, `.gitattributes`: Configuración de exclusión de archivos.\n* `pom.xml`: Gestión de dependencias con Maven.\n* `.github/`: Flujos de trabajo CI/CD con GitHub Actions.\n* `README.md`, `CONTRIBUTING.md`, `SECURITY.md`, `LICENSE`: Documentación del proyecto y políticas de contribución.\n\n\n## Ejecución en Entorno Docker\n\nPara desplegar la aplicación en un entorno Docker, puedes utilizar el siguiente comando:\n\n```bash\ndocker run -d --name \u003cCONTAINER_NAME\u003e -p \u003cEXTERNAL_PORT\u003e:\u003cINTERNAL_PORT\u003e \\\n-e APP_NAME=\u003cNombre de la aplicación\u003e \\\n-e PORT=\u003cPuerto de escucha interno\u003e \\\n-e TITLE=\u003cTítulo de la API\u003e \\\n-e DESCRIPTION=\u003cDescripción de la API\u003e \\\n-e VERSION=\u003cVersión de la API\u003e \\\n-e AUTHOR=\u003cNombre del autor o equipo\u003e \\\n-e DATA_SOURCE_USERNAME=\u003cUsuario de la base de datos\u003e \\\n-e DATA_SOURCE_PASSWORD=\u003cContraseña de la base de datos\u003e \\\n-e DATA_SOURCE_DOMAIN=\u003cDominio de la base de datos\u003e \\\n-e DATA_SOURCE_DB=\u003cNombre de la base de datos\u003e \\\n-e DATA_SOURCE_RETRY_WRITES=\u003cHabilitar o deshabilitar reintentos de escritura (true/false)\u003e \\\n-e DATA_SOURCE_W=\u003cNivel de confirmación de escritura\u003e \\\n-e DATA_SOURCE_APP_NAME=\u003cNombre de la aplicación en MongoDB\u003e \\\n-e SECURITY_JWT_SECRET_KEY=\u003cClave secreta para JWT\u003e \\\n-e SECURITY_JWT_EXPIRATION=\u003cTiempo de expiración del JWT en milisegundos\u003e \\\n-e SECURITY_PUBLIC_ROUTES=\u003cRutas públicas que no requieren autenticación\u003e \\\n-e HEADER_CORS_ALLOWED_ORIGINS=\u003cOrigen permitido para CORS\u003e \\\n-e DEBUGGER_MODE=\u003cModo de depuración (INFO, DEBUG, OFF)\u003e \\\n\u003cDOCKER_IMAGE\u003e\n```\n\n### Variables de Entorno\nA continuación, se describen las variables de entorno necesarias para la ejecución:\n\n#### Configuración de la Aplicación\n- **`APP_NAME`**: Nombre de la aplicación para identificación en el entorno.\n- **`PORT`**: Puerto interno en el que la aplicación escucha.\n- **`TITLE`**: Título descriptivo de la API.\n- **`DESCRIPTION`**: Información breve sobre la API.\n- **`VERSION`**: Versión de la API (en formato semántico, como `1.0.0`).\n- **`AUTHOR`**: Nombre del autor o equipo desarrollador.\n\n#### Configuración de la Base de Datos\n- **`DATA_SOURCE_USERNAME`**: Usuario de acceso a la base de datos.\n- **`DATA_SOURCE_PASSWORD`**: Contraseña de acceso.\n- **`DATA_SOURCE_DOMAIN`**: URL o dominio del clúster de MongoDB.\n- **`DATA_SOURCE_DB`**: Nombre de la base de datos.\n- **`DATA_SOURCE_RETRY_WRITES`**: Define si los reintentos de escritura están habilitados (`true` o `false`).\n- **`DATA_SOURCE_W`**: Nivel de confirmación de escritura (por ejemplo, `majority`).\n- **`DATA_SOURCE_APP_NAME`**: Nombre usado para identificar la aplicación en las métricas de MongoDB.\n\n#### Configuración de Seguridad\n- **`SECURITY_JWT_SECRET_KEY`**: Clave secreta utilizada para firmar y verificar los tokens JWT.\n- **`SECURITY_JWT_EXPIRATION`**: Duración del token JWT en milisegundos (por ejemplo, `300000` para 5 minutos).\n- **`SECURITY_PUBLIC_ROUTES`**: Endpoints públicos que no requieren autenticación (separados por comas).\n\n#### Configuración de CORS\n- **`HEADER_CORS_ALLOWED_ORIGINS`**: Origen permitido para solicitudes CORS (por ejemplo, `http://localhost:3000`).\n\n#### Configuración de Depuración\n- **`DEBUGGER_MODE`**: Nivel de detalle para los logs (`INFO`, `DEBUG`, `OFF`).\n\n### Ejemplo de Ejecución\nAquí tienes un ejemplo práctico con valores de ejemplo que puedes ajustar según tu entorno:\n\n```bash\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  # MongoDB\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  # Redis\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  # Config cache\n  -e CACHE_TIME_TO_LIVE=300000 \\\n  -e CACHE_NULL_VALUES=false \\\n  \\\n  # Email (Mailpit local)\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  # Seguridad\n  -e SECURITY_JWT_SECRET_KEY=c8e9b6803afbcfa6edd9569c94c75ff4b144622b0a0570a636dffd62c24a3476 \\\n  -e SECURITY_JWT_EXPIRATION=86400000 \\\n  -e SECURITY_PUBLIC_ROUTES=\"/auth/login,/auth/verify\" \\\n  \\\n  # Rate limiting\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  # Headers\n  -e HEADER_CORS_ALLOWED_ORIGINS=http://localhost:5173 \\\n  \\\n  # Tomcat\n  -e SERVER_TOMCAT_TIMEOUT=600000 \\\n  \\\n  # Debugger\n  -e DEBUGGER_MODE=INFO \\\n  sebastian190030/api-smartpot:latest\n\n```\n","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"}