#!/bin/bash # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Parse command line arguments SEED_DB=false SHOW_HELP=false while [[ $# -gt 0 ]]; do case $1 in --seed|-s) SEED_DB=true shift ;; --help|-h) SHOW_HELP=true shift ;; *) echo -e "${RED}Unknown option: $1${NC}" SHOW_HELP=true shift ;; esac done # Show help if [ "$SHOW_HELP" = true ]; then echo -e "${BLUE}Work Allocation System - Startup Script${NC}" echo "" echo "Usage: ./start_application.sh [OPTIONS]" echo "" echo "Options:" echo " -s, --seed Seed the database with sample data" echo " -h, --help Show this help message" echo "" echo "Examples:" echo " ./start_application.sh # Start the application" echo " ./start_application.sh --seed # Seed database and start" echo "" exit 0 fi # Check if Deno is installed if ! command -v deno &> /dev/null; then echo -e "${RED}✗ Deno is not installed!${NC}" echo "" echo -e "${YELLOW}Please install Deno first:${NC}" echo -e "${GREEN} curl -fsSL https://deno.land/install.sh | sh${NC}" echo "" exit 1 fi echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} Work Allocation System Startup${NC}" echo -e "${BLUE}========================================${NC}" echo "" # Get the script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Check if MySQL database is running echo -e "${YELLOW}Checking database connection...${NC}" # Try to connect to MySQL using docker exec (most reliable for this setup) check_db_connection() { if command -v docker &> /dev/null; then docker exec work_allocation_db mysql -u root -padmin123 -e "SELECT 1" &> /dev/null return $? elif command -v mysql &> /dev/null; then mysql -h localhost -P 3306 -u root -padmin123 -e "SELECT 1" &> /dev/null return $? else # Try using nc to check if port is open nc -z localhost 3306 &> /dev/null return $? fi } # Retry logic for database connection MAX_RETRIES=10 RETRY_DELAY=3 RETRY_COUNT=0 while ! check_db_connection; do RETRY_COUNT=$((RETRY_COUNT + 1)) if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then echo -e "${RED}✗ Database is not running after $MAX_RETRIES attempts!${NC}" echo "" echo -e "${YELLOW}Please start the database first by running:${NC}" echo -e "${GREEN} docker-compose up${NC}" echo "" echo -e "${YELLOW}Or in detached mode:${NC}" echo -e "${GREEN} docker-compose up -d${NC}" echo "" echo -e "Then run this script again." exit 1 fi echo -e "${YELLOW}⏳ Waiting for database... (attempt $RETRY_COUNT/$MAX_RETRIES)${NC}" sleep $RETRY_DELAY done echo -e "${GREEN}✓ Database is running${NC}" # Check if database is seeded check_db_seeded() { local result if command -v docker &> /dev/null; then result=$(docker exec work_allocation_db mysql -u root -padmin123 -N -e "SELECT COUNT(*) FROM work_allocation.users WHERE username='admin'" 2>/dev/null) elif command -v mysql &> /dev/null; then result=$(mysql -h localhost -P 3306 -u root -padmin123 -N -e "SELECT COUNT(*) FROM work_allocation.users WHERE username='admin'" 2>/dev/null) fi if [ "$result" = "1" ]; then return 0 # Seeded else return 1 # Not seeded fi } echo -e "${YELLOW}Checking if database is seeded...${NC}" if check_db_seeded; then echo -e "${GREEN}✓ Database is seeded${NC}" DB_SEEDED=true else echo -e "${YELLOW}⚠ Database is NOT seeded${NC}" DB_SEEDED=false if [ "$SEED_DB" = false ]; then echo "" echo -e "${CYAN}The database has no data. You have two options:${NC}" echo "" echo -e " 1. Run with --seed flag to seed the database:" echo -e " ${GREEN}./start_application.sh --seed${NC}" echo "" echo -e " 2. Or continue without seeding (you'll need to create users manually)" echo "" read -p "Do you want to seed the database now? (y/N): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then SEED_DB=true fi fi fi echo "" # Seed database if requested if [ "$SEED_DB" = true ]; then echo -e "${YELLOW}Seeding database...${NC}" echo "" # Run Deno seed script cd "$SCRIPT_DIR/backend-deno" deno task seed SEED_STATUS=$? if [ $SEED_STATUS -eq 0 ]; then echo -e "${GREEN}✓ Database seeded successfully${NC}" else echo -e "${RED}✗ Database seeding failed${NC}" exit 1 fi echo "" fi # Check if frontend node_modules exist if [ ! -d "$SCRIPT_DIR/node_modules" ]; then echo -e "${YELLOW}Installing frontend dependencies...${NC}" cd "$SCRIPT_DIR" && npm install fi # Function to cleanup on exit cleanup() { echo "" echo -e "${YELLOW}Shutting down services...${NC}" # Kill background processes if [ ! -z "$BACKEND_PID" ]; then kill $BACKEND_PID 2>/dev/null echo -e "${GREEN}✓ Backend stopped${NC}" fi if [ ! -z "$FRONTEND_PID" ]; then kill $FRONTEND_PID 2>/dev/null echo -e "${GREEN}✓ Frontend stopped${NC}" fi echo -e "${BLUE}Goodbye!${NC}" exit 0 } # Set up trap to catch Ctrl+C trap cleanup SIGINT SIGTERM # Start Backend echo -e "${YELLOW}Starting Deno Backend Server...${NC}" cd "$SCRIPT_DIR/backend-deno" deno task dev > "$SCRIPT_DIR/backend.log" 2>&1 & BACKEND_PID=$! # Wait a moment for backend to start sleep 2 # Check if backend started successfully if ps -p $BACKEND_PID > /dev/null 2>&1; then echo -e "${GREEN}✓ Backend running on http://localhost:3000${NC}" else echo -e "${RED}✗ Backend failed to start. Check backend.log for details${NC}" exit 1 fi # Start Frontend echo -e "${YELLOW}Starting Frontend Server...${NC}" cd "$SCRIPT_DIR" npm run dev > "$SCRIPT_DIR/frontend.log" 2>&1 & FRONTEND_PID=$! # Wait a moment for frontend to start sleep 3 # Check if frontend started successfully if ps -p $FRONTEND_PID > /dev/null 2>&1; then echo -e "${GREEN}✓ Frontend running on http://localhost:5173${NC}" else echo -e "${RED}✗ Frontend failed to start. Check frontend.log for details${NC}" kill $BACKEND_PID 2>/dev/null exit 1 fi echo "" echo -e "${BLUE}========================================${NC}" echo -e "${GREEN} Application Started Successfully!${NC}" echo -e "${BLUE}========================================${NC}" echo "" echo -e " ${BLUE}Frontend:${NC} http://localhost:5173" echo -e " ${BLUE}Backend:${NC} http://localhost:3000" echo -e " ${BLUE}Database:${NC} localhost:3306" echo -e " ${BLUE}Runtime:${NC} Deno (TypeScript)" echo "" echo -e " ${YELLOW}Logs:${NC}" echo -e " Backend: $SCRIPT_DIR/backend.log" echo -e " Frontend: $SCRIPT_DIR/frontend.log" echo "" echo -e "${YELLOW}Press Ctrl+C to stop all services${NC}" echo "" # Wait for processes wait $BACKEND_PID $FRONTEND_PID