Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save mbmaciel/64acb95f6f88c106eeed3de9420ab039 to your computer and use it in GitHub Desktop.

Select an option

Save mbmaciel/64acb95f6f88c106eeed3de9420ab039 to your computer and use it in GitHub Desktop.
# Arquitetura e tecnologias utilizadas
Data: 2026-05-22
## Visão geral
O Self Care City é uma aplicação full-stack composta por:
- Aplicativo cliente em Expo/React Native, com suporte mobile e web.
- API backend em Node.js/Express.
- Banco de dados PostgreSQL.
- Integrações externas para pagamento, email e armazenamento de imagens.
A aplicação atende fluxos de cadastro, login, assinatura/pagamento, atividades diárias, pontuação, ranking, roleta, cronômetro, perfil e administração de usuários.
## Arquitetura geral
```text
Usuário
|
v
App Expo / React Native
|
| HTTP/JSON
v
API Node.js / Express
|
+-- PostgreSQL
+-- Pagar.me
+-- Brevo
+-- AWS S3
```
## Estrutura do repositório
```text
selfcarecity/
client/ App Expo / React Native
screens/ Telas da aplicação
services/ Clientes HTTP para a API
components/ Componentes reutilizáveis
context/ Contextos React
config/ Configuração do app
assets/ Imagens, sons e recursos estáticos
server/ Backend Node.js / Express
controllers/ Controllers por domínio
middleware/ Middlewares de autenticação/autorização
utils/ Banco, email, S3, Pagar.me e helpers
migrations/ Migrations SQL
scripts/ Scripts operacionais
jobs/ Rotinas agendadas
docs/ Documentação técnica
```
## Frontend
O frontend fica em `client/` e usa Expo com React Native.
### Principais responsabilidades
- Renderizar telas mobile/web.
- Gerenciar navegação entre login, cadastro, pagamento, dashboard e áreas internas.
- Armazenar token de autenticação localmente.
- Consumir a API backend via HTTP.
- Enviar imagens de atividades via multipart/form-data.
- Exibir feedbacks com toast e alerts.
### Telas principais
- `LoginScreen`
- `RegisterScreen`
- `PaymentScreen`
- `Dashboard`
- `ActivitiesScreen`
- `ScoreScreen`
- `RankingScreen`
- `ReportsScreen`
- `ProfileScreen`
- `UsersScreen`
- `StopwatchScreen`
- `RouletteScreen`
- `PrivacyPolicyScreen`
### Tecnologias do frontend
- Expo SDK 54.
- React 19.1.
- React Native 0.81.
- React Native Web.
- React Navigation.
- Axios.
- AsyncStorage.
- Expo Secure Store.
- Expo Image Picker.
- Expo File System.
- Expo Sharing.
- Expo Audio.
- React Native Toast Message.
- React Native View Shot.
## Backend
O backend fica em `server/` e expõe uma API REST em Express.
### Principais responsabilidades
- Cadastro, login e recuperação de senha.
- Emissão e validação de JWT.
- Controle de acesso por usuário autenticado e administrador.
- CRUD de atividades.
- Controle de pontuação semanal.
- Ranking.
- Roleta.
- Cronômetro.
- CRUD administrativo de usuários.
- Criação e consulta de pagamentos.
- Processamento de webhooks Pagar.me.
- Envio de emails transacionais.
- Upload de imagens para S3.
### Controllers
- `auth.js`: registro, login, perfil e recuperação de senha.
- `activities.js`: atividades, agenda e pontuação.
- `payment.js`: PIX, cartão, assinatura e webhooks.
- `users.js`: administração de usuários.
- `ranking.js`: ranking geral e detalhes por usuário.
- `roulette.js`: pontos e giro da roleta.
- `stopwatch.js`: registro de tempo do cronômetro.
### Middlewares
- `auth.js`: valida JWT e bloqueia acesso quando pagamento/assinatura não está ativo.
- `adminAuth.js`: valida JWT e exige perfil `administrador`.
### Tecnologias do backend
- Node.js.
- Express 4.
- PostgreSQL.
- `pg`.
- `jsonwebtoken`.
- `bcrypt`.
- `dotenv`.
- `cors`.
- `body-parser`.
- `axios`.
- `multer`.
- `multer-s3`.
- AWS SDK S3.
- Nodemailer.
- AWS SES SDK.
- Pagar.me SDK/API.
- Node Cron.
## Banco de dados
O banco utilizado é PostgreSQL.
### Tabelas principais
- `users`: usuários, credenciais, perfil, pagamento, assinatura e métricas.
- `activities`: atividades diárias do usuário.
- `score`: pontuação gerada por atividades concluídas.
- `orders`: pedidos e status de pagamento.
- `user_custom_hours`: horários personalizados por usuário.
### Scripts e migrations
- `server/db.sql`: dump/schema base.
- `server/migrations/*.sql`: migrations incrementais.
- `server/migration*.sql`: migrations avulsas adicionais.
## Integrações externas
### Pagar.me
Usado para:
- Criar pedidos PIX.
- Criar assinaturas com cartão de crédito.
- Consultar status de pagamento.
- Receber webhooks de pagamento e assinatura.
Arquivos relacionados:
- `server/controllers/payment.js`
- `server/utils/pagarme.js`
- `server/scripts/create-plans.js`
- `server/test-pagarme-pix.js`
- `server/test-pagarme-plan.js`
### Brevo
Usado para envio de emails transacionais:
- Boas-vindas.
- Recuperação de senha.
- PIX pendente.
- PIX confirmado.
- Avisos de assinatura.
Arquivos relacionados:
- `server/utils/email.js`
- `server/utils/emailTemplates.js`
- `server/test-email.js`
### AWS S3
Usado para armazenar imagens enviadas nas atividades.
Arquivos relacionados:
- `server/utils/s3.js`
- `server/test-upload.js`
### AWS SES
Há dependência instalada para AWS SES, embora o envio principal observado use Brevo.
## Autenticação e autorização
### Autenticação
- Login por email, CPF ou identificador.
- Senha armazenada com hash `bcrypt`.
- Sessão via JWT.
- Expiração padrão do JWT: `7d`, configurável por `JWT_EXPIRES_IN`.
### Autorização
- Rotas comuns usam middleware `ensureAuth`.
- Rotas administrativas usam middleware `ensureAdmin`.
- O acesso comum depende de:
- token JWT válido;
- usuário existente;
- `payment_status = true`;
- assinatura não expirada;
- exceção para perfil `administrador`.
## Pagamentos
O backend trabalha com dois modelos:
- PIX: pedido avulso que libera acesso por 30 dias.
- Cartão de crédito: assinatura recorrente mensal.
O status do usuário é controlado principalmente por:
- `users.payment_status`
- `users.subscription_end_date`
- `users.pagarme_subscription_id`
- `orders.status`
## Upload de arquivos
O upload é feito pelo backend usando:
- `multer`
- `multer-s3`
- AWS S3
Características observadas:
- Limite de 5 MB por arquivo.
- Aceita arquivos cujo MIME type começa com `image/`.
- Salva imagens no prefixo `activities/`.
## Rotinas e scripts
Existem scripts para tarefas operacionais:
- Verificação de assinaturas.
- Premiação de pontos da roleta.
- Teste de email.
- Teste de upload.
- Teste de PIX.
- Teste de plano Pagar.me.
- Criação de planos Pagar.me.
Arquivos principais:
- `server/scripts/subscription-check.js`
- `server/scripts/award_roulette_points.js`
- `server/jobs/subscriptionCron.js`
## Build e deploy
### Cliente
Scripts principais:
```bash
npm start
npm run android
npm run ios
npm run web
npm run build:web
```
Build mobile via EAS:
- Android App Bundle em produção.
- iOS com profile de produção.
Arquivos relacionados:
- `client/eas.json`
- `client/app.json`
- `client/app.config.js`
### Backend
Scripts principais:
```bash
npm start
npm run dev
npm run prod
```
O backend lê configurações por variáveis de ambiente usando `dotenv`.
## Variáveis de ambiente relevantes
### Backend
- `DATABASE_URL`
- `JWT_SECRET`
- `JWT_EXPIRES_IN`
- `PORT`
- `HTTPS_PORT`
- `SSL_CERT`
- `SSL_KEY`
- `PAGARME_API_KEY`
- `PAGARME_WEBHOOK_URL`
- `PAGARME_WEBHOOK_SECRET`
- `BREVO_API_KEY`
- `AWS_REGION`
- `AWS_ACCESS_KEY_ID`
- `AWS_SECRET_ACCESS_KEY`
- `S3_BUCKET_NAME`
### Cliente
- `EXPO_PUBLIC_API_URL`
## Resumo da stack
| Camada | Tecnologias |
| --- | --- |
| App | Expo, React, React Native, React Native Web |
| Navegação | React Navigation |
| HTTP client | Axios |
| Estado/local storage | React state, Context API, AsyncStorage |
| API | Node.js, Express |
| Banco | PostgreSQL, pg |
| Autenticação | JWT, bcrypt |
| Upload | Multer, Multer S3, AWS S3 |
| Email | Brevo API, Nodemailer/AWS SES como dependências |
| Pagamento | Pagar.me |
| Jobs | Node scripts, node-cron |
| Build mobile | EAS/Expo |
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment