- Sobre o Projeto
- Tecnologias
- Arquitetura do banco de dados
- Pré-requisitos
- Instalação
- Configuração do Ambiente
- Executando o Projeto
- Docker
- Banco de Dados
- Estrutura do Projeto
- Padrões de Código
- API Endpoints
- Autenticação
- Variáveis de Ambiente
Backend RESTful desenvolvido com Node.js e Express para gerenciar dados de saúde, implementando autenticação JWT e integração com banco de dados PostgreSQL via Prisma ORM.
| Tecnologia | Versão | Propósito |
|---|---|---|
| Node.js | v20.19.4 | Runtime JavaScript |
| npm | 11.6.0 | Gerenciador de pacotes |
| Express.js | - | Framework web |
| TypeScript | - | Tipagem estática |
| Prisma | - | ORM para banco de dados |
| PostgreSQL | - | Banco de dados |
| JWT | - | Autenticação |
| bcryptjs | - | Criptografia de senhas |
| Docker | - | Containerização |
| CORS | - | Compartilhamento de recursos |
| dotenv | - | Gestão de variáveis de ambiente |
| python | - | Para configurar o venv |
- Node.js v20.19.4 ou superior
- npm 11.6.0 ou superior
- Docker e Docker Compose (para execução containerizada)
- Git para versionamento
-
Node.js e npm v20.19.4 ou superior
- Windows - NodeJS Download
- Mac -
brew install node@24 - Linux/ubuntu -
brew install node@24
-
Docker e Docker Compose (para execução containerizada)
- Windows - utilizar Docker Desktop
- Mac - Docker Engine
- Linux/ubuntu - Docker Engine
-
Git para versionamento
- Windows - https://git-scm.com/install/windows
- Mac - https://git-scm.com/install/mac
- Linux/ubuntu - https://git-scm.com/install/linux
-
python
- Windows - https://www.python.org/downloads/windows/
- Mac - https://www.python.org/downloads/macos/
- Linux/ubuntu - https://www.python.org/downloads/source/
git clone https://github.com/designsystematomic-blip/dados-saude-backend
cd ./dados-saude-backendnpm install- Copie o arquivo
.env.examplepara.env:
cp .env.example .env- Inicialize o docker
- Na raiz do projeto, rodar o comando
docker compose up -d
Será utilizado o localstack para configurar o S3 Bucket da AWS localmente, esse serviço permite o armazenamento de imagens em um storage e disponibiliza as URLs da imagem, o que é mais recomendado para lidar do que realizar a subida dos arquivos diretamente no banco de dados Postgres. Documentação referencia para o processo de subida de arquivos: https://github.com/dockersamples/todo-list-localstack-docker
python3 -m venv .venv
source .venv/bin/activate
pip3 install awscli-local
awslocal --version
Sempre que for trabalhar com o projeto, é necessário ativar o ambiente virtual primeiro usando:
source .venv/bin/activate
awslocal configure
Configurar os valores solicitados como:
- AWS Access Key ID: test
- AWS Secret Access Key: test
- Default region name: us-east-1
python -m venv .venv
.venv\Scripts\activate
pip install awscli
aws --version
Sempre que for trabalhar com o projeto, é necessário ativar o ambiente virtual primeiro usando:
.venv\Scripts\activate
aws configure
Configurar os valores solicitados como:
- AWS Access Key ID: test
- AWS Secret Access Key: test
- Default region name: us-east-1
Uma vez que a CLI da AWS está instalada e configurada, assim como o docker inicializado, para criar o bucket basta seguir:
awslocal s3 mb s3://dados-saude-bucket-exames
aws s3 mb s3://dados-saude-bucket-exames --endpoint-url=http://localhost:4566
awslocal s3 ls
aws s3 ls
Caso tenha erro de permissão ao rodar o docker. Para dar permissão para criar o volume da localstack
mkdir -p localstack && chmod 755 localstack
- Configure as variáveis conforme seu ambiente (desenvolvimento, teste, produção):
5.1 Gere uma chave de segurança criptografada para a variável JWT_SECRET
Você pode gerar uma chave secreta forte usando o comando abaixo:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
Arquivo .env
# Banco de Dados
DATABASE_URL="postgresql://postgres:postgres@localhost:5444/dados_saude_db"
# JWT
JWT_SECRET="sua-chave-secreta-super-segura"
JWT_EXPIRATION="24h"
# Server
PORT=8000
NODE_ENV="development"
# AWS S3 (Opcional)
AWS_REGION="us-east-1"
AWS_ACCESS_KEY_ID="sua-chave-id"
AWS_SECRET_ACCESS_KEY="sua-chave-secreta"
AWS_S3_BUCKET_NAME="seu-bucket-name"npx prisma generateAs migrations gerenciam o versionamento do banco de dados.
npx prisma migrate devnpx prisma studionpm run devO servidor estará disponível em: http://localhost:8000
- Desenvolvimento:
.env(local) - Docker:
.env.docker(containerizado) - Exemplo:
.env.example(template)
docker-compose up -dIsso irá:
- Iniciar o container PostgreSQL na porta 5444
- Preparar o banco de dados
Caso resulte em algum erro de permissão na pasta localstack_data, executar:
chmod 755 localstack_datadocker build -t dados-saude-backend:latest .docker-compose downdocker-compose logs -fdocker-compose down -vnpx prisma generateAs migrations gerenciam o versionamento do banco de dados.
npx prisma migrate dev --name nome_da_migrationnpx prisma migrate statusnpx prisma migrate resetPara visualizar e gerenciar dados graficamente:
npx prisma studioAcesse: http://localhost:5555
src/
├── app.ts # Configuração principal do Express
├── config/
│ └── database.ts # Configuração do Prisma
├── controllers/ # Lógica de requisição/resposta
│ ├── health.controller.ts
│ └── user.controller.ts
├── middlewares/ # Middlewares personalizados
│ └── auth.middleware.ts
├── repository/ # Camada de dados (Data Access)
│ ├── exam/
│ └── user/
├── routes/ # Definição de rotas
│ ├── health.routes.ts
│ └── ...
├── types/ # Tipos TypeScript
└── utils/ # Funções utilitárias
prisma/
├── schema.prisma # Modelo de dados
└── migrations/ # Histórico de mudanças do BD
Este projeto segue a arquitetura MVC (Model-View-Controller) com padrão Repository para acesso a dados:
- Models: Definidos em
prisma/schema.prisma - Controllers: Lógica de negócio em
src/controllers/ - Routes: Endpoints em
src/routes/ - Repository: Acesso a dados em
src/repository/ - Middlewares: Autenticação e validação em
src/middlewares/
| Elemento | Padrão | Exemplo |
|---|---|---|
| Arquivos | camelCase | user.controller.ts |
| Funções | camelCase | getUserById() |
| Classes | PascalCase | UserController |
| Constantes | UPPER_SNAKE_CASE | JWT_EXPIRATION |
| Interfaces | PascalCase com prefixo I |
IUser |
| Tipos | PascalCase | User, UserResponse |
{
"success": boolean,
"statusCode": number,
"data": object | null,
"message": string,
"timestamp": string
}O projeto utiliza JWT (JSON Web Token) para autenticação.
- Usuário faz login com email e senha
- Backend valida credenciais
- Backend gera JWT com informações do usuário
- Cliente armazena JWT (cookie/localStorage)
- Cliente envia JWT em requisições subsequentes no header
Authorization
Authorization: Bearer seu_token_jwt_aqui
GET /healthResposta:
{
"status": "ok",
"timestamp": "2025-01-15T10:30:00Z"
}POST /users/register
Content-Type: application/json
{
"email": "[email protected]",
"password": "senha123",
"name": "João Silva"
}Resposta (201):
{
"success": true,
"statusCode": 201,
"data": {
"id": "uuid",
"email": "[email protected]",
"name": "João Silva"
},
"message": "Usuário criado com sucesso"
}POST /users/login
Content-Type: application/json
{
"email": "[email protected]",
"password": "senha123"
}Resposta (200):
{
"success": true,
"statusCode": 200,
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "uuid",
"email": "[email protected]",
"name": "João Silva"
}
},
"message": "Login realizado com sucesso"
}Para desenvolvimento local, usamos LocalStack para emular os serviços AWS, incluindo S3.
- Docker e Docker Compose rodando
- AWS CLI instalado localmente
- awslocal (wrapper da AWS CLI para LocalStack)
Windows (PowerShell Admin):
choco install awslocalmacOS/Linux:
pip install awslocalOu via npm:
npm install -g awslocaldocker-compose up -dO LocalStack será iniciado na porta 4566.
Crie ou edite ~/.aws/credentials:
[default]
aws_access_key_id = test
aws_secret_access_key = testCrie ou edite ~/.aws/config:
[default]
region = us-east-1
output = jsonawslocal s3 mb s3://dados-saude-bucketVerificar buckets criados:
awslocal s3 lsAdicione no .env:
# AWS LocalStack (Desenvolvimento)
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
AWS_S3_BUCKET_NAME=dados-saude-bucket
AWS_S3_ENDPOINT=http://localhost:4566# Criar arquivo teste
echo "Teste de arquivo" > test.txt
# Upload para S3 local
awslocal s3 cp test.txt s3://dados-saude-bucket/
# Listar arquivos no bucket
awslocal s3 ls s3://dados-saude-bucket/
# Download do arquivo
awslocal s3 cp s3://dados-saude-bucket/test.txt ./downloaded.txtimport { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const s3Client = new S3Client({
region: process.env.AWS_REGION,
endpoint: process.env.AWS_S3_ENDPOINT, // http://localhost:4566
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
// Exemplo: Upload de arquivo
const params = {
Bucket: process.env.AWS_S3_BUCKET_NAME,
Key: "exames/exame-123.pdf",
Body: fileContent,
ContentType: "application/pdf",
};
await s3Client.send(new PutObjectCommand(params));Para produção, altere as variáveis de ambiente:
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=sua-chave-real
AWS_SECRET_ACCESS_KEY=sua-chave-secreta-real
AWS_S3_BUCKET_NAME=seu-bucket-real
# Remova AWS_S3_ENDPOINT ou deixe em branco| Comando | Descrição |
|---|---|
awslocal s3 mb s3://bucket-name |
Criar bucket |
awslocal s3 ls |
Listar buckets |
awslocal s3 cp arquivo.txt s3://bucket/ |
Upload |
awslocal s3 cp s3://bucket/arquivo.txt . |
Download |
awslocal s3 rm s3://bucket/arquivo.txt |
Deletar arquivo |
awslocal s3 rb s3://bucket-name |
Deletar bucket (vazio) |
Para mais informações: Documentação LocalStack
| Variável | Descrição | Exemplo |
|---|---|---|
DATABASE_URL |
URL de conexão PostgreSQL | postgresql://user:pass@localhost:5444/db |
JWT_SECRET |
Chave secreta para assinar JWTs | sua-chave-secreta |
JWT_EXPIRATION |
Tempo de expiração do JWT | 24h |
PORT |
Porta do servidor | 8000 |
NODE_ENV |
Ambiente de execução | development, production |
AWS_REGION |
Região AWS | us-east-1 |
AWS_ACCESS_KEY_ID |
ID da chave AWS | AKIA... |
AWS_SECRET_ACCESS_KEY |
Chave secreta AWS | ... |
AWS_S3_BUCKET_NAME |
Nome do bucket S3 | meu-bucket |
Certifique-se de que o Docker está rodando:
docker-compose up -dRegenere o Prisma Client:
npx prisma generateExecute:
npx prisma migrate devMIT
