Desafio de Estágio Back-end Spring Boot com Magalu
Construa dois endpoints RESTful com Java e PostgreSQL baseados em um desafio técnico real para iniciantes.
Por que isso é importante
Enfrentar desafios técnicos é essencial para conquistar seu primeiro estágio em back-end. Ao resolver esse teste real da Magalu com Java, você pratica arquitetura em camadas, uso de banco de dados, criação de endpoints REST e ainda compreende como estruturar APIs pensadas para o trabalho em equipe.
O Contexto do Desafio
O Magalu deseja desenvolver uma plataforma de comunicação em Sprints. O desafio é criar uma API back-end capaz de registrar agendamentos de envios de mensagens através de e-mail, WhatsApp, SMS ou push. Seu objetivo é estruturar dois endpoints principais: um para cadastrar a solicitação e outro para consultar o status.
Requisitos Técnicos
Estrutura do Projeto
O projeto foi criado com Spring Initializr, incluindo as dependências: Spring Web, Spring Data JPA, PostgreSQL Driver, Lombok, Validation e DevTools. A arquitetura segue o padrão Model → Repository → Service → Controller.
Modelagem da Entidade
Criamos a entidade Agendamento com os campos: id, destinatário, mensagem, tipo de comunicação (enum), data/hora de envio, status do agendamento (enum) e data de criação. As enums foram modeladas para refletir os tipos (EMAIL, SMS, PUSH, WHATSAPP) e status (AGENDADO, ENVIADO, CANCELADO).
DTOs para Solicitação e Resposta
Utilizamos DTOs para separar o modelo de entidade das trocas de dados. O AgendamentoRequest carrega apenas os dados necessários no POST com validações usando Bean Validation para atributos obrigatórios e datas futuras. Já o AgendamentoResponse devolve dados ao cliente após cadastramento ou consulta.
Camada de Repository
A interface AgendamentoRepository estende JpaRepository para permitir persistência automática da entidade. Isso facilita encontrar por ID e salvar agendamentos sem código de SQL manual.
Implementamos a Service
A classe AgendamentoService centraliza a lógica de negócio como transformar o DTO em entidade, preencher os campos de auditoria, validar se a data de envio é futura e persistir via repository. Isso isola regras de negócio da camada de controle.
Criação dos Endpoints no Controller
Em AgendamentoController, definimos as rotas: POST /agendamentos para cadastrar e GET /agendamentos/{id} para consultar. O controller delega para o service garantindo responsabilidade única.
Validações e Segurança dos Dados
Usamos anotações como @NotBlank, @NotNull e @Future diretamente nos DTOs, garantindo consistência da entrada antes de chegar ao banco. Isso ajuda a reduzir erros e garantir que os dados entregues tenham significado.
⚠️Atenção
Ao trabalhar com data/hora, sempre valide se seu servidor está em UTC ou timezone local para evitar bugs de agendamentos que já passaram.
Diferenciais Visando Equipe e Escalabilidade
A arquitetura em camadas permite que outros desenvolvedores estendam o sistema com novos canais de envio ou regras sem reescrever a lógica atual. O banco preparado e os enums evitam retrabalho posterior.
Ferramentas Utilizadas
ℹ️Dica Importante
Utilize Spring Initializr para gerar projetos rapidamente com as dependências pré-selecionadas. Otimiza seu tempo e mantém suas builds organizadas.
Próximos Passos
No próximo vídeo, serão implementados os testes unitários para validar os endpoints com JUnit. Isso tornará a aplicação pronta para testes automatizados, garantindo confiança na evolução do sistema.