Vacancy Management Server é uma aplicação backend desenvolvida em Java com Spring Boot, projetada para gerenciar vagas (vacancies) de forma eficiente, escalável e segura. O projeto utiliza Docker para facilitar o desenvolvimento, testes e deploy, além de integrar um banco de dados PostgreSQL e gerenciamento de dependências via Maven.
- Java 17+
- Spring Boot
- Maven
- PostgreSQL
- Docker & Docker Compose
Dockerfile: Cria uma imagem enxuta para produção.Dockerfile.dev: Ambiente de desenvolvimento com hot reload.docker-compose.yml: Orquestração dos containers (aplicação + banco de dados).docker-compose.override.yml: Customizações para desenvolvimento local.pom.xml: Gerenciamento de dependências e plugins Maven.src/: Código-fonte da aplicação.
git clone https://github.com/Cardosofiles/vacancy-management-server.git
cd vacancy-management-serverVocê pode criar um arquivo .env para customizar variáveis como usuário e senha do banco.
Para ambiente de desenvolvimento (hot reload):
docker-compose -f docker-compose.yml -f docker-compose.override.yml up --buildPara ambiente de produção:
docker-compose up --buildA aplicação estará disponível em http://localhost:8080.
docker-compose exec app mvn testO serviço PostgreSQL é iniciado automaticamente via Docker Compose. As credenciais padrão podem ser alteradas via variáveis de ambiente.
mvn clean install– Compila e empacota a aplicação.mvn test– Executa os testes automatizados.
O projeto utiliza perfis Spring (dev, prod) para separar configurações de desenvolvimento e produção.
A documentação dos endpoints pode ser acessada (se habilitada) via /swagger-ui.html após subir a aplicação.
- Sinta-se à vontade para clonar, adaptar e contribuir!
- Recomenda-se o uso de variáveis de ambiente para dados sensíveis.
https://github.com/Cardosofiles/vacancy-management-server
discord-tech-bot/
│
├── src/main/java/com/cardosofiles/discordtechbot/
│ │
│ ├── DiscordTechBotApplication.java ← main() da aplicação
│ │
│ ├── modules/
│ │ └── news/ ← único módulo (igual ao seu src/modules/news)
│ │ │
│ │ ├── domain/ ← regras de negócio puras (Java puro, sem Spring)
│ │ │ ├── FeedItem.java ← entidade: item de notícia de um feed RSS
│ │ │ ├── FeedSource.java ← entidade: fonte RSS (ex: dev.to, hackernews)
│ │ │ ├── ChannelMapping.java ← entidade: mapeamento source → canal Discord
│ │ │ ├── JobRun.java ← entidade: log de execução do cron job
│ │ │ ├── FeedCategory.java ← enum: BACKEND, FRONTEND, DEVOPS, IA, etc.
│ │ │ ├── SourceStatus.java ← enum: ENABLED / DISABLED
│ │ │ └── repository/ ← interfaces (Ports) — sem JPA aqui!
│ │ │ ├── FeedItemRepository.java
│ │ │ ├── FeedSourceRepository.java
│ │ │ ├── ChannelMappingRepository.java
│ │ │ └── JobRunRepository.java
│ │ │
│ │ ├── application/ ← casos de uso (orquestra domain + infra)
│ │ │ ├── IngestFeedsUseCase.java ← busca RSS, salva FeedItems novos (seu ingest-feeds.use-case.ts)
│ │ │ ├── PublishDigestUseCase.java ← monta e envia digest ao Discord (seu publish-digest.use-case.ts)
│ │ │ ├── CleanupOldItemsUseCase.java ← deleta FeedItems antigos (seu cleanup-old-items.use-case.ts)
│ │ │ ├── ListEnabledSourcesUseCase.java ← lista sources ativas (seu list-enabled-sources.use-case.ts)
│ │ │ └── dto/
│ │ │ ├── FeedItemDTO.java ← dados de um item de feed para o digest
│ │ │ ├── DigestPayloadDTO.java ← payload montado para enviar ao Discord
│ │ │ └── SourceDTO.java ← dados de uma fonte RSS
│ │ │
│ │ ├── infrastructure/ ← implementações técnicas (Adapters)
│ │ │ ├── persistence/
│ │ │ │ ├── FeedItemEntity.java ← @Entity JPA da tabela feed_items
│ │ │ │ ├── FeedSourceEntity.java ← @Entity JPA da tabela feed_sources
│ │ │ │ ├── ChannelMappingEntity.java ← @Entity JPA da tabela channel_mappings
│ │ │ │ ├── JobRunEntity.java ← @Entity JPA da tabela job_runs
│ │ │ │ ├── JpaFeedItemRepository.java ← interface Spring Data JPA
│ │ │ │ ├── JpaFeedSourceRepository.java
│ │ │ │ ├── JpaChannelMappingRepository.java
│ │ │ │ ├── JpaJobRunRepository.java
│ │ │ │ ├── FeedItemRepositoryAdapter.java ← implementa Port do domain
│ │ │ │ ├── FeedSourceRepositoryAdapter.java
│ │ │ │ ├── ChannelMappingRepositoryAdapter.java
│ │ │ │ └── JobRunRepositoryAdapter.java
│ │ │ └── feeds/ ← parsers de RSS por source (seu infrastructure/feeds/)
│ │ │ ├── RssFeedParser.java ← parser genérico RSS/Atom com Rome library
│ │ │ ├── DevToFeedParser.java ← parser específico dev.to
│ │ │ ├── HackerNewsFeedParser.java ← parser HackerNews RSS
│ │ │ └── GithubTrendingFeedParser.java
│ │ │
│ │ └── web/ ← controllers REST (admin/healthcheck)
│ │ └── NewsAdminController.java ← GET /news/sources, POST /news/ingest (trigger manual)
│ │
│ └── shared/ ← componentes transversais (seu src/shared/)
│ │
│ ├── config/
│ │ ├── AppConfig.java ← beans gerais (@Configuration)
│ │ ├── SwaggerConfig.java ← SpringDoc/OpenAPI
│ │ └── SchedulingConfig.java ← habilita @EnableScheduling
│ │
│ ├── cron/ ← agendadores (seu shared/cron/)
│ │ └── NewsFeedScheduler.java ← @Scheduled que chama os UseCases
│ │
│ ├── discord/ ← cliente Discord (seu shared/discord/)
│ │ ├── DiscordClientConfig.java ← configura Discord4J com o bot token
│ │ ├── DiscordChannelResolver.java ← resolve channelId pelo nome/categoria (seu channel-resolver.ts)
│ │ └── DiscordMessagePublisher.java ← envia Embed ao canal (usa Discord4J)
│ │
│ ├── http/ ← cliente HTTP (seu shared/http/)
│ │ └── RssHttpClient.java ← WebClient para buscar feeds externos
│ │
│ ├── logger/ ← logging estruturado (seu shared/logger/)
│ │ └── AppLogger.java ← wrapper de SLF4J/Logback com MDC
│ │
│ ├── exception/
│ │ ├── GlobalExceptionHandler.java ← @RestControllerAdvice
│ │ ├── FeedIngestionException.java ← erro ao ingerir feed
│ │ ├── DiscordPublishException.java ← erro ao publicar no Discord
│ │ └── dto/
│ │ └── ErrorResponseDTO.java
│ │
│ └── audit/
│ └── BaseEntity.java ← createdAt, updatedAt para todas as @Entity
│
├── src/main/resources/
│ ├── application.yml ← configurações principais
│ ├── application-local.yml ← variáveis para desenvolvimento local
│ └── db/migration/ ← Flyway (equivalente ao seu /drizzle/)
│ ├── V1**create_feed_sources.sql
│ ├── V2**create_feed_items.sql
│ ├── V3**create_channel_mappings.sql
│ └── V4**create_job_runs.sql
│
├── src/test/java/com/cardosofiles/discordtechbot/
│ ├── modules/news/
│ │ ├── application/
│ │ │ ├── IngestFeedsUseCaseTest.java
│ │ │ └── PublishDigestUseCaseTest.java
│ │ └── infrastructure/
│ │ └── RssFeedParserTest.java
│ └── shared/
│ └── discord/
│ └── DiscordMessagePublisherTest.java
│
├── Dockerfile
├── docker-compose.yml
├── .env.example
└── pom.xml