# ============================================================================= # 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 ) 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