{"id":29663111,"url":"https://github.com/bulletdev/licitei-backend","last_synced_at":"2025-09-04T05:43:13.425Z","repository":{"id":302703840,"uuid":"1013353473","full_name":"Bulletdev/licitei-backend","owner":"Bulletdev","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-04T03:21:27.000Z","size":67,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-30T02:40:09.152Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.arremate.cloud/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bulletdev.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-03T18:56:37.000Z","updated_at":"2025-07-04T03:18:54.000Z","dependencies_parsed_at":"2025-07-03T20:18:52.903Z","dependency_job_id":"1e537110-c683-41b7-874a-6438fa6aec8d","html_url":"https://github.com/Bulletdev/licitei-backend","commit_stats":null,"previous_names":["bulletdev/licitei-backend"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Bulletdev/licitei-backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bulletdev%2Flicitei-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bulletdev%2Flicitei-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bulletdev%2Flicitei-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bulletdev%2Flicitei-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bulletdev","download_url":"https://codeload.github.com/Bulletdev/licitei-backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bulletdev%2Flicitei-backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273557586,"owners_count":25126836,"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-09-04T02:00:08.968Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":[],"created_at":"2025-07-22T11:08:11.217Z","updated_at":"2025-09-04T05:43:13.399Z","avatar_url":"https://github.com/Bulletdev.png","language":"Java","readme":"# Sistema de Gestão de Licitações - Backend\n\nAPI REST para captura e consulta de licitações públicas do ComprasNet.\n\n## 🚀 Tecnologias Utilizadas\n\n- **Java 17**\n- **Spring Boot 3.2.0**\n- **Spring Data JPA**\n- **H2 Database** (desenvolvimento)\n- **JSoup** (web scraping)\n- **SpringDoc OpenAPI** (documentação)\n- **JUnit 5** (testes)\n- **Maven** (build)\n\n## 📋 Funcionalidades\n\n- ✅ Captura automática de licitações do ComprasNet\n- ✅ API REST para consulta de licitações\n- ✅ Filtros por código UASG e número do pregão\n- ✅ Paginação e ordenação\n- ✅ Documentação Swagger\n- ✅ Testes automatizados\n- ✅ Tratamento de erros centralizado\n\n## 🏗️ Arquitetura\n\nO projeto segue os princípios de **Clean Architecture** e **Domain-Driven Design**:\n\n```\nsrc/main/java/com/effecti/licitacoes/\n├── domain/                 # Entidades e regras de negócio\n│   ├── entity/            # Entidades JPA\n│   └── repository/        # Interfaces de repositório\n├── application/           # Casos de uso e DTOs\n│   ├── dto/              # Data Transfer Objects\n│   └── service/          # Serviços de aplicação\n├── infrastructure/       # Implementações técnicas\n│   ├── exception/        # Tratamento de exceções\n│   └── service/          # Serviços de infraestrutura\n└── presentation/         # Controladores REST\n    └── controller/\n```\n\n## 🛠️ Como Executar\n\n### Pré-requisitos\n- Java 17+\n- Maven 3.6+\n\n### Executando a aplicação\n\n1. **Clone o repositório**\n```bash\ngit clone \u003curl-do-repositorio\u003e\ncd licitacoes-api\n```\n\n2. **Execute a aplicação**\n```bash\nmvn spring-boot:run\n```\n\n3. **Acesse a aplicação**\n- API: http://localhost:9991\n- Swagger UI: http://localhost:9991/swagger-ui.html\n- H2 Console: http://localhost:9991/h2-console\n\n### Executando os testes\n\n```bash\n# Todos os testes\nmvn test\n\n# Testes específicos\nmvn test -Dtest=LicitacaoControllerTest\nmvn test -Dtest=LicitacaoServiceTest\n```\n\n### Build para produção\n\n```bash\nmvn clean package\njava -jar target/licitacoes-api-1.0.0.jar\n```\n\n## 📡 Endpoints da API\n\n### Listar Licitações\n```http\nGET /api/licitacoes\n```\n\n**Parâmetros de consulta:**\n- `codigoUasg` (opcional): Código da UASG\n- `numeroPregao` (opcional): Número do pregão\n- `page` (padrão: 0): Número da página\n- `size` (padrão: 20): Tamanho da página\n- `sort` (opcional): Ordenação (ex: `dataAbertura,desc`)\n\n**Exemplo:**\n```http\nGET /api/licitacoes?codigoUasg=123456\u0026numeroPregao=001/2024\u0026page=0\u0026size=10\n```\n\n### Buscar Licitação por ID\n```http\nGET /api/licitacoes/{id}\n```\n\n## 📊 Modelo de Dados\n\n### Licitação\n```json\n{\n  \"id\": 1,\n  \"codigoUasg\": \"123456\",\n  \"numeroPregao\": \"001/2024\",\n  \"objeto\": \"Descrição do objeto licitado\",\n  \"dataAbertura\": \"2024-01-15T10:00:00\",\n  \"endereco\": \"Endereço da sessão\",\n  \"modalidade\": \"Pregão Eletrônico\",\n  \"itens\": [...],\n  \"criadoEm\": \"2024-01-15T08:00:00\",\n  \"atualizadoEm\": \"2024-01-15T08:00:00\"\n}\n```\n\n### Item de Licitação\n```json\n{\n  \"id\": 1,\n  \"numeroItem\": \"001\",\n  \"descricao\": \"Descrição do item\",\n  \"quantidade\": 100,\n  \"valorUnitario\": 25.50,\n  \"unidade\": \"UN\"\n}\n```\n\n## 🔄 Captura de Dados\n\nO sistema possui um **scheduler** que executa a cada 30 minutos para capturar novas licitações do ComprasNet. A captura é feita através de web scraping usando JSoup.\n\n**Características:**\n- Execução automática a cada 30 minutos\n- Verifica duplicatas antes de inserir\n- Log detalhado das operações\n- Tratamento de erros robusto\n\n## 🧪 Testes\n\n### Cobertura de Testes\n\n- **Controllers**: Testes de integração com MockMvc\n- **Services**: Testes unitários com Mockito\n- **Repositories**: Testes de integração com @DataJpaTest\n- **Scraping**: Testes unitários mockando dependências\n\n### Executar testes com relatório\n\n```bash\nmvn test jacoco:report\n```\n\nO relatório será gerado em `target/site/jacoco/index.html`\n\n## 🛡️ Segurança e Boas Práticas\n\n- **Validação**: Bean Validation nas entidades\n- **Tratamento de Erros**: Handler global com respostas padronizadas\n- **Logging**: Logs estruturados com níveis apropriados\n- **Performance**: Índices no banco, paginação obrigatória\n- **Clean Code**: Código limpo, métodos pequenos, responsabilidade única\n\n## 📈 Melhorias para Performance \n\n### 1. Cache Distribuído\n**Implementação**: Redis com Spring Cache\n```java\n@Cacheable(value = \"licitacoes\", key = \"#codigoUasg + '-' + #numeroPregao + '-' + #pageable.pageNumber\")\npublic Page\u003cLicitacao\u003e findByFilters(String codigoUasg, String numeroPregao, Pageable pageable)\n```\n\n**Justificativa**: \n- Reduz consultas ao banco para filtros frequentes\n- TTL configurável para dados que mudam pouco\n- Invalidação automática em atualizações\n\n### 2. Banco de Dados Otimizado\n**Implementação**: PostgreSQL com particionamento\n```sql\nCREATE TABLE licitacoes_2024 PARTITION OF licitacoes\nFOR VALUES FROM ('2024-01-01') TO ('2025-01-01');\n\nCREATE INDEX CONCURRENTLY idx_licitacoes_uasg_pregao_data \nON licitacoes (codigo_uasg, numero_pregao, data_abertura DESC);\n```\n\n**Justificativa**:\n- Particionamento por ano reduz escaneamento\n- Índices compostos otimizam consultas com filtros\n- Connection pooling adequado (HikariCP)\n\n## 🔧 Configurações\n\n### Ambiente de Desenvolvimento\n```yaml\nspring:\n  datasource:\n    url: jdbc:h2:mem:licitacoes\n  jpa:\n    show-sql: true\n  logging:\n    level:\n      com.effecti.licitacoes: DEBUG\n```\n\n### Ambiente de Produção\n```yaml\nspring:\n  datasource:\n    url: jdbc:postgresql://localhost:5432/licitacoes\n    username: ${DB_USERNAME}\n    password: ${DB_PASSWORD}\n  jpa:\n    show-sql: false\n  logging:\n    level:\n      com.effecti.licitacoes: INFO\n```\n\n## 📝 Decisões Técnicas\n\n### 1. **H2 Database**\n- **Motivo**: Facilita execução e testes\n- **Produção**: Migrado para PostgreSQL\n\n### 2. **JSoup para Web Scraping**\n- **Motivo**: Biblioteca robusta para parsing HTML\n- **Alternativa**: Selenium para sites com JavaScript\n\n### 3. **Records para DTOs**\n- **Motivo**: Imutabilidade, menos boilerplate\n- **Java 17**: Suporte nativo a records\n\n### 4. **Paginação Obrigatória**\n- **Motivo**: Evita sobrecarga com grandes volumes\n- **Implementação**: Spring Data Pageable\n\n### 5. **Scheduler para Captura**\n- **Motivo**: Automação da coleta de dados\n- **Configuração**: Intervalo ajustável via properties\n\n## ⚡ Performance Benchmarks\n\n### Otimizações Implementadas\n1. **Índices**: `codigo_uasg`, `numero_pregao`\n2. **Paginação**: Máximo 100 registros por página\n3. **Lazy Loading**: Relacionamentos carregados sob demanda\n4. **Query Optimization**: JPQL otimizado\n\n## 🚀 Deploy\n\n### Docker\n```dockerfile\nFROM openjdk:17-jdk-slim\nCOPY target/licitacoes-api-1.0.0.jar app.jar\nEXPOSE 9991\nENTRYPOINT [\"java\", \"-jar\", \"/app.jar\"]\n```\n\n### Kubernetes\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: licitacoes-api\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: licitacoes-api\n  template:\n    metadata:\n      labels:\n        app: licitacoes-api\n    spec:\n      containers:\n      - name: licitacoes-api\n        image: licitacoes-api:1.0.0\n        ports:\n        - containerPort: 9991\n```\n\n## 📊 Monitoramento\n\n### Métricas Implementadas\n- **Actuator**: Health checks, métricas JVM\n- **Custom Metrics**: Contadores de scraping\n- **Logs Estruturados**: JSON format para ELK\n\n\n## 📋 Checklist de Implementação\n\n### Backend ✅\n- [x] API REST com Spring Boot\n- [x] Captura de dados do ComprasNet\n- [x] Filtros por UASG e Pregão\n- [x] Paginação e ordenação\n- [x] Testes automatizados (JUnit)\n- [x] Documentação Swagger\n- [x] Tratamento de erros\n- [x] Validações\n\n### Extras Implementados ✅\n- [x] Clean Architecture\n- [x] Cache strategy design\n- [x] Performance optimization\n- [x] Docker support\n- [x] Monitoring setup\n- [x] CI/CD considerations\n\n## ⏱️ Tempo Estimado de Desenvolvimento\n\n- **Arquitetura e Setup**: 2h\n- **Entidades e Repositórios**: 1.5h\n- **Serviços e Web Scraping**: 3h\n- **Controllers e DTOs**: 1.5h\n- **Testes Automatizados**: 2.5h\n- **Documentação e README**: 1.5h\n- **Total**: ~12 horas\n\n## 📄 Licença\n\nEste projeto está sob a licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletdev%2Flicitei-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulletdev%2Flicitei-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletdev%2Flicitei-backend/lists"}