Este guia fornece um passo a passo completo para desenvolver o projeto TechBlog API, um blog técnico profissional focado em artigos de alta qualidade sobre Java, arquitetura e engenharia de software. Seguimos princípios de DDD (Domain-Driven Design), Spring Modulith, SOLID e DRY, com arquitetura modular em Java 21 + Spring Boot 3.5.8.
Baseado na documentação viva: PRODUCT.md, ARCHITECTURE.md, DDD.md, PRD.md, SPEC.md e CONTRIBUTING.md.
O TechBlog API é uma plataforma de blog técnico com quatro bounded contexts principais:
- Publishing: Ciclo de vida de artigos (criação, edição, publicação).
- Engagement: Interações sociais (comentários, favoritos).
- Analytics: Métricas de leitura e engajamento.
- IAM (Identity & Access): Autenticação e autorização via JWT.
Tecnologias core: Java 21, Spring Boot 3.5.8, PostgreSQL, Flyway, Testcontainers, Redis (futuro).
com.techblog.api
.modules
.publishing
.domain # Entidades, Value Objects, Eventos
.application # Use cases, DTOs, Serviços
.infrastructure # Repositórios JPA, Configs
.presentation # Controllers REST
.engagement
.analytics
.iam
- JDK 21
- Maven 3.9+
- PostgreSQL (local ou via Docker)
- VS Code com extensão GitHub Copilot
-
Clone o repositório:
git clone <repo-url>
-
Configure o banco de dados em
src/main/resources/application.yml:spring: datasource: url: jdbc:postgresql://localhost:5432/techblog username: your_user password: your_password jpa: hibernate: ddl-auto: validate flyway: enabled: true
-
Execute o projeto:
./mvnw spring-boot:run
As migrations estão em src/main/resources/db/migration/. Exemplo de criação de tabela para Artigo:
-
Crie um arquivo
V1__Create_Article_Table.sql:CREATE TABLE articles ( id UUID PRIMARY KEY, title VARCHAR(255) NOT NULL, slug VARCHAR(255) UNIQUE NOT NULL, content_markdown TEXT NOT NULL, status VARCHAR(20) NOT NULL, author_id UUID NOT NULL, published_at TIMESTAMP, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP, deleted_at TIMESTAMP );
-
Execute as migrations:
./mvnw flyway:migrate
Para novas tabelas, sempre crie migrations incrementais (V2__, V3__, etc.) e teste com Testcontainers.
O pom.xml já inclui dependências essenciais. Para adicionar novas (ex.: Redis), edite e rode:
./mvnw dependency:resolveSiga este fluxo para manter consistência e documentação viva:
-
Novo Requisito ou Feature
- Abra o chat do Copilot e use o prompt
/plan-qna <descrição da feature>. - Exemplo:
/plan-qna Implementar funcionalidade de favoritar artigos no módulo engagement. - O agent
plangeradocs/plans/favoritar-artigo-plan.mdcom análise, tarefas e riscos.
- Abra o chat do Copilot e use o prompt
-
Revisão do Plano
- Leia e ajuste o plano manualmente. Ele serve como documentação oficial.
-
Implementação por Módulo
- Escolha o agent do módulo (ex.:
engagementpara favoritos). - Prompt:
Implemente docs/plans/favoritar-artigo-plan.md no módulo engagement. - O agent gera código focado no módulo, seguindo DDD.
- Escolha o agent do módulo (ex.:
-
Testes
- Para controllers, selecione a classe e digite:
Gere os testes seguindo o prompt integration-test. - Usa Testcontainers para PostgreSQL e RestAssured para endpoints.
- Para controllers, selecione a classe e digite:
-
Atualização da Documentação
- Peça ao agent: "Atualize DDD.md e ARCHITECTURE.md para refletir essa mudança baseada no plano."
- Commit com mensagens atômicas (ex.:
feat(engagement): add articles).
-
Revisão e Merge
- Faça PR com referência ao plano. Execute testes e linting.
Agents são especializados por contexto; prompts são templates reutilizáveis.
- plan: Para planejamento de features (
/plan-qna). - publishing: Para Publishing Context.
- engagement: Para Engagement Context.
- analytics: Para Analytics Context.
- iam: Para Identity & Access.
- new-module: Cria estrutura de novo módulo (ex.:
Use o prompt new-module para criar módulo 'analytics'). - integration-test: Gera testes de integração com Testcontainers.
- security-review: Análise de segurança no código.
Exemplo de uso: Para criar um novo módulo, digite no chat: Use o prompt new-module para criar módulo 'analytics'.
- Use prompt:
Use o prompt new-module para criar módulo 'publishing'. - O agent cria pacotes:
domain,application,infrastructure,presentation. - Adicione Aggregate Root
Artigoemdomain.
- Planeje:
/plan-qna Configurar JWT no módulo iam. - Implemente:
Implemente o plano no módulo iam. - Adicione dependências:
java-jwt, configure Spring Security.
-
Crie
V2__Create_Comments_Table.sql:CREATE TABLE comments ( id UUID PRIMARY KEY, article_id UUID REFERENCES articles(id), author_email VARCHAR(255), content TEXT NOT NULL, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP, deleted_at TIMESTAMP );
-
Teste: Execute
./mvnw flyway:migratee verifique no banco.
- Planeje com
/plan-qna. - No módulo engagement, crie
FavoriteServiceemapplication. - Controller em
presentationcom endpointPOST /articles/{id}/favorite. - Teste com
integration-test.
- Sempre atualize docs após mudanças: Use agents para refletir alterações em DDD.md, ARCHITECTURE.md, SPEC.md.
- Versione junto ao código: Commits incluem mudanças em docs.
- Feedback loop: Ajuste agents/prompts se necessário (ex.: edite
publishing.agent.md).
- Commits: Pequenos e atômicos (ex.:
feat(publishing): create Article entity). - Testes: 85% cobertura; use Testcontainers para isolamento.
- Segurança: RBAC com Spring Security; evite exposição de entidades JPA.
- Performance: Cache com Redis; otimize queries para P95 < 150ms.
- DDD: Lógica de negócio no domínio; use records para DTOs/VOs.
Para dúvidas, consulte CONTRIBUTING.md ou abra issue no repo.