saveinmed/Makefile

500 lines
21 KiB
Makefile
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# =============================================================================
# SaveInMed — Makefile
# =============================================================================
# Requisitos:
# - Go 1.23+ (backend)
# - pnpm (frontend e backoffice) → se preferir npm/yarn, ajuste PKG_MGR
# - Node 20+ (frontend e backoffice)
# - Docker + Docker Compose (banco de dados PostgreSQL)
#
# Uso rápido (desenvolvimento diário):
# make db → sobe o PostgreSQL via Docker
# make dev → sobe backend + frontend em paralelo (hot-reload)
# make dev-all → sobe backend + frontend + backoffice em paralelo
#
# Testes (CI/CD e local):
# make test → roda TODOS os testes: backend + frontend + backoffice
# make test-backend → testes unitários e de integração do Go (go test ./...)
# make test-frontend → testes unitários + de componentes (Vitest, modo CI)
# make test-e2e → testes end-to-end (Playwright) — exige app rodando
# make test-ci → pipeline completo de CI: lint + tests + e2e
#
# Outros:
# make build → build de todos os serviços para produção
# make lint → lint em todos os serviços
# make install → instala dependências de todos os serviços
# make migrate → aplica migrações DDL do backend
# make help → lista todos os targets com descrições
#
# Variáveis de ambiente para os testes e2e:
# E2E_BASE_URL URL do frontend (padrão: http://localhost:5173)
# E2E_ADMIN_USER Usuário admin de teste (padrão: admin)
# E2E_ADMIN_PASS Senha admin de teste (padrão: admin123)
# =============================================================================
# ---------------------------------------------------------------------------
# Variáveis — ajuste aqui se mudar a estrutura de pastas ou gerenciador
# ---------------------------------------------------------------------------
BACKEND_DIR = backend
FRONTEND_DIR = frontend
BACKOFFICE_DIR = backoffice
# Gerenciador de pacotes Node. Troque por "npm" ou "yarn" se necessário.
PKG_MGR = pnpm
# Caminho do entrypoint Go. Ajuste se o main.go mudar de lugar.
GO_ENTRYPOINT = ./cmd/api
# Nome e destino do binário compilado do backend.
BINARY_NAME = api
BINARY_OUT = $(BACKEND_DIR)/bin/$(BINARY_NAME)
# Flags extras para go build (ex.: -ldflags "-s -w" para reduzir tamanho).
GO_BUILD_FLAGS =
# Flags extras para go test (ex.: -race -count=1).
GO_TEST_FLAGS =
# Cores para output (desative com: make COLOR=0 <target>)
COLOR ?= 1
ifeq ($(COLOR), 1)
CYAN = \033[36m
GREEN = \033[32m
YELLOW = \033[33m
RESET = \033[0m
else
CYAN = GREEN = YELLOW = RESET =
endif
# ---------------------------------------------------------------------------
# Targets PHONY — não correspondem a arquivos no disco
# ---------------------------------------------------------------------------
.PHONY: help \
dev dev-backend dev-frontend dev-backoffice dev-all \
build build-backend build-frontend build-backoffice \
test test-backend test-frontend test-backoffice test-e2e test-ci \
lint lint-backend lint-frontend lint-backoffice \
migrate prisma-generate \
install install-frontend install-backoffice install-playwright \
env clean stop \
db db-stop db-clean db-logs
# ---------------------------------------------------------------------------
# help — lista os targets e suas descrições
# ---------------------------------------------------------------------------
help:
@echo ""
@echo "$(CYAN)SaveInMed — Makefile$(RESET)"
@echo "════════════════════════════════════════════════════════════"
@echo "$(YELLOW)Banco de dados$(RESET)"
@echo " make db Sobe o PostgreSQL via Docker Compose"
@echo " make db-stop Para o container do PostgreSQL"
@echo " make db-clean Remove container + volume (⚠ apaga dados!)"
@echo " make db-logs Exibe logs do PostgreSQL"
@echo ""
@echo "$(YELLOW)Desenvolvimento$(RESET)"
@echo " make dev Sobe backend + frontend em paralelo (hot-reload)"
@echo " make dev-all Sobe backend + frontend + backoffice"
@echo " make dev-backend Servidor Go (port 8214)"
@echo " make dev-frontend Vite dev server (port 5173)"
@echo " make dev-backoffice NestJS com ts-node-dev (hot-reload)"
@echo ""
@echo "$(YELLOW)Build$(RESET)"
@echo " make build Build completo (Go + Vite + Nest)"
@echo " make build-backend Compila binário Go → $(BINARY_OUT)"
@echo " make build-frontend Vite build de produção → frontend/dist"
@echo " make build-backoffice tsc build Nest → backoffice/dist"
@echo ""
@echo "$(YELLOW)Testes$(RESET)"
@echo " make test ★ Roda TODOS os testes (unit + integração)"
@echo " make test-backend go test ./... -cover (Go, com cobertura)"
@echo " make test-frontend Vitest modo CI (sem watch)"
@echo " make test-backoffice Testes do NestJS (quando configurado)"
@echo " make test-e2e Playwright E2E (frontend + backend devem estar rodando)"
@echo " make test-ci Pipeline completo: lint + unit + e2e (usar em CI/CD)"
@echo " make install-playwright Instala browsers do Playwright (1ª vez)"
@echo ""
@echo "$(YELLOW)Lint$(RESET)"
@echo " make lint Lint em todos os serviços"
@echo " make lint-backend go vet + staticcheck"
@echo " make lint-frontend ESLint via pnpm"
@echo " make lint-backoffice ESLint do NestJS"
@echo ""
@echo "$(YELLOW)Infra / Utilitários$(RESET)"
@echo " make migrate Aplica migrações DDL do backend"
@echo " make prisma-generate Gera Prisma Client do backoffice"
@echo " make install Instala dependências de todos os serviços"
@echo " make env Copia .env.example → .env (onde existir)"
@echo " make clean Remove artefatos de build"
@echo " make stop Para processos do make dev"
@echo "════════════════════════════════════════════════════════════"
@echo ""
@echo "$(CYAN)Fluxo de CI/CD recomendado:$(RESET)"
@echo " 1. make install → instala dependências"
@echo " 2. make db → sobe o banco"
@echo " 3. make migrate → aplica migrações"
@echo " 4. make lint → verifica qualidade do código"
@echo " 5. make test → testes unitários e de integração"
@echo " 6. make dev-backend & → sobe o backend"
@echo " make test-e2e → testes end-to-end"
@echo ""
# =============================================================================
# BANCO DE DADOS (Docker)
# =============================================================================
# Inicia o container PostgreSQL em background.
db:
@echo "$(GREEN)▶ Iniciando PostgreSQL (Docker)...$(RESET)"
docker compose up -d db
@echo "$(GREEN)✔ Aguardando o banco ficar pronto...$(RESET)"
@docker compose exec db sh -c 'until pg_isready -U postgres -d saveinmed; do sleep 1; done'
@echo "$(GREEN)✔ PostgreSQL pronto na porta 55432$(RESET)"
# Para e remove o container (dados persistem no volume).
db-stop:
@echo "$(YELLOW)▶ Parando PostgreSQL...$(RESET)"
docker compose stop db
# Remove o container e o volume (dados perdidos!).
db-clean:
@echo "$(YELLOW)▶ Removendo container e volume do PostgreSQL...$(RESET)"
docker compose down -v
# Exibe os logs do container do banco.
db-logs:
docker compose logs -f db
# =============================================================================
# DESENVOLVIMENTO
# =============================================================================
# Sobe backend e frontend em paralelo — ideal para o dia a dia.
# O & em cada comando faz rodar em background; o wait aguarda ambos.
dev:
@echo "$(GREEN)▶ Subindo backend e frontend...$(RESET)"
@$(MAKE) dev-backend & \
$(MAKE) dev-frontend & \
wait
# Sobe os três serviços em paralelo.
dev-all:
@echo "$(GREEN)▶ Subindo backend, frontend e backoffice...$(RESET)"
@$(MAKE) dev-backend & \
$(MAKE) dev-frontend & \
$(MAKE) dev-backoffice & \
wait
# Roda o servidor Go. Não tem hot-reload nativo; use 'air' se quiser:
# go install github.com/cosmtrek/air@latest → cd backend && air
dev-backend:
@echo "$(GREEN)▶ Backend Go ($(BACKEND_DIR))$(RESET)"
cd $(BACKEND_DIR) && go run $(GO_ENTRYPOINT)
# Roda o Vite dev server com HMR.
dev-frontend:
@echo "$(GREEN)▶ Frontend Vite ($(FRONTEND_DIR))$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) dev
# Roda o NestJS com ts-node-dev (hot-reload automático em src/).
dev-backoffice:
@echo "$(GREEN)▶ Backoffice NestJS ($(BACKOFFICE_DIR))$(RESET)"
cd $(BACKOFFICE_DIR) && $(PKG_MGR) start:dev
# =============================================================================
# BUILD
# =============================================================================
# Compila todos os serviços.
build: build-backend build-frontend build-backoffice
@echo "$(GREEN)✔ Build completo concluído.$(RESET)"
# Compila o binário Go. O resultado fica em backend/bin/api.
# Ajuste GO_BUILD_FLAGS acima para adicionar -ldflags, -tags, etc.
build-backend:
@echo "$(GREEN)▶ Build backend Go → $(BINARY_OUT)$(RESET)"
mkdir -p $(BACKEND_DIR)/bin
cd $(BACKEND_DIR) && go build $(GO_BUILD_FLAGS) -o bin/$(BINARY_NAME) $(GO_ENTRYPOINT)
# Build de produção do React/Vite. Artefatos em frontend/dist/.
build-frontend:
@echo "$(GREEN)▶ Build frontend Vite$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) build
# Build de produção do NestJS. Artefatos em backoffice/dist/.
build-backoffice:
@echo "$(GREEN)▶ Build backoffice NestJS$(RESET)"
cd $(BACKOFFICE_DIR) && $(PKG_MGR) build
# =============================================================================
# TESTES
# =============================================================================
#
# Estrutura de testes do projeto:
#
# Backend (Go):
# - Testes de unidade: internal/usecase/*_test.go
# Cobrem: auth, shipping, orders, financials, cart, products
# - Testes de contrato: internal/http/handler/contract_test.go
# Documentam e verificam divergências frontend ↔ backend
# - Testes de handler: internal/http/handler/handler_test.go
# Cobrem todos os endpoints HTTP com mocks em memória
#
# Frontend (TypeScript/Vitest):
# - Testes de serviço: src/services/*.test.ts
# Cobrem chamadas de API e mapeamento de respostas
# - Testes de componente: src/components/*.test.tsx
# Cobrem renderização e interação de UI
# - Testes de contexto: src/context/*.test.tsx
# Cobrem AuthContext, ThemeContext
# - Testes de integração: src/tests/integration/apiContracts.test.ts
# Documentam divergências de contrato
#
# E2E (Playwright):
# - e2e/login.spec.ts → fluxo de autenticação
# - e2e/marketplace.spec.ts → marketplace e busca
# - e2e/checkout.spec.ts → checkout e pedidos
#
# =============================================================================
# Roda TODOS os testes de unidade + integração (sem e2e).
# Use este target em PRs e na maioria dos cenários de CI.
test: test-backend test-frontend test-backoffice
@echo "$(GREEN)✔ Todos os testes de unidade e integração concluídos.$(RESET)"
@echo " Para testes E2E, execute: make test-e2e"
# ─────────────────────────────────────────────
# Backend — Go
# ─────────────────────────────────────────────
# Executa todos os testes Go com relatório de cobertura.
# Inclui: testes de unidade (usecase), testes de contrato (handler/contract_test.go)
# e testes de handler (handler_test.go).
#
# Para detectar data races (recomendado em CI):
# make test-backend GO_TEST_FLAGS=-race
#
# Para ver cobertura em HTML:
# cd backend && go test ./... -coverprofile=coverage.out && go tool cover -html=coverage.out
test-backend:
@echo "$(GREEN)▶ Testes Go (backend)$(RESET)"
cd $(BACKEND_DIR) && go test $(GO_TEST_FLAGS) ./... -cover
# ─────────────────────────────────────────────
# Frontend — Vitest (modo CI, sem watch)
# ─────────────────────────────────────────────
# Executa todos os testes Vitest uma vez e encerra (modo CI).
# Inclui: unit tests de serviços, componentes, contextos e integração.
#
# Para ver cobertura HTML:
# make test-frontend-coverage
#
# Para modo watch (desenvolvimento):
# cd frontend && pnpm test
test-frontend:
@echo "$(GREEN)▶ Testes frontend (Vitest — modo CI)$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) run test:run
# Testes frontend com relatório de cobertura (HTML + texto).
test-frontend-coverage:
@echo "$(GREEN)▶ Cobertura de testes frontend$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) run test:coverage
# ─────────────────────────────────────────────
# Backoffice — NestJS
# ─────────────────────────────────────────────
# Testes do NestJS. Adicione "test": "jest" no backoffice/package.json
# quando configurar o Jest. Por ora exibe instruções.
#
# Para ativar:
# 1. Instale Jest no backoffice: cd backoffice && pnpm add -D jest @types/jest ts-jest
# 2. Adicione "test": "jest" no backoffice/package.json
# 3. Remova o echo abaixo e descomente a linha do pnpm
test-backoffice:
@echo "$(YELLOW)⚠ Testes do backoffice NestJS: ainda não configurados.$(RESET)"
@echo " Para ativar, adicione 'test': 'jest' no backoffice/package.json."
@echo " Então substitua este target por:"
@echo " cd $(BACKOFFICE_DIR) && $(PKG_MGR) test"
# ─────────────────────────────────────────────
# E2E — Playwright
# ─────────────────────────────────────────────
# Executa os testes end-to-end com Playwright.
#
# PRÉ-REQUISITO: frontend e backend devem estar rodando antes de executar este target.
# O playwright.config.ts está configurado para subir o frontend automaticamente
# via webServer, mas o backend precisa estar rodando manualmente:
#
# Opção 1 — Manual:
# Terminal 1: make dev-backend
# Terminal 2: make test-e2e
#
# Opção 2 — Automático com make:
# make test-e2e-full (sobe backend, roda e2e, derruba backend)
#
# Variáveis de ambiente úteis:
# E2E_BASE_URL=http://localhost:5173 (URL do frontend)
# E2E_ADMIN_USER=admin (usuário admin para testes)
# E2E_ADMIN_PASS=admin123 (senha admin para testes)
#
# Para instalar os browsers na primeira vez: make install-playwright
test-e2e:
@echo "$(GREEN)▶ Testes E2E (Playwright)$(RESET)"
@echo " Certifique-se de que o backend está rodando em localhost:8214"
cd $(FRONTEND_DIR) && $(PKG_MGR) e2e
# Variante interativa — abre o Playwright UI para debug visual.
test-e2e-ui:
@echo "$(GREEN)▶ Playwright UI (debug interativo)$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) e2e:ui
# Sobe o backend em background, roda os testes E2E, derruba o backend.
# Útil em CI quando o backend precisa ser iniciado automaticamente.
#
# Nota: o frontend é gerenciado pelo playwright.config.ts (webServer).
test-e2e-full:
@echo "$(GREEN)▶ E2E completo: sobe backend → roda e2e → derruba backend$(RESET)"
cd $(BACKEND_DIR) && go run $(GO_ENTRYPOINT) & \
BACKEND_PID=$$!; \
sleep 3; \
cd $(FRONTEND_DIR) && $(PKG_MGR) e2e; \
E2E_STATUS=$$?; \
kill $$BACKEND_PID 2>/dev/null || true; \
exit $$E2E_STATUS
# Instala os browsers do Playwright (necessário apenas na primeira vez).
# Execute este comando antes de rodar os testes E2E em uma nova máquina ou CI.
install-playwright:
@echo "$(GREEN)▶ Instalando browsers do Playwright$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) exec playwright install --with-deps
# ─────────────────────────────────────────────
# Pipeline completo de CI/CD
# ─────────────────────────────────────────────
# Pipeline completo: lint + testes de unidade + testes E2E.
# Use este target no CI/CD (GitHub Actions, GitLab CI, etc.):
#
# jobs:
# test:
# steps:
# - run: make install
# - run: make db
# - run: make migrate
# - run: make test-ci
#
# Para rodar só os testes de unidade sem E2E (mais rápido em PRs):
# make test
test-ci: lint test test-e2e-full
@echo "$(GREEN)✔ Pipeline de CI completo: lint + unit tests + e2e — PASSOU.$(RESET)"
# =============================================================================
# LINT
# =============================================================================
# Lint em todos os serviços.
lint: lint-backend lint-frontend lint-backoffice
# go vet + staticcheck (se instalado). Para instalar staticcheck:
# go install honnef.co/go/tools/cmd/staticcheck@latest
lint-backend:
@echo "$(GREEN)▶ Lint backend Go$(RESET)"
cd $(BACKEND_DIR) && go vet ./...
@which staticcheck > /dev/null 2>&1 && \
(cd $(BACKEND_DIR) && staticcheck ./...) || \
echo "$(YELLOW) staticcheck não instalado — pulando análise estática$(RESET)"
# ESLint do frontend (se houver script lint configurado no package.json).
lint-frontend:
@echo "$(GREEN)▶ Lint frontend$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) run lint 2>/dev/null || \
echo "$(YELLOW) Script 'lint' não encontrado em $(FRONTEND_DIR)/package.json$(RESET)"
# ESLint do NestJS — usa eslint configurado no backoffice.
lint-backoffice:
@echo "$(GREEN)▶ Lint backoffice NestJS$(RESET)"
cd $(BACKOFFICE_DIR) && $(PKG_MGR) run lint
# =============================================================================
# INFRA / UTILITÁRIOS
# =============================================================================
# Aplica as migrações DDL do backend Go.
migrate:
@echo "$(GREEN)▶ Aplicando migrações Do backend$(RESET)"
cd $(BACKEND_DIR) && go run ./cmd/apply_migration
# Regenera o Prisma Client do backoffice após alterações no schema.prisma.
prisma-generate:
@echo "$(GREEN)▶ Gerando Prisma Client$(RESET)"
cd $(BACKOFFICE_DIR) && $(PKG_MGR) run prisma:generate
# Instala dependências de todos os serviços.
# As dependências Go são gerenciadas pelo go.mod (go mod download automático).
# O Playwright precisa de uma etapa adicional (make install-playwright) para
# baixar os browsers binários — necessário apenas na primeira vez.
install: install-frontend install-backoffice
@echo "$(GREEN)▶ Baixando módulos Go$(RESET)"
cd $(BACKEND_DIR) && go mod download
@echo "$(GREEN)✔ Todas as dependências instaladas.$(RESET)"
@echo "$(YELLOW) Dica: execute 'make install-playwright' para instalar os browsers do Playwright$(RESET)"
@echo "$(YELLOW) (necessário apenas na primeira vez ou em CI)$(RESET)"
install-frontend:
@echo "$(GREEN)▶ Instalando dependências do frontend$(RESET)"
cd $(FRONTEND_DIR) && $(PKG_MGR) install
install-backoffice:
@echo "$(GREEN)▶ Instalando dependências do backoffice$(RESET)"
cd $(BACKOFFICE_DIR) && $(PKG_MGR) install
# Copia arquivos .env.example → .env para cada serviço (sem sobrescrever).
# Crie os .env.example em cada pasta para ativar este target.
env:
@for dir in $(BACKEND_DIR) $(FRONTEND_DIR) $(BACKOFFICE_DIR); do \
if [ -f "$$dir/.env.example" ] && [ ! -f "$$dir/.env" ]; then \
cp "$$dir/.env.example" "$$dir/.env"; \
echo "$(GREEN)$$dir/.env criado a partir de .env.example$(RESET)"; \
elif [ -f "$$dir/.env.example" ]; then \
echo "$(YELLOW)$$dir/.env já existe — não sobrescrito$(RESET)"; \
else \
echo "$(YELLOW) $$dir/.env.example não encontrado — pulando$(RESET)"; \
fi \
done
# Remove todos os artefatos de build.
clean:
@echo "$(GREEN)▶ Limpando artefatos...$(RESET)"
rm -rf $(BACKEND_DIR)/bin
rm -rf $(FRONTEND_DIR)/dist
rm -rf $(BACKOFFICE_DIR)/dist
@echo "$(GREEN)✔ Artefatos removidos.$(RESET)"
# Para processos do make dev (salva PIDs em .dev.pids).
# Uso: make dev-bg para subir em background gravando PIDs,
# make stop para matar os processos.
#
# Nota: 'make dev' usa wait/& diretamente, então Ctrl+C já encerra tudo.
# Este target é útil se você subir os serviços manualmente em background.
stop:
@if [ -f .dev.pids ]; then \
echo "$(GREEN)▶ Parando processos...$(RESET)"; \
xargs kill < .dev.pids 2>/dev/null || true; \
rm -f .dev.pids; \
echo "$(GREEN)✔ Processos encerrados.$(RESET)"; \
else \
echo "$(YELLOW) Nenhum arquivo .dev.pids encontrado.$(RESET)"; \
echo " Use Ctrl+C para parar 'make dev', ou mate os processos manualmente."; \
fi