O EasyFood é um MVP acadêmico para consultar e cadastrar restaurantes. A interface permite pesquisar por nome ou categoria, filtrar a listagem e cadastrar estabelecimentos com validação dos dados.
Nesta sprint, a API foi padronizada com as rotas em inglês e evoluiu do armazenamento temporário em memória para persistência em MySQL. O front-end e as validações existentes foram preservados, enquanto GET e POST passaram a utilizar um repository com consultas parametrizadas.
- Node.js
- Express
- MySQL 8
- Prisma ORM
- Prisma Client
- dotenv
- HTML, CSS e JavaScript
Arquitetura anterior:
Front-end → API Node.js/Express → array em memória
Arquitetura atual, organizada como monólito modular:
Front-end → Routes → Controller → Service → Repository → Prisma ORM → MySQL
O domínio de restaurantes está isolado em src/modules/restaurants. O futuro domínio de autenticação está planejado em src/modules/auth, mas ainda não possui código executável. Cada camada possui uma responsabilidade:
server.js: inicia o servidor HTTP.src/app.js: configura o Express e registra os módulos.restaurantRoutes.js: define as rotas GET e POST.restaurantController.js: recebereq, chama o service e montares.restaurantService.js: concentra as regras de negócio e validações.restaurantRepository.js: acessa o MySQL por meio do Prisma.src/config/database.js: configura o Prisma Client.
src/
├── app.js
├── config/
│ └── database.js
└── modules/
├── auth/
│ └── README.md
└── restaurants/
├── restaurantRoutes.js
├── restaurantController.js
├── restaurantService.js
└── restaurantRepository.js
- Node.js instalado.
- MySQL 8 instalado e em execução.
- Um usuário local do MySQL com permissão para criar o banco
easyfoode suas tabelas.
No PowerShell, acesse a pasta do projeto e execute:
npm installCrie o .env a partir do exemplo:
Copy-Item ".env.example" ".env"
notepad ".env"Preencha as configurações locais:
PORT=3000
DATABASE_URL="mysql://usuario:senha@localhost:3306/easyfood"Nunca versione o .env nem coloque credenciais reais no .env.example. Caracteres especiais no usuário ou na senha devem ser codificados para uso em URL.
O Prisma foi configurado por introspecção da tabela restaurants já existente. Para atualizar o modelo a partir do banco e gerar o Client:
npm run prisma:pull
npm run prisma:generateEm um ambiente novo, crie primeiro o banco e a tabela executando database/schema.sql pelo MySQL Workbench. Esse arquivo foi preservado como referência histórica e não é executado automaticamente pelo Prisma.
O mecanismo oficial de seed é prisma/seed.js:
npm run db:seedO seed consulta a chave única formada por nome, endereço e telefone antes de criar cada restaurante inicial. Ele não atualiza restaurantes existentes, não duplica dados e não consome IDs quando os oito registros já existem.
O comando abaixo gera o Client e executa o seed em sequência:
npm run db:setupnpm startDepois, abra http://localhost:3000 no navegador.
Retorna todos os restaurantes armazenados no MySQL, ordenados por ID. Uma resposta bem-sucedida usa o status HTTP 200.
Exemplo:
Invoke-RestMethod -Uri "http://localhost:3000/restaurants" -Method GetValida e cadastra um restaurante no MySQL. A avaliação inicial é opcional, aceita valores entre 0 e 5 com no máximo uma casa decimal e assume 0 quando não é informada. Um cadastro válido recebe um ID automático e retorna o status HTTP 201. Dados inválidos retornam o status HTTP 400 com os erros encontrados.
Exemplo:
$restaurante = @{
name = "Sabor da Vila"
category = "Pizza"
description = "Pizzas artesanais feitas com ingredientes selecionados."
address = "Rua das Acacias, 150 - Centro"
phone = "(11) 99999-1234"
rating = 4.5
} | ConvertTo-Json
Invoke-RestMethod `
-Uri "http://localhost:3000/restaurants" `
-Method Post `
-ContentType "application/json" `
-Body $restauranteOs restaurantes são armazenados na tabela restaurants do MySQL. Diferentemente da arquitetura anterior com array em memória, os cadastros continuam disponíveis quando o processo Node.js é encerrado e iniciado novamente.
Para testar a persistência manualmente:
- Inicie a aplicação e cadastre um restaurante válido.
- Confirme que ele aparece em
GET /restaurantse no front-end. - Encerre o processo Node.js.
- Execute
npm startnovamente. - Repita o GET e confirme que o registro continua disponível.
O projeto disponibiliza somente GET e POST nesta etapa. PUT e DELETE ainda não fazem parte da API.
O repository utiliza Prisma para findMany, findUnique e create, mantendo o server.js independente dos detalhes do banco. Os arquivos em database/ preservam o schema e o seed SQL anteriores como documentação histórica. SQL direto poderá ser usado futuramente apenas em consultas que realmente exijam recursos específicos, de forma isolada, parametrizada e documentada.
As páginas de listagem e cadastro usam a mesma moldura de celular no desktop: 390px de largura, 844px de altura, borda de 8px e cantos de 42px. O conteúdo possui uma única rolagem interna, mantendo a moldura fixa quando novos restaurantes são exibidos. Em telas de até 430px, a interface ocupa toda a largura e a altura disponível do dispositivo, sem borda ou cantos arredondados.
Os testes automatizados das regras de negócio podem ser executados com:
npm test- ADR-001 - Armazenar restaurantes em memória
- ADR-002 - Adotar MySQL para persistência
- ADR-003 - Adotar Prisma como ORM
- ADR-004 - Organizar o EasyFood como monólito modular
- ADR-005 - Planejar autenticação com AWS Cognito
- Pesquisa de alternativas de autenticação
- Hipótese de evolução da persistência
O
.envcontém configurações locais e nunca deve ser versionado. O arquivo.env.exampledeve conter somente valores de exemplo, sem senhas reais.