app/
├── src/
│ ├── controllers/ # Lógica de tratamento de requisições HTTP
│ │ ├── delete-user/ # Controller para deletar usuários
│ │ ├── get-users/ # Controller para listar usuários
│ │ ├── post-user/ # Controller para criar usuários
│ │ ├── update-user/ # Controller para atualizar usuários
│ │ ├── protocols.ts # Tipos e interfaces compartilhados
│ │ └── helpers.ts # Funções auxiliares para respostas HTTP
│ ├── database/
│ │ └── mongo.ts # Configuração da conexão com MongoDB
│ ├── factories/ # Fábricas para injetar dependências
│ │ ├── delete-user-factory/
│ │ ├── get-users-factory/
│ │ ├── post-user-factory/
│ │ └── update-user-factory/
│ ├── models/ # Modelos de dados
│ │ └── user.ts # Modelo de usuário
│ ├── repositories/ # Camada de acesso a dados
│ │ ├── delete-user-repository/
│ │ ├── get-users-repository/
│ │ ├── post-user-repository/
│ │ └── update-user-repository/
│ └── index.ts # Ponto de entrada da aplicação
├── .gitignore
├── eslint.config.mjs # Configuração do ESLint
├── package.json
├── tsconfig.json # Configuração do TypeScript
└── yarn.lock
- Node.js: Ambiente de execução JavaScript
- Express: Framework para construção da API
- TypeScript: Tipagem estática para JavaScript
- MongoDB: Banco de dados NoSQL
- Bcrypt: Para hash de senhas
- Validator: Para validação de e-mails
- ESLint: Padronização de código
Resposta de Sucesso:
{
"statusCode": 200,
"body": [
{
"id": "123",
"name": "João Silva",
"email": "joao@example.com"
}
]
}
Parâmetros:
- Nome: Nome do usuario
- Senha: Senha de acesso
- Email: email do usuario
{
"name": "Maria Souza",
"email": "maria@example.com",
"password": "senha123"
}
Resposta de Sucesso:
{
"statusCode": 201,
"body": "Usuário criado com sucesso"
}
- id: ID do usuário a ser atualizado
Corpo da Requisição:
{
"name": "Maria Souza Silva"
}
Resposta de Sucesso:
{
"statusCode": 200,
"body": "Usuário atualizado com sucesso"
}
- id: ID do usuário a ser deletado
{
"statusCode": 200,
"body": "Usuário removido com sucesso"
}
export const getUsersFactory = () => {
const MongoGetusersRepository = new mongoGetusersRepository();
const GetUsersController = new getUsersController(MongoGetusersRepository);
return GetUsersController;
};
- Separação de Responsabilidades Controllers: Tratam a lógica HTTP
- Controllers: Tratam a lógica HTTP
- Repositories: Gerenciam o acesso ao banco de dados
- Models: Definem a estrutura dos dados
- Helpers: Funções utilitárias compartilhadas
- Padronização de Respostas Helpers padronizam as respostas HTTP:
export const ok = (message: string | user[]) => {
return {
statusCode: HttpStatusCode.OK,
body: message
};
};
- Rota (index.ts) recebe requisição
- Factory cria controller com repositório injetado
- Controller processa requisição
- Repository interage com o banco de dados
- Controller retorna resposta padronizada
src/database/mongo.ts
const url = process.env.MONGO_URL || "localhost:27017";
const username = process.env.MONGO_USERNAME;
const password = process.env.MONGO_PASSWORD;
.env necessário (não versionado):
MONGO_URL=
MONGO_USERNAME=
MONGO_PASSWORD=