Plataforma de desafios de programação (estilo LeetCode/HackerRank) com o
DevCoach — uma IA inspirada no Coach do Chess.com que classifica a
qualidade da solução (Brilhante, Ótimo, Livro, Incompleto, Gafe),
dá uma dica socrática e calcula a complexidade Big O.
| Camada | Tecnologia |
|---|---|
| Backend | Java 21 · Spring Boot 3.4 · Spring AI 1.0 |
| Frontend | Angular 19 (standalone + signals) |
| Banco | PostgreSQL 16 |
| Sandbox | Judge0 (integração preparada — hoje mock) |
| IA | Spring AI (provider OpenAI, trocável) |
keepcoding/
├── docker-compose.yml # PostgreSQL local
├── docs/
│ └── schema.sql # schema do banco (referência)
│
├── backend/ # API Spring Boot
│ ├── pom.xml
│ └── src/main/
│ ├── resources/application.yml
│ └── java/com/keepcoding/
│ ├── KeepCodingApplication.java
│ ├── config/ # CORS, seed de dados
│ ├── controller/ # endpoints REST + tratamento de erro
│ ├── domain/ # entidades JPA + enums
│ ├── dto/ # records de request/response
│ ├── repository/ # repositórios Spring Data
│ └── service/ # SubmissionService, Judge0Service, CoachAiService
│
└── frontend/ # SPA Angular
├── package.json
├── angular.json
└── src/
├── environments/ # apiUrl
└── app/
├── models/ # interfaces (Problem, Submission, Coach)
├── services/ # ProblemService, SubmissionService
└── features/problem-detail/
├── problem-detail.component.* # tela do desafio
└── components/
├── code-editor/ # editor (mock Monaco)
└── dev-coach/ # avatar + balão + badge
docker compose up -dcd backend
# opcional: chave para o DevCoach real
export OPENAI_API_KEY=sk-... # Windows PowerShell: $env:OPENAI_API_KEY="sk-..."
./mvnw spring-boot:run # ou: mvn spring-boot:runSem
OPENAI_API_KEYa aplicação roda normalmente — o DevCoach devolve um feedback de fallback. ODataSeedercria o usuáriodemo(id 1) e o problemaTwo Sum(id 1) na primeira execução.
cd frontend
npm install
npm startAbra http://localhost:4200.
Angular ProblemDetail → POST /api/submissions
→ SubmissionService (salva PENDING)
→ Judge0Service (executa no sandbox — mock)
→ CoachAiService (Spring AI classifica a solução)
→ resposta com veredito + CoachFeedback → DevCoach component
- Judge0 real: substituir o corpo de
Judge0Service.execute(esqueleto deRestClientjá documentado no arquivo). - Monaco real:
npm i ngx-monaco-editor-v2 monaco-editore trocar o<textarea>emcode-editor.component.html(instruções no próprio arquivo). O pacote@monaco-editor/angulardo enunciado é do ecossistema React; o equivalente Angular éngx-monaco-editor-v2. - Auth: hoje o
userIdé fixo (1). Adicionar Spring Security + JWT. - Migrations: trocar
ddl-auto: updatepor Flyway usandodocs/schema.sql. - Endpoints de problemas: expor
GET /api/problemse ligar oProblemServicedo frontend ao backend (hoje usa mock local).