saveinmed/backend
2025-12-22 15:38:56 -03:00
..
cmd/api refactor(backend): rename SWAGGER_HOST to BACKEND_HOST 2025-12-21 22:21:37 -03:00
docs feat(backend): switch auth to username and cleanup db config 2025-12-21 23:04:47 -03:00
internal fix(backend): add db tags to TopProduct struct for sqlx mapping 2025-12-22 15:38:56 -03:00
.env test: add automated tests for admin login 2025-12-22 00:31:26 -03:00
.env.example feat(backend): switch auth to username and cleanup db config 2025-12-21 23:04:47 -03:00
.gitignore chore: refactor backend config, unignore .env, update config loading 2025-12-20 10:10:55 -03:00
api feat(backend): switch auth to username and cleanup db config 2025-12-21 23:04:47 -03:00
Dockerfile feat(backend): add configurable CORS and optimize Dockerfile 2025-12-19 17:34:30 -03:00
go.mod chore(backend): add lib/pq dependency for PostgreSQL array support 2025-12-22 15:32:47 -03:00
go.sum fix(backend): properly load .env file manually in config.go 2025-12-22 09:47:17 -03:00
README.md fix(backend): fix build errors, update tests, and improve documentation 2025-12-21 23:11:33 -03:00

SaveInMed API (Backend Go)

API de alta performance em Go 1.24 para o marketplace farmacêutico B2B SaveInMed.

🎯 Propósito

Este é o núcleo de performance do SaveInMed, responsável por operações críticas que exigem alta velocidade e eficiência, incluindo:

  • Gestão de empresas (farmácias, distribuidoras, administradores)
  • Catálogo de produtos com controle de lote e validade
  • Processamento de pedidos
  • Integração com Mercado Pago para pagamentos

🚀 Tecnologias

  • Go 1.24.3 - Linguagem de programação
  • PostgreSQL - Banco de dados (via pgx/v5)
  • json-iterator - Serialização JSON de alta performance
  • Swagger - Documentação automática da API
  • Gzip - Compressão de respostas

📋 Funcionalidades

Gestão de Empresas

  • Separação de papéis: farmácia, distribuidora, administrador
  • CRUD completo de empresas
  • Validação de CNPJ

Catálogo de Produtos

  • Produtos com lote e validade obrigatórios
  • Categorização e subcategorização
  • Controle de estoque

Pedidos

  • Ciclo completo: Pendente → Pago → Faturado → Entregue
  • Rastreamento de status
  • Histórico de transações

Pagamentos

  • Geração de preferência de pagamento Mercado Pago
  • Split de pagamento automático
  • Retenção de comissão da plataforma

🏗️ Arquitetura

backend/
├── cmd/
│   └── api/
│       └── main.go               # Entry point da aplicação
├── internal/
│   ├── config/                   # Configurações (100% coverage)
│   ├── domain/                   # Modelos de domínio
│   ├── http/
│   │   ├── handler/              # Handlers HTTP (refatorado)
│   │   │   ├── handler.go        # Auth, Products, Orders, etc
│   │   │   ├── company_handler.go # CRUD de empresas
│   │   │   └── dto.go            # DTOs e funções utilitárias
│   │   └── middleware/           # Middlewares (95.9% coverage)
│   ├── payments/                 # Integração MercadoPago (100% coverage)
│   ├── repository/
│   │   └── postgres/             # Repositório PostgreSQL
│   ├── server/                   # Configuração do servidor (74.7% coverage)
│   └── usecase/                  # Casos de uso (64.7% coverage)
├── docs/                         # Documentação Swagger
├── Dockerfile
└── README.md

🧪 Cobertura de Testes

Pacote Cobertura
config 100%
middleware 95.9%
payments 100%
usecase 64.7%
server 74.7%
handler 6.6%

🔧 Configuração

Variáveis de Ambiente

# Banco de Dados
DATABASE_URL=postgres://user:password@localhost:5432/saveinmed?sslmode=disable

# Servidor
BACKEND_PORT=8214

# Autenticação
JWT_SECRET=your-secret-key
JWT_EXPIRES_IN=24h
PASSWORD_PEPPER=your-pepper

# Admin Seeding (criado automaticamente na inicialização)
ADMIN_NAME=Administrator
ADMIN_USERNAME=admin
ADMIN_EMAIL=admin@saveinmed.com
ADMIN_PASSWORD=admin123

# CORS
CORS_ORIGINS=*

# Mercado Pago
MERCADOPAGO_BASE_URL=https://api.mercadopago.com
MARKETPLACE_COMMISSION=2.5

Autenticação

A autenticação utiliza username (não email) para login:

POST /api/v1/auth/login
{
  "username": "admin",
  "password": "admin123"
}

Pré-requisitos

  • Go 1.24 ou superior
  • PostgreSQL 14+
  • Swag CLI (para regenerar documentação)

🏃 Execução Local

# Configurar variável de ambiente
export DATABASE_URL=postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable

# Instalar dependências
go mod download

# Executar API
go run ./cmd/api

# API estará disponível em http://localhost:8080
# Swagger UI em http://localhost:8080/docs/index.html

🐳 Docker

# Build da imagem
docker build -t saveinmed-api:latest .

# Executar container
docker run -p 8080:8080 \
  -e DATABASE_URL=postgres://user:password@host:5432/saveinmed \
  saveinmed-api:latest

📚 Documentação da API

A documentação completa da API está disponível via Swagger UI:

http://localhost:8080/docs/index.html

Regenerar Swagger

# Instalar swag
go install github.com/swaggo/swag/cmd/swag@latest

# Gerar documentação
swag init --dir ./cmd/api,./internal/http/handler,./internal/domain \
  --output ./docs \
  --parseDependency \
  --parseInternal

🧪 Testes

# Executar todos os testes
go test ./...

# Executar testes com coverage
go test -cover ./...

# Gerar relatório de coverage
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

📊 Performance

Esta API foi otimizada para alta performance:

  • json-iterator: ~2-3x mais rápido que encoding/json padrão
  • Compressão gzip: Reduz tamanho das respostas em ~70%
  • Connection pooling: Gerenciamento eficiente de conexões com PostgreSQL
  • Prepared statements: Queries otimizadas e protegidas contra SQL injection

🔗 Integração com Outros Componentes

  • Backoffice (NestJS): Compartilha o mesmo banco de dados PostgreSQL
  • Marketplace Frontend: Consome esta API para operações críticas
  • SaveInMed BFF: Pode fazer proxy para endpoints específicos desta API

📝 Licença

MIT