# ============================================================================= # SaveInMed — Makefile # ============================================================================= # Requisitos: # - Go 1.23+ (backend) # - pnpm (frontend e backoffice) → se preferir npm/yarn, ajuste PKG_MGR # - Node 20+ (frontend e backoffice) # # Uso rápido: # make dev → sobe backend + frontend em paralelo # make dev-all → sobe backend + frontend + backoffice em paralelo # make build → build de todos os serviços # make test → testes de todos os serviços # make help → lista todos os targets disponíveis # ============================================================================= # --------------------------------------------------------------------------- # 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 \ lint lint-backend lint-frontend lint-backoffice \ migrate prisma-generate \ install install-frontend install-backoffice \ env clean stop # --------------------------------------------------------------------------- # help — lista os targets e suas descrições # --------------------------------------------------------------------------- help: @echo "" @echo "$(CYAN)SaveInMed — Makefile$(RESET)" @echo "────────────────────────────────────────────────────────────" @echo "$(YELLOW)Desenvolvimento$(RESET)" @echo " make dev Sobe backend + frontend em paralelo" @echo " make dev-all Sobe backend + frontend + backoffice" @echo " make dev-backend Servidor Go (hot-reload manual)" @echo " make dev-frontend Vite dev server" @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 o 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" @echo " make test-backend go test ./..." @echo " make test-frontend vitest (via pnpm test)" @echo " make test-backoffice (configura scripts de test no Nest)" @echo "" @echo "$(YELLOW)Lint$(RESET)" @echo " make lint Lint em todos os serviços" @echo " make lint-backend go vet + staticcheck (se instalado)" @echo " make lint-frontend eslint via pnpm (se configurado)" @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 Mata processos iniciados por make dev" @echo "────────────────────────────────────────────────────────────" @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 # ============================================================================= # Roda todos os testes. test: test-backend test-frontend test-backoffice # Testes do Go com cobertura. Ajuste GO_TEST_FLAGS acima (ex.: -race). test-backend: @echo "$(GREEN)▶ Testes Go$(RESET)" cd $(BACKEND_DIR) && go test $(GO_TEST_FLAGS) ./... -cover # Testes do React com Vitest (modo CI — sem modo watch). test-frontend: @echo "$(GREEN)▶ Testes frontend (vitest)$(RESET)" cd $(FRONTEND_DIR) && $(PKG_MGR) run test --run # Testes do NestJS. Adicione "test": "jest" no backoffice/package.json # quando configurar o Jest. Por ora exibe instrução. test-backoffice: @echo "$(YELLOW)⚠ Testes do backoffice não configurados.$(RESET)" @echo " Adicione 'test': 'jest' no backoffice/package.json e execute:" @echo " cd $(BACKOFFICE_DIR) && $(PKG_MGR) test" # ============================================================================= # 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 Node. # As dependências Go são gerenciadas pelo go.mod (go mod download automático). 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)" 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