- remove backend-old (Medusa), saveinmed-frontend (Next.js/Appwrite) and marketplace dirs - split Go usecases by domain and move notifications/payments to infrastructure - reorganize frontend pages into auth, dashboard and marketplace modules - add Makefile, docker-compose.yml and architecture docs
318 lines
12 KiB
Makefile
318 lines
12 KiB
Makefile
# =============================================================================
|
||
# 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 <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 \
|
||
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
|