Desenvolvido por Felipe Katuki, Julio D'Elboux, Yasmim Lopes e Maria Luiza Manco.
Um sistema completo de gestão médica com funcionalidades para pacientes, profissionais, medicamentos, agendamentos e reservas.
- ✅ Autenticação com JWT
- ✅ Gestão de Usuários (Admin, Profissional, Paciente)
- ✅ Cadastro de Pacientes
- ✅ Gestão de Profissionais de Saúde
- ✅ Gestão de Horários e Turnos dos Profissionais
- ✅ Catálogo de Medicamentos
- ✅ Controle de Inventário de Medicamentos
- ✅ Sistema de Reservas de Medicamentos
- ✅ Agendamentos de Consultas
- ✅ Prontuários Médicos
- ✅ Encaminhamentos
- ✅ Unidades de Saúde
- ✅ Geolocalização de Unidades de Saúde
- ✅ Assistente de Saúde com IA (Google Gemini)
- ✅ Notificações Automáticas (Email e SMS via Twilio)
- ✅ Validações com Yup
- ✅ Upload de Fotos (Cloudinary)
- ✅ Paginação em todas as listagens
- Node.js
- npm ou yarn
- PostgreSQL (ou banco de dados compatível)
- Conta no Cloudinary (opcional, para upload de fotos)
- Conta no Twilio (opcional, para envio de SMS)
- Chave de API Google Gemini (opcional, para assistente de IA)
- Expo CLI (para rodar o aplicativo mobile)
- Clone o repositório
git clone https://github.com/kxtukI/med.sys.git
cd med.sys- Instale as dependências
Backend:
npm installMobile:
cd app
npm install- Configure as variáveis de ambiente
Backend:
cp .env.example .envEdite o arquivo .env com suas configurações:
# Banco de Dados
DATABASE_URL=postgresql://user:password@localhost:5432/med_sys
# JWT
JWT_SECRET=sua_chave_secreta_aqui
# IA (Google Gemini)
GEMINI_API_KEY=sua_chave_gemini
GEMINI_MODEL=gemini-1.5-flash ou de sua preferência
# Cloudinary (opcional)
CLOUDINARY_NAME=seu_cloud_name
CLOUDINARY_API_KEY=sua_api_key
CLOUDINARY_API_SECRET=seu_api_secret
# Twilio (para SMS)
TWILIO_SID=seu_twilio_sid
TWILIO_TOKEN=seu_twilio_token
TWILIO_FROM=seu_numero_twilio
# Email (para recuperação de senha)
EMAIL_USER=seu_email@gmail.com
EMAIL_PASS=sua_senha_app
# Node
NODE_ENV=development
PORT=3000- Execute as migrações do banco de dados
npm run migrate- Inicie a aplicação
Backend:
npm run dev
# Servidor rodando em http://localhost:3000Mobile:
cd app
npx expo start
# Use o App Expo Go para escanear o QR CodeAcesse a documentação completa em API_DOCUMENTATION.md
POST /sessions # Login
POST /logout # Logout
POST /password/request_recovery # Recuperação de senha
POST /password/reset # Reset de senha
GET /users # Listar usuários (Admin)
GET /patients # Listar pacientes
GET /professionals # Listar profissionais
GET /health_units # Listar unidades de saúde (com geolocalização)
GET /medications # Listar medicamentos
GET /medication_inventory # Listar inventário
GET /medication_reservations # Listar reservas
GET /appointments # Listar agendamentos
GET /medical_records # Listar registros médicos
GET /referrals # Listar encaminhamentos
O endpoint /health_units suporta cálculo de distância e ordenação por proximidade:
Exemplos de uso:
# Usando coordenadas diretas
GET /health_units?latitude=-23.5505&longitude=-46.6333
# Usando CEP
GET /health_units?zip_code=01310100
# Usando endereço completo
GET /health_units?address=Rua das Flores, 123&city=São Paulo&state=SP
# Combinando com filtros
GET /health_units?latitude=-23.5505&longitude=-46.6333&city=São PauloResposta inclui:
distance_km: Distância em quilômetrosdistance_meters: Distância em metros- Ordenação automática por proximidade
POST /sessions
Realiza login e retorna um token JWT (Login pode ser feito usando CPF e Email).
Body:
{
"email": "usuario@email.com",
"password": "senha123"
}Response (200):
{
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@email.com",
"user_type": "patient",
"phone": "11999999999"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}├── app/ # Mobile App (Expo/React Native)
│ ├── app/ # Telas e Rotas (Expo Router)
│ │ ├── (auth)/ # Fluxo de autenticação
│ │ ├── (tabs)/ # Navegação por abas
│ │ └── pharmacy/ # Telas de farmácia
│ ├── components/ # Componentes reutilizáveis
│ ├── context/ # Context API (Auth)
│ └── services/ # Integração com API
│
├── src/ # Backend (Node.js/Express)
│ ├── app/
│ │ ├── controllers/ # Lógica de negócio
│ │ ├── models/ # Modelos do Sequelize
│ │ ├── middlewares/ # Middlewares (auth, validation)
│ │ └── services/ # Serviços (Jobs, Email, SMS)
│ ├── config/ # Configurações (DB, Auth)
│ ├── database/ # Migrations e Seeds
│ └── routes.js # Rotas da API
│
└── web/ # Dashboard Web (HTML/JS)
├── css/ # Estilos
└── js/ # Lógica Dashboard
| Tipo | Acesso |
|---|---|
| Admin | Gestão completa (usuários, medicamentos, unidades) |
| Professional | Criar agendamentos, registros médicos, encaminhamentos |
| Patient | Ver histórico, fazer reservas de medicamentos |
- Cadastro com CPF, SUS, data de nascimento
- Histórico médico completo
- Agendamentos associados
- Catálogo completo com fotos
- Ingrediente ativo, dosagem, fabricante
- Contraindicações e descrição
- Paciente reserva medicamento em unidade
- Status: reserved → ready → picked_up
- Horário agendado de retirada
- Inventário atualizado automaticamente
- Suporte a cancelamento e expiração
- Agenda com profissional de saúde
- Validação de encaminhamento (para especialistas)
- Status: scheduled, completed, canceled
- Prontuário eletrônico
- Observações, prescrições, alergias
- Plano de tratamento
- Quantidade por medicamento e unidade
- Controle de estoque
- Rastreamento de movimentação
- Cálculo de distância entre usuário e unidades
- Ordenação automática por proximidade
- Suporte a 3 métodos de localização:
- Coordenadas diretas (latitude/longitude)
- Endereço do perfil do paciente
- CEP ou endereço via query params
- Retorna distância em quilômetros e metros
1. Paciente cria reserva
↓
2. Sistema valida estoque (deduz do inventário)
↓
3. Reserva criada com status "reserved"
↓
4. Profissional muda para "ready"
↓
5. Paciente retira (status "picked_up")
↓
6. Finalizado!
Se cancelar ou expirar → estoque é reposto automaticamente
- Datas completas (
*_at,_timestamp,registration_date, etc.) retornam no formatoDD/MM/AAAA HH:mm - Datas simples (
*_date) retornam no formatoDD/MM/AAAA - Campos nulos permanecem como
null
Todas as entidades possuem validações com Yup:
- Emails válidos
- Passwords com mínimo 8 caracteres
- Datas futuras para agendamentos
- Quantidades positivas
- CPF válido
- SUS com 15 dígitos
- JWT com expiração
- Senhas criptografadas com bcryptjs
- Validação de autorização por role
- Middleware de autenticação
- Transações no banco de dados
users- Usuários do sistemapatients- Pacientesprofessionals- Profissionais de saúdehealth_units- Unidades de saúdemedications- Medicamentosmedication_inventory- Estoque por unidademedication_reservations- Reservas de medicamentosappointments- Agendamentosmedical_records- Registros médicosreferrals- Encaminhamentosnotifications- Notificações (SMS/Email)professional_schedules- Horários e turnos dos profissionaisprofessional_health_units- Associação Profissional x Unidade
- API Documentation - Documentação completa da API
- GitHub - Repositório