#!/bin/bash # SaveInMed Development Startup Script # Permite iniciar um ou mais serviços do projeto # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Diretório raiz do projeto PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Função para exibir o banner show_banner() { echo -e "${CYAN}" echo "╔══════════════════════════════════════════════════╗" echo "║ ║" echo "║ ███████ █████ ██ ██ ███████ ██ ███ ██ ║" echo "║ ██ ██ ██ ██ ██ ██ ██ ████ ██ ║" echo "║ ███████ ███████ ██ ██ █████ ██ ██ ██ ██ ║" echo "║ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ║" echo "║ ███████ ██ ██ ████ ███████ ██ ██ ████ ║" echo "║ ║" echo "║ ███ ███ ███████ ██████ ║" echo "║ ████ ████ ██ ██ ██ ║" echo "║ ██ ████ ██ █████ ██ ██ ║" echo "║ ██ ██ ██ ██ ██ ██ ║" echo "║ ██ ██ ███████ ██████ ║" echo "║ ║" echo "║ Development Startup Script ║" echo "║ ║" echo "╚══════════════════════════════════════════════════╝" echo -e "${NC}" } # Função para verificar dependências check_dependency() { local cmd=$1 local name=$2 if command -v "$cmd" &> /dev/null; then echo -e " ${GREEN}✓${NC} $name" return 0 else echo -e " ${RED}✗${NC} $name (não instalado)" return 1 fi } # Função para instalar Go install_go() { echo -e "${YELLOW}📦 Instalando Go...${NC}" curl -fsSL https://go.dev/dl/go1.24.3.linux-amd64.tar.gz -o /tmp/go.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf /tmp/go.tar.gz export PATH=$PATH:/usr/local/go/bin echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.zshrc rm /tmp/go.tar.gz echo -e "${GREEN}✓ Go instalado com sucesso${NC}" } # Função para instalar Node.js install_node() { echo -e "${YELLOW}📦 Instalando Node.js...${NC}" curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs echo -e "${GREEN}✓ Node.js instalado com sucesso${NC}" } # Função para instalar pnpm install_pnpm() { echo -e "${YELLOW}📦 Instalando pnpm...${NC}" npm install -g pnpm echo -e "${GREEN}✓ pnpm instalado com sucesso${NC}" } # Função para instalar Deno install_deno() { echo -e "${YELLOW}📦 Instalando Deno...${NC}" curl -fsSL https://deno.land/install.sh | sh export DENO_INSTALL="$HOME/.deno" export PATH="$DENO_INSTALL/bin:$PATH" echo 'export DENO_INSTALL="$HOME/.deno"' >> ~/.zshrc echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.zshrc echo -e "${GREEN}✓ Deno instalado com sucesso${NC}" } # Função para instalar tmux install_tmux() { echo -e "${YELLOW}📦 Instalando tmux...${NC}" sudo apt-get update && sudo apt-get install -y tmux echo -e "${GREEN}✓ tmux instalado com sucesso${NC}" } # Função para verificar e instalar dependência ensure_dependency() { local cmd=$1 local name=$2 local install_func=$3 if ! command -v "$cmd" &> /dev/null; then echo -e "${RED}✗ $name não está instalado${NC}" read -p "Deseja instalar $name agora? (s/n): " install_choice if [[ "$install_choice" =~ ^[Ss]$ ]]; then $install_func return 0 else echo -e "${RED}Não é possível continuar sem $name${NC}" return 1 fi fi return 0 } # Função para iniciar o Backend Go start_backend() { echo -e "\n${BLUE}🚀 Iniciando Backend Go...${NC}" # Verificar/instalar Go ensure_dependency "go" "Go" "install_go" || return 1 cd "$PROJECT_ROOT/backend" # Carregar variáveis de ambiente se existir .env if [ -f ".env" ]; then echo -e "${GREEN} ✓ Carregando variáveis de .env${NC}" export $(grep -v '^#' .env | xargs) else echo -e "${YELLOW} ⚠ Arquivo .env não encontrado, usando valores padrão${NC}" fi # Baixar dependências se necessário if [ ! -f "go.sum" ]; then echo -e "${YELLOW} 📦 Baixando dependências Go...${NC}" go mod download fi echo -e "${GREEN} ▶ Executando: go run ./cmd/api${NC}" echo -e "${CYAN} 📍 API disponível em: http://localhost:${PORT:-8214}${NC}" echo -e "${CYAN} 📚 Swagger UI: http://localhost:${PORT:-8214}/swagger/index.html${NC}\n" go run ./cmd/api } # Função para iniciar o Backoffice NestJS start_backoffice() { echo -e "\n${PURPLE}🚀 Iniciando Backoffice NestJS...${NC}" # Verificar/instalar Node.js ensure_dependency "node" "Node.js" "install_node" || return 1 # Verificar/instalar pnpm if ! command -v pnpm &> /dev/null; then read -p "pnpm não encontrado. Deseja instalar? (s/n): " install_choice if [[ "$install_choice" =~ ^[Ss]$ ]]; then install_pnpm fi fi cd "$PROJECT_ROOT/backoffice" # Determinar gerenciador de pacotes (pnpm ou npm) if command -v pnpm &> /dev/null; then PKG_MANAGER="pnpm" else PKG_MANAGER="npm" echo -e "${YELLOW} ⚠ pnpm não encontrado, usando npm${NC}" fi # Instalar dependências se necessário if [ ! -d "node_modules" ]; then echo -e "${YELLOW} 📦 Instalando dependências...${NC}" $PKG_MANAGER install fi # Gerar Prisma client if [ -f "prisma/schema.prisma" ]; then echo -e "${YELLOW} 🔧 Gerando Prisma client...${NC}" $PKG_MANAGER run prisma:generate 2>/dev/null || npx prisma generate fi echo -e "${GREEN} ▶ Executando: $PKG_MANAGER run start:dev${NC}" echo -e "${CYAN} 📍 Backoffice disponível em: http://localhost:3000${NC}" echo -e "${CYAN} 📚 Swagger: http://localhost:3000/api${NC}\n" $PKG_MANAGER run start:dev } # Função para iniciar o Marketplace React start_marketplace() { echo -e "\n${BLUE}🚀 Iniciando Marketplace React...${NC}" # Verificar/instalar Node.js ensure_dependency "node" "Node.js" "install_node" || return 1 cd "$PROJECT_ROOT/marketplace" # Instalar dependências se necessário if [ ! -d "node_modules" ]; then echo -e "${YELLOW} 📦 Instalando dependências...${NC}" npm install fi echo -e "${GREEN} ▶ Executando: npm run dev${NC}" echo -e "${CYAN} 📍 Marketplace disponível em: http://localhost:5173${NC}\n" npm run dev } # Função para iniciar o Website Fresh/Deno start_website() { echo -e "\n${GREEN}🚀 Iniciando Website (Fresh/Deno)...${NC}" # Verificar/instalar Deno ensure_dependency "deno" "Deno" "install_deno" || return 1 cd "$PROJECT_ROOT/website" echo -e "${GREEN} ▶ Executando: deno task dev${NC}" echo -e "${CYAN} 📍 Website disponível em: http://localhost:8000${NC}\n" deno task dev } # Função para exibir o menu show_menu() { echo -e "\n${YELLOW}Selecione o serviço para iniciar:${NC}\n" echo -e " ${BLUE}1)${NC} Backend Go ${CYAN}(porta 8214)${NC}" echo -e " ${BLUE}2)${NC} Backoffice NestJS ${CYAN}(porta 3000)${NC}" echo -e " ${BLUE}3)${NC} Marketplace React ${CYAN}(porta 5173)${NC}" echo -e " ${BLUE}4)${NC} Website Fresh/Deno ${CYAN}(porta 8000)${NC}" echo -e "" echo -e " ${GREEN}5)${NC} Iniciar Todos os Serviços" echo -e "" echo -e " ${RED}0)${NC} Sair" echo -e "" } # Função para iniciar todos os serviços em terminais separados start_all_services() { echo -e "\n${GREEN}🚀 Iniciando todos os serviços...${NC}\n" # Verificar/instalar tmux ensure_dependency "tmux" "tmux" "install_tmux" || return 1 # Matar sessão anterior se existir tmux kill-session -t saveinmed 2>/dev/null || true tmux new-session -d -s saveinmed -n backend "cd $PROJECT_ROOT && ./start.sh --backend" tmux new-window -t saveinmed -n backoffice "cd $PROJECT_ROOT && ./start.sh --backoffice" tmux new-window -t saveinmed -n marketplace "cd $PROJECT_ROOT && ./start.sh --marketplace" tmux new-window -t saveinmed -n website "cd $PROJECT_ROOT && ./start.sh --website" echo -e "${GREEN}✓ Serviços iniciados em sessão tmux 'saveinmed'${NC}" echo -e "${CYAN} Use 'tmux attach -t saveinmed' para acessar${NC}" echo -e "${CYAN} Use Ctrl+B + número para trocar de janela${NC}\n" tmux attach -t saveinmed } # Processar argumentos de linha de comando if [ $# -gt 0 ]; then case "$1" in --backend|-b|1) start_backend exit 0 ;; --backoffice|-o|2) start_backoffice exit 0 ;; --marketplace|-m|3) start_marketplace exit 0 ;; --website|-w|4) start_website exit 0 ;; --all|-a|5) show_banner start_all_services exit 0 ;; --help|-h) show_banner echo "Uso: $0 [OPÇÃO]" echo "" echo "Opções:" echo " --backend, -b, 1 Iniciar Backend Go (porta 8214)" echo " --backoffice, -o, 2 Iniciar Backoffice NestJS (porta 3000)" echo " --marketplace, -m, 3 Iniciar Marketplace React (porta 5173)" echo " --website, -w, 4 Iniciar Website Deno (porta 8000)" echo " --all, -a, 5 Iniciar todos os serviços" echo " --help, -h Mostrar esta ajuda" echo "" exit 0 ;; *) echo -e "${RED}Opção inválida: $1${NC}" echo "Use --help para ver as opções disponíveis" exit 1 ;; esac fi # Menu interativo show_banner echo -e "${YELLOW}Verificando dependências...${NC}" echo "" check_dependency "go" "Go" check_dependency "node" "Node.js" check_dependency "npm" "npm" check_dependency "pnpm" "pnpm (opcional, usa npm como fallback)" check_dependency "deno" "Deno" check_dependency "tmux" "tmux (para iniciar todos)" echo "" while true; do show_menu read -p "Opção: " choice case $choice in 1) start_backend break ;; 2) start_backoffice break ;; 3) start_marketplace break ;; 4) start_website break ;; 5) start_all_services break ;; 0) echo -e "\n${GREEN}👋 Até logo!${NC}\n" exit 0 ;; *) echo -e "${RED}Opção inválida. Tente novamente.${NC}" ;; esac done