API REST para gerenciamento de usuários, construída com Node.js, Express e Prisma.
- Node.js — runtime JavaScript
- Express — framework HTTP
- Prisma — ORM com banco de dados SQLite
- bcrypt — criptografia de senhas
- Zod — validação de dados
- dotenv — variáveis de ambiente
- nodemon — reload automático em desenvolvimento
- Node.js 18+
- npm
# Clone o repositório
git clone <url-do-repositorio>
cd user-api
# Instale as dependências
npm install
# Configure as variáveis de ambiente
cp .env.example .env
# Execute a migration do banco de dados
npx prisma migrate dev --name init
# Inicie o servidor em modo desenvolvimento
npm run devCrie um arquivo .env na raiz do projeto:
DATABASE_URL="file:./dev.db"
PORT=3000| Script | Descrição |
|---|---|
npm start |
Inicia o servidor em produção |
npm run dev |
Inicia o servidor com nodemon (reload automático) |
npm run migrate |
Executa migrations do Prisma |
user-api/
├── prisma/
│ └── schema.prisma # Definição do modelo de dados
├── src/
│ ├── controllers/
│ │ └── userController.js # Handlers das rotas
│ ├── middlewares/
│ │ └── validateUser.js # Validação com Zod
│ ├── routes/
│ │ └── userRoutes.js # Definição das rotas
│ ├── services/
│ │ └── userService.js # Regras de negócio
│ └── app.js # Configuração do Express
├── server.js # Ponto de entrada
├── .env # Variáveis de ambiente
└── package.json
model User {
id String @id @default(uuid())
nome String
email String @unique
senha String
status String @default("ativo")
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}A senha nunca é retornada nas respostas da API. A exclusão é lógica: o campo
deletedAté preenchido, o registro não é removido do banco.
POST /users
Body:
{
"nome": "João Silva",
"email": "joao@email.com",
"senha": "minhasenha123"
}Resposta 201:
{
"id": "uuid",
"nome": "João Silva",
"email": "joao@email.com",
"status": "ativo",
"deletedAt": null,
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:00.000Z"
}GET /users
Retorna todos os usuários ativos (não excluídos logicamente).
Resposta 200:
[
{
"id": "uuid",
"nome": "João Silva",
"email": "joao@email.com",
"status": "ativo",
"deletedAt": null,
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:00.000Z"
}
]GET /users/:id
Resposta 200:
{
"id": "uuid",
"nome": "João Silva",
"email": "joao@email.com",
"status": "ativo",
"deletedAt": null,
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:00.000Z"
}PUT /users/:id
Todos os campos são opcionais. Apenas nome, email, senha e status são aceitos.
Body:
{
"nome": "João Atualizado",
"email": "novo@email.com",
"senha": "novasenha456",
"status": "inativo"
}Resposta 200:
{
"id": "uuid",
"nome": "João Atualizado",
"email": "novo@email.com",
"status": "inativo",
"deletedAt": null,
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:00.000Z"
}DELETE /users/:id
O usuário não é removido do banco — apenas o campo deletedAt é preenchido com a data atual.
Resposta 200:
{
"message": "User deleted successfully",
"user": {
"id": "uuid",
"nome": "João Silva",
"email": "joao@email.com",
"status": "ativo",
"deletedAt": "2026-04-01T00:00:00.000Z",
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:00.000Z"
}
}| Código | Situação |
|---|---|
201 Created |
Usuário criado com sucesso |
200 OK |
Consulta, atualização ou exclusão com sucesso |
400 Bad Request |
Dados inválidos ou campos ausentes |
404 Not Found |
Usuário não encontrado |
409 Conflict |
E-mail já cadastrado |
500 Internal Server Error |
Erro inesperado no servidor |
| Campo | Regra |
|---|---|
nome |
Obrigatório, mínimo 3 caracteres |
email |
Obrigatório, formato válido, único no sistema |
senha |
Obrigatória, mínimo 8 caracteres |
| Campo | Regra |
|---|---|
nome |
Opcional, mínimo 3 caracteres |
email |
Opcional, formato válido, único no sistema |
senha |
Opcional, mínimo 8 caracteres |
status |
Opcional, deve ser "ativo" ou "inativo" |
Campos fora do modelo não são aceitos — a requisição retorna
400.
# Criar usuário
curl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{"nome": "João Silva", "email": "joao@email.com", "senha": "minhasenha123"}'
# Listar usuários
curl http://localhost:3000/users
# Buscar por ID
curl http://localhost:3000/users/<id>
# Atualizar usuário
curl -X PUT http://localhost:3000/users/<id> \
-H "Content-Type: application/json" \
-d '{"nome": "Novo Nome"}'
# Excluir usuário
curl -X DELETE http://localhost:3000/users/<id>- A senha é sempre criptografada com
bcrypt(salt rounds: 10) antes de ser salva - A senha nunca é retornada em nenhuma resposta da API
- E-mail duplicado retorna
409 Conflict, tanto no cadastro quanto na atualização - Usuários excluídos logicamente não aparecem na listagem (
GET /users) nem podem ser buscados por ID - As datas
createdAteupdatedAtsão gerenciadas automaticamente pelo Prisma - A exclusão é lógica: o campo
deletedAtrecebe a data atual, preservando o histórico no banco