# SaveInMed — Backend API (Go)

Serviço principal do marketplace B2B farmacêutico. Implementa toda a lógica de negócio, persistência e integrações externas.

---

## Estrutura de diretórios

```
backend/
├── cmd/
│   ├── api/                  ← entry-point principal (porta 8214)
│   ├── apply_migration/      ← runner de migrações DDL
│   ├── seeder/               ← seed de dados de produção
│   └── seed_lojista/         ← seed de conta lojista demo
├── docs/                     ← Swagger/OpenAPI gerado (swag)
├── internal/
│   ├── domain/               ← tipos, entidades, value objects
│   ├── http/
│   │   ├── handler/          ← handlers HTTP (um arquivo por domínio)
│   │   └── middleware/       ← JWT, CORS, rate-limit
│   ├── infrastructure/
│   │   ├── mapbox/           ← cliente Mapbox (distância/rota)
│   │   ├── notifications/    ← e-mail, push (FCM)
│   │   └── payments/         ← adapters Mercado Pago / Asaas / Stripe
│   ├── repository/           ← interfaces + implementações PostgreSQL
│   ├── server/               ← bootstrap: router, middleware chain
│   └── usecase/              ← regras de negócio (Clean Architecture)
│       ├── usecase.go            ← Repository interface, Service struct
│       ├── auth_usecase.go       ← JWT, login, registro, reset de senha
│       ├── user_usecase.go       ← CRUD de usuários
│       ├── company_usecase.go    ← CRUD de empresas + KYC
│       ├── product_usecase.go    ← catálogo, inventário, fabricantes
│       ├── cart_usecase.go       ← carrinho B2B (descontos, taxas)
│       ├── order_usecase.go      ← ciclo de pedido + máquina de estados
│       ├── payment_usecase.go    ← preferências MP, webhook, ledger
│       ├── shipping_usecase.go   ← cálculo de frete (Mapbox + haversine)
│       ├── review_usecase.go     ← avaliações pós-entrega
│       ├── address_usecase.go    ← endereços por usuário
│       └── dashboard_usecase.go  ← métricas vendedor / admin
└── uploads/                  ← artefatos enviados (git-keeped)
```

---

## Arquitetura (Clean Architecture)

```
HTTP Request
    │
    ▼
Handler  (internal/http/handler/)
    │  converte HTTP → chamada de usecase
    ▼
Service  (internal/usecase/)
    │  regras de negócio puras
    ▼
Repository  (internal/repository/)
    │  interface satisfeita por implementação PostgreSQL
    ▼
PostgreSQL  +  Infra Adapters (payments / notifications / mapbox)
```

Cada camada depende **apenas da camada imediatamente abaixo** via interface — nenhuma dependência circular.

---

## Máquina de estados do pedido

```
Pending ──► Paid ──────► Invoiced ──► Shipped ──► Delivered ──► Completed
   │           │               │           │
   └──Cancel   └──Cancel       └──Cancel   └──Cancel
        (estoque restaurado automaticamente)
```

---

## Stack

| Componente | Tecnologia |
|------------|------------|
| Linguagem  | Go 1.24+   |
| HTTP       | net/http (chi) |
| Banco      | PostgreSQL |
| Auth       | JWT HS256 + bcrypt+pepper |
| Pagamentos | Mercado Pago · Asaas · Stripe |
| Frete      | Mapbox Directions API + haversine fallback |
| Docs API   | Swagger (swag) |

---

## Comandos essenciais

```bash
# rodar localmente
go run ./cmd/api

# gerar docs Swagger
swag init -g cmd/api/main.go -o docs/

# aplicar migrações
go run ./cmd/apply_migration

# testes
go test ./... -cover

# build + vet
go build ./... && go vet ./...
```

---

> Arquitetura completa: [docs/architecture.md](../docs/architecture.md)
> Pendências de negócio: [docs/PENDENCIAS_BACKEND.md](../docs/PENDENCIAS_BACKEND.md)
