9.1. Arquitetura da Aplicação

A API Trace Point adota uma arquitetura em camadas (Layered Architecture), um padrão comum para aplicações backend robustas e manuteníveis. Esta abordagem promove a separação de responsabilidades, facilitando o desenvolvimento, testes e a evolução do sistema. As principais camadas são:

Fluxo de uma Requisição (Exemplo Simplificado):

  1. O cliente envia uma requisição HTTP para um endpoint da API.
  2. O Express.js recebe a requisição e a encaminha para a Rota correspondente.
  3. Middlewares de rota (ex: autenticação) são executados.
  4. A Rota chama o método apropriado no Controller.
  5. O Controller valida os dados de entrada (usando DTOs) e chama o Serviço.
  6. O Serviço executa a lógica de negócios, possivelmente chamando um ou mais Repositórios.
  7. O Repositório interage com o banco de dados (via TypeORM) para ler ou escrever dados.
  8. Os dados (ou um status de sucesso/erro) retornam pela mesma cadeia: Repositório -> Serviço -> Controller.
  9. O Controller formata a resposta e a envia de volta ao cliente.
  10. Se ocorrer um erro em qualquer ponto, ele pode ser capturado e tratado pelo middleware de Erros global.

9.2. Estrutura de Pastas Detalhada

A organização de pastas e arquivos principais do projeto é a seguinte:

Trace_Point/
├── .env                       # Variáveis de ambiente (local, não versionado)
├── .env.copy                  # Arquivo de exemplo para .env
├── .dockerignore              # Especifica arquivos a serem ignorados pelo Docker
├── docker-compose.yml         # Define e orquestra os serviços Docker (app, banco, etc.)
├── Dockerfile                 # Instruções para construir a imagem Docker da aplicação
├── package.json               # Metadados do projeto, dependências e scripts NPM
├── tsconfig.json              # Configurações do compilador TypeScript
├── README.md                  # Documentação principal do projeto (Markdown)
└── src/                       # Código fonte da aplicação
    ├── index.ts               # Ponto de entrada principal da aplicação, inicia o servidor
    ├── server.ts              # Configuração do servidor Express e inicialização do AppDataSource
    │
    ├── config/
    │   └── EsportEnv.ts       # Carrega e exporta variáveis de ambiente da aplicação
    │
    ├── controllers/           # Camada de controle (lida com requisições HTTP e envia respostas)
    │   ├── AuthController.ts    # Controller para autenticação (login, refresh token)
    │   ├── EventController.ts   # Controller para gerenciar operações de Eventos
    │   ├── PlaceController.ts   # Controller para gerenciar operações de Locais
    │   ├── UserController.ts    # Controller para gerenciar operações de Usuários
    │   └── VisitedController.ts # Controller para gerenciar operações de Visitas a Locais
    │
    ├── DTO/                   # Data Transfer Objects (definem a estrutura dos dados de entrada/saída da API)
    │   ├── wrappersDTO/       # DTOs para estruturas de dados aninhadas ou específicas
    │   │   ├── AddressDTO.ts  # DTO para dados de endereço
    │   │   └── LoginInfoDTO.ts# DTO para dados de login (email, senha)
    │   ├── BookingDTO.ts      # DTO para agendamento de usuário em evento
    │   ├── EventDTO.ts        # DTO para criação/atualização de Eventos
    │   ├── PlaceDTO.ts        # DTO para criação/atualização de Locais
    │   ├── UserDTO.ts         # DTO para criação/atualização de Usuários
    │   └── VisitedDTO.ts      # DTO para registro/atualização de Visitas
    │
    ├── error/                 # Classes e manipuladores de erro customizados
    │   ├── ErrorsHandler.ts   # Middleware global para tratamento de erros
    │   └── HttpException.ts   # Classe base para exceções HTTP customizadas
    │
    ├── middleware/            # Middlewares Express para diversas funcionalidades
    │   ├── ErrorsHandler.ts   # (Arquivo do middleware de erro)
    │   ├── JwtRequired.ts     # Middleware para exigir autenticação JWT
    │   ├── RoleCheck.ts       # Middleware para verificação de papéis de usuário
    │   └── ValidateId.ts      # Middleware para validar formato de IDs
    │
    ├── migrations/            # Arquivos de migração de banco de dados (TypeORM)
    │
    ├── models/                # Entidades do banco de dados (TypeORM) e Enums
    │   ├── enum/              # Enumerações
    │   │   ├── PlaceType.ts   # Enum para os tipos de Local
    │   │   └── UserRole.ts    # Enum para os papéis de Usuário
    │   ├── wrappers/          # Classes embutidas para modelos
    │   │   ├── Address.ts     # Classe/entidade embutida para Endereço
    │   │   └── LoginInfo.ts   # Classe/entidade embutida para Informações de Login
    │   ├── Event.ts           # Entidade Evento
    │   ├── Place.ts           # Entidade Local
    │   ├── User.ts            # Entidade Usuário
    │   └── VisitedPlaces.ts   # Entidade para Locais Visitados
    │
    ├── repositories/          # Camada de acesso a dados (TypeORM Repositories)
    │   ├── EventRepository.ts   # Exemplo: Repositório para Evento
    │   ├── PlaceRepository.ts   # Exemplo: Repositório para Local
    │   ├── UserRepository.ts    # Exemplo: Repositório para Usuário
    │   └── VisitedRepository.ts # Exemplo: Repositório para Visitas
    │
    ├── routes/                # Definição das rotas da API
    │   ├── AuthRoutes.ts      # Rotas de autenticação
    │   ├── EventRoutes.ts     # Rotas de Eventos
    │   ├── PlaceRoutes.ts     # Rotas de Locais
    │   ├── UserRoutes.ts      # Rotas de Usuários
    │   └── VisitedRoutes.ts   # Rotas de Visitas
    │
    ├── service/               # Camada de serviço (lógica de negócios)
    │   ├── AuthService.ts     # Serviço de autenticação
    │   ├── EventService.ts    # Serviço de Eventos
    │   ├── PlaceService.ts    # Serviço de Locais
    │   ├── UserService.ts     # Serviço de Usuários
    │   └── VisitedService.ts  # Serviço de Visitas
    │
    ├── utils/                 # Funções e classes utilitárias
    │   ├── ExistsValidator.ts # Validador de existência
    │   ├── TokenManager.ts    # Gerenciador de tokens JWT
    │   └── ValidateRequestBody.ts # Validador de corpo de requisição
    │
    ├── db_config/
    │   └── AppDataSource.ts   # Configuração da fonte de dados TypeORM
    │
    └── @types/                # Arquivos de definição de tipos TypeScript
        └── express/
            └── index.d.ts     # Extensões de tipo para o Express (ex: req.user)

Para uma exploração mais detalhada dos arquivos, navegue pelo repositório no GitHub.