📋 Changelog — TecLoja 01
Histórico de todas as alterações feitas nos tutoriais e no código-fonte do projeto.
[2.2.0] — 2026-06-09
🐛 Correções de Bugs (Código vs Tutorial)
Auditoria completa comparando cada arquivo de código real com os tutoriais correspondentes. Cinco divergências foram identificadas e corrigidas.
BUG #1 — CRÍTICO: springdoc-openapi ausente no pom.xml real
- Arquivo:
backend/pom.xml - Sintoma: O Módulo 05 ensina testes via Swagger UI (
/swagger-ui/index.html), mas a dependênciaspringdoc-openapi-starter-webmvc-uinão estava nopom.xmlreal, apenas no tutorial (modulo02.md). O Swagger UI simplesmente não seria gerado. - Correção: Adicionada a dependência ao
backend/pom.xml:<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.3.0</version> </dependency>
BUG #2 — CRÍTICO: SecurityConfig.java não liberava rotas do Swagger UI
- Arquivo:
backend/src/main/java/.../config/SecurityConfig.java - Sintoma: Com
springdocadicionado, as rotas/swagger-ui/**e/v3/api-docs/**retornariam 403 Forbidden porque não estavam na listapermitAll()da configuração real, embora o tutorial (modulo05.md) mostrasse essas rotas liberadas. - Correção: Adicionadas as rotas ao
requestMatchers().permitAll():.requestMatchers("/api/v1/auth/login", "/h2-console/**", "/swagger-ui/**", "/v3/api-docs/**").permitAll()
BUG #3 — CRÍTICO: Interceptor HTTP do mobile não criado nem registrado
- Arquivos:
mobile/src/app/interceptors/auth.interceptor.ts(não existia),mobile/src/main.ts - Sintoma: O Módulo 11 ensina a criar e usar um
HttpInterceptorFnpara injetar o token JWT Bearer em todas as requisições do app mobile. Porém o arquivoauth.interceptor.tsnão existia no projeto e omain.tsusavaprovideHttpClient()semwithInterceptors, descartando silenciosamente o token em cada requisição HTTP autenticada. - Correção:
- Criado
mobile/src/app/interceptors/auth.interceptor.tscom a lógica de injeção de token viafrom(getToken()).pipe(switchMap(...)) - Atualizado
mobile/src/main.tspara usarprovideHttpClient(withInterceptors([authInterceptor]))
- Criado
BUG #4 — MODERADO: spring.application.name divergente
- Arquivo:
modulo02.md(seção application.properties) - Sintoma: O tutorial mostrava
spring.application.name=backendmas o arquivo real usaspring.application.name=tecloja-api. Embora o impacto seja baixo (apenas o nome nos logs), gera confusão ao aluno que copia o tutorial. - Correção: Tutorial atualizado para
spring.application.name=tecloja-api.
BUG #5 — MENOR: Status do pedido "FATURADO" vs "PAGO" no tutorial
- Arquivo:
modulo05.md(Roteiro de Teste 2, item B) - Sintoma: O checkpoint do módulo 05 descrevia que a resposta esperada teria
status: "FATURADO", masPedidoServiceImpl.javadefinepedido.setStatus("PAGO"). O aluno esperaria ver “FATURADO” e veria “PAGO”. - Correção: Tutorial atualizado para mostrar
"PAGO"e o código HTTP correto201 Created(em vez de200 OK).
✅ Verificações Confirmadas (sem alteração necessária)
| Item verificado | Resultado |
|---|---|
web/src/main.ts — import 'zone.js' presente |
✅ OK |
web/cypress/e2e/jornada-compras.cy.ts — seletor .navbar |
✅ OK (class existe em app.component.ts) |
web/cypress/e2e/jornada-compras.cy.ts — seletor .product-card |
✅ OK (class existe em catalogo.component.ts) |
web/src/app/components/login/login.component.ts — button[type="submit"] |
✅ OK |
DataSeeder.java — credenciais usuario@email.com / usuario123 |
✅ OK |
PedidoServiceImplTest.java — usa "Usuário Padrão" e usuario@email.com |
✅ OK |
mobile/src/main.ts — defineCustomElements(window) para câmera PWA |
✅ OK |
backend/schema.sql — estrutura de tabelas consistente com as entidades JPA |
✅ OK |
web/src/app/services/auth.service.ts — envia { username, senha } (não password) |
✅ OK |
mobile/src/app/services/auth.service.ts — usa Capacitor Preferences para persistência |
✅ OK |
[2.4.0] — 2026-06-09
🐛 Correções de Bugs (Lote 3 — Testes Reais de Compilação)
Rodada de testes reais executando ./mvnw clean test no backend e npx ng build no frontend. Três problemas adicionais identificados e corrigidos.
BUG #16 — CRÍTICO: CarrinhoComponent ausente no tutorial → app não compila
- Arquivo:
modulo08.md - Sintoma: O
app.routes.tsdo Módulo 06 declara uma rotacarrinhoque carregaCarrinhoComponentvia lazy loading. O Módulo 08 ensina oCarrinhoServicemas nunca mostra como criar oCarrinhoComponent. Qualquer aluno que tentasse compilar o projeto após o Módulo 08 teria um erro de módulo não encontrado (Cannot find module './components/carrinho/carrinho.component'). - Correção: Adicionada Seção 2 no Módulo 08 com o
CarrinhoComponentcompleto: lista de itens com *ngFor, subtotal por item, total viacomputed(), erro do RFC 7807 e botão de checkout comloadingSignal.
BUG #17 — MODERADO: Bootstrap Icons não incluído no tutorial do index.html
- Arquivo:
modulo06.md - Sintoma: O
app.component.tsreal e os componentes do Módulo 08 usam classes<i class="bi bi-...">do Bootstrap Icons. A biblioteca não está listada nopackage.json(é carregada via CDN), mas o tutorial nunca mostrava como modificar oindex.htmlpara incluir o link CDN. Os ícones não seriam exibidos para alunos que seguissem o tutorial. - Correção: Adicionado o bloco completo do
index.htmlcom CDN do Bootstrap Icons e Google Fonts (Inter + Outfit) na seção de criação do projeto do Módulo 06.
BUG #18 — CRÍTICO: CatalogoComponent sem classe product-card → Cypress test falha
- Arquivo:
modulo08.md(template do CatalogoComponent) - Sintoma: O teste Cypress do Módulo 13 usa
cy.get('.product-card')para verificar que produtos foram carregados. O tutorial doCatalogoComponentusavaclass="glass-panel"sem adicionarproduct-card. Qualquer aluno que digitasse o código do tutorial teria o teste E2E falhando com “Expected to find elements matching: ‘.product-card’”. - Correção: Classe alterada para
class="glass-panel product-card".
BUG #19 — MENOR: Números de seção do Módulo 08 desatualizados após inserção
- Arquivo:
modulo08.md - Sintoma: Com a inserção da Seção 2 (
CarrinhoComponent), as antigas seções 2 (Catálogo) e 3 (CRUD Admin) ficaram com numeração incorreta. - Correção: Renumeradas para Seção 4 (Catálogo) e Seção 5 (CRUD Admin).
✅ Verificações por Compilação Real
| Teste executado | Resultado |
|---|---|
./mvnw clean test — 6 testes backend (5 PedidoServiceImpl + 1 context) |
✅ BUILD SUCCESS, 0 falhas |
npx ng build --configuration=development — Angular web |
✅ Build OK, apenas warnings de Cypress no tsconfig |
grep backend.render.com modulo*.md — nenhum URL de prod no código |
✅ Limpo |
grep /api/[^v] modulo*.md — todos os endpoints com prefixo /v1/ |
✅ Correto |
[2.3.0] — 2026-06-09
🐛 Correções de Bugs (Lote 2 — Auditoria Completa Módulos 01–09)
Segunda rodada de auditoria comparando cada arquivo de código real com os tutoriais. Nove divergências adicionais foram identificadas e corrigidas.
BUG #6 — CRÍTICO: ProdutoDTO sem campo boolean ativo → falha de compilação
- Arquivo:
modulo03.md(seção DTOs de Produto) - Sintoma: O
ProdutoDTOdo tutorial não tinha o campoboolean ativo, masProdutoMapper.toDTO()e o arquivo realProdutoDTO.javaincluem esse campo. Qualquer aluno que copiasse o tutorial teria um erro de compilação (argument mismatch) ao criar o Mapper no passo seguinte. - Correção: Campo
boolean ativoadicionado aoProdutoDTOentreint estoqueeLong categoriaId.ProdutoMapper.toDTO()atualizado para passarproduto.isAtivo().
BUG #7 — CRÍTICO: PedidoServiceImpl sem validação de produto inativo → teste JUnit falha
- Arquivo:
modulo04.md(seção PedidoServiceImpl) - Sintoma: O tutorial não incluía a verificação
if (!produto.isAtivo())antes da checagem de estoque. O arquivo real tem esse bloco. O testerealizarPedido_ProdutoInativoemPedidoServiceImplTest.javafalharia para o aluno que seguisse o tutorial. Além disso, o tutorial usava a instanciação manual doLogger(SLF4J) enquanto o código real usa@Slf4jdo Lombok. - Correção: Bloco de verificação de produto inativo adicionado. Importações atualizadas para
@Slf4jcom Lombok.
BUG #8 — CRÍTICO: auth.service.ts com URL de produção errada e sem prefixo /v1/
- Arquivo:
modulo07.md(seção auth.service.ts) - Sintoma: O tutorial hardcodava a URL de produção
https://backend.render.com/api/auth(que não existe mais) em vez da URL local de desenvolvimento. Mesmo que trocasse pela URL correta, ainda faltava o prefixo/v1/. - Correção: URL alterada para
http://localhost:8080/api/v1/auth.
BUG #9 — MODERADO: auth.interceptor.ts sem barra inicial na checagem da URL
- Arquivo:
modulo07.md(seção auth.interceptor.ts) - Sintoma: O tutorial usava
req.url.includes('api/')sem a barra inicial. O arquivo real usareq.url.includes('/api/'). Sem a barra inicial, URLs comohttps://viacep.com.br/api/...receberiam erroneamente o token JWT. - Correção: Checagem alterada para
req.url.includes('/api/').
BUG #10 — CRÍTICO: carrinho.service.ts e componentes com URLs de produção erradas
- Arquivo:
modulo08.md(CarrinhoService, CatalogoComponent, AdminProdutosComponent, ProdutoFormComponent) - Sintoma: Sete ocorrências de
https://backend.render.com/api/produtose uma dehttps://backend.render.com/api/pedidosno tutorial. Todos os componentes do Módulo 08 usavam a URL de produção sem/v1/. - Correção: Todas as ocorrências substituídas por
http://localhost:8080/api/v1/produtosehttp://localhost:8080/api/v1/pedidos.
BUG #11 — MODERADO: GlobalExceptionHandler divergia do código real
- Arquivo:
modulo03.md(seção GlobalExceptionHandler) - Sintoma: O tutorial usava
Instant.now()(UTC), semHttpServletRequest requestnos métodos, sem propriedade"path"no ProblemDetail e usava"errors"em vez de"validationErrors"no handler de validação. O código real usaLocalDateTime.now(), recebeHttpServletRequest, inclui"path"e usa"validationErrors". - Correção: Handler completamente atualizado para corresponder ao código real.
BUG #12 — MODERADO: Pedido.java sem updatable = false na coluna data_pedido
- Arquivo:
modulo01.md(seção Pedido.java) - Sintoma: O tutorial mostrava
@Column(name = "data_pedido", nullable = false)semupdatable = false. O código real incluiupdatable = falsepara garantir que a data de criação do pedido nunca seja modificada por um UPDATE acidental no JPA. - Correção:
updatable = falseadicionado ao@Column.
BUG #13 — MENOR: Categoria.java com imports não utilizados
- Arquivo:
modulo01.md(seção Categoria.java) - Sintoma: O tutorial incluía
import java.util.ArrayList;eimport java.util.List;na classeCategoria, mas a classe não tem nenhum campo de coleção — esses imports são completamente desnecessários e geram avisos de compilação. - Correção: Imports removidos.
BUG #14 — MENOR: produto.model.ts sem campo ativo
- Arquivo:
modulo06.md(seção produto.model.ts) - Sintoma: A interface TypeScript
Produtonão incluía o campoativo?: boolean, embora o backend retorne esse campo no JSON e o arquivo realproduto.model.tso declare. - Correção: Campo
ativo?: booleanadicionado entreestoqueecategoriaId.
BUG #15 — MENOR: URLs de teste sem prefixo /v1/ no checklist do Módulo 09
- Arquivo:
modulo09.md(checklist de validação) - Sintoma: A rubrica de testes usava
http://localhost:8080/api/pedidose/api/auth/loginsem o prefixo/v1/. - Correção: URLs corrigidas para
/api/v1/pedidose/api/v1/auth/login.
[2.1.0] — 2026-06-06 (sessão anterior)
✨ Melhorias de Conteúdo — Módulos 06 a 13
Adicionado o padrão de qualidade pedagógica (Pré-Requisitos / WHY / Checkpoint / Erros Comuns) nos módulos 06–13, completando a cobertura iniciada nos módulos 00–05.
modulo06.md— Pré-Requisitos, Por que--ssr=false, Checkpoint, Erros Comunsmodulo07.md— Pré-Requisitos, Por quelocalStorage, Checkpoint, Erros Comunsmodulo08.md— Pré-Requisitos, Por quecomputed(), NOTE sobreclienteIdhardcoded, Checkpoint, Erros Comunsmodulo09.md— Pré-Requisitos, Tabela de Secrets CI/CD, Checkpoint, Erros Comunsmodulo10.md— Pré-Requisitos, Por que Ionic vs React Native/Flutter, Checkpoint, Erros Comunsmodulo11.md— Pré-Requisitos, Por que Capacitor Preferences vs localStorage, Checkpoint, Erros Comunsmodulo12.md— Pré-Requisitos, Por que Capacitor vs código nativo, Checkpoint, Erros Comunsmodulo13.md— Pré-Requisitos, Por que Cypress E2E vs unitários, Checkpoint, Erros Comuns
[2.0.0] — 2026-06-05 (sessão anterior)
🔑 Migração de Credenciais
Todas as credenciais do usuário padrão foram migradas de maria@gmail.com/maria123 para usuario@email.com/usuario123 nos seguintes arquivos de código e documentação:
| Arquivo | Tipo de alteração |
|---|---|
backend/src/main/java/.../config/DataSeeder.java |
Código Java |
backend/src/test/java/.../PedidoServiceImplTest.java |
Teste JUnit |
web/src/app/services/carrinho.service.ts |
Comentário TypeScript |
modulo02.md, modulo05.md, modulo09.md |
Documentação |
🐛 Correções de Bugs (Lote 1)
modulo05.md— campo"password"corrigido para"senha"no body do Swaggermodulo02.md— dependênciaspringdoc-openapiadicionada ao bloco pom.xml do tutorialmodulo03.md—CategoriaDTOadicionado com explicação WHY (era referenciado no Mod05 mas ausente)index.md— bloco duplicado de front-matter YAML removido
✨ Melhorias de Conteúdo — Módulos 00 a 05
docs/modulo_setup.md— expandido para Linux/macOS, adicionado Ionic CLI (Seção 4)docs/erros_frequentes.md— criado do zero com 25+ erros categorizadosmodulo00.md— link paramodulo_setup.htmladicionadomodulo01.mdamodulo05.md— Pré-Requisitos, WHY, Checkpoint, Erros Comuns adicionados
[1.0.0] — Versão Inicial
Projeto TecLoja 01 lançado como material didático para as disciplinas de Engenharia de Software e Banco de Dados.
Componentes incluídos
- Backend: Java 17 + Spring Boot 3.2.5, JPA/Hibernate, H2 (dev), PostgreSQL/Neon (prod), JWT (jjwt 0.11.5), Lombok
- Frontend Web: Angular 18+, Standalone Components, Signals, Interceptors funcionais, Guard funcional, Cypress E2E
- Mobile: Ionic + Capacitor, Angular Standalone, Capacitor Preferences, Capacitor Camera, PWA Elements
- DevOps: GitHub Actions CI/CD, Docker multi-stage, Render (API), Netlify (SPA)
- Documentação: 14 módulos (modulo00–modulo13) + docs/modulo_setup.md + docs/erros_frequentes.md