#!/bin/bash # STUPA PDF API Development Helper Script # This script provides convenient commands for development tasks set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Project directories PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BACKEND_DIR="${PROJECT_ROOT}/backend" FRONTEND_DIR="${PROJECT_ROOT}/frontend" # Function to display usage usage() { echo -e "${GREEN}STUPA PDF API Development Helper${NC}" echo "=================================" echo "" echo "Usage: $0 [command] [options]" echo "" echo "Commands:" echo " start Start all services" echo " stop Stop all services" echo " restart Restart all services" echo " status Show status of all services" echo " logs [service] Show logs (optionally for specific service)" echo " build [service] Build services (optionally specific service)" echo " shell [service] Open shell in service container" echo " db Open MySQL client" echo " migrate Run database migrations" echo " reset Reset everything (WARNING: deletes data)" echo " test Run tests" echo " lint Run linters" echo " format Format code" echo " clean Clean up temporary files and caches" echo "" echo "Services: api, frontend, db, adminer" echo "" echo "Examples:" echo " $0 start # Start all services" echo " $0 logs api # Show API logs" echo " $0 shell frontend # Open shell in frontend container" echo " $0 db # Connect to database" } # Check if docker compose is available check_docker() { if ! command -v docker &> /dev/null; then echo -e "${RED}Docker is not installed${NC}" exit 1 fi } # Start services start_services() { echo -e "${GREEN}Starting all services...${NC}" cd "${PROJECT_ROOT}" docker compose up -d echo -e "${GREEN}Services started!${NC}" echo "" echo "Access points:" echo " Frontend: http://localhost:3000" echo " API: http://localhost:8000" echo " API Docs: http://localhost:8000/docs" echo " Adminer: http://localhost:8080" } # Stop services stop_services() { echo -e "${YELLOW}Stopping all services...${NC}" cd "${PROJECT_ROOT}" docker compose down echo -e "${GREEN}Services stopped!${NC}" } # Restart services restart_services() { echo -e "${YELLOW}Restarting all services...${NC}" cd "${PROJECT_ROOT}" docker compose restart echo -e "${GREEN}Services restarted!${NC}" } # Show status show_status() { echo -e "${BLUE}Service Status:${NC}" cd "${PROJECT_ROOT}" docker compose ps } # Show logs show_logs() { cd "${PROJECT_ROOT}" if [ -z "$1" ]; then docker compose logs -f else docker compose logs -f "$1" fi } # Build services build_services() { cd "${PROJECT_ROOT}" if [ -z "$1" ]; then echo -e "${GREEN}Building all services...${NC}" docker compose build else echo -e "${GREEN}Building $1...${NC}" docker compose build "$1" fi echo -e "${GREEN}Build complete!${NC}" } # Open shell in container open_shell() { if [ -z "$1" ]; then echo -e "${RED}Please specify a service${NC}" echo "Available services: api, frontend, db, adminer" exit 1 fi cd "${PROJECT_ROOT}" case "$1" in api) docker compose exec api /bin/bash ;; frontend) docker compose exec frontend /bin/sh ;; db) docker compose exec db /bin/bash ;; adminer) docker compose exec adminer /bin/sh ;; *) echo -e "${RED}Unknown service: $1${NC}" exit 1 ;; esac } # Connect to database connect_db() { echo -e "${BLUE}Connecting to database...${NC}" cd "${PROJECT_ROOT}" # Load .env file if [ -f .env ]; then export $(cat .env | grep -v '^#' | xargs) fi docker compose exec db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} } # Run migrations run_migrations() { echo -e "${GREEN}Running database migrations...${NC}" cd "${PROJECT_ROOT}" # Load .env file if [ -f .env ]; then export $(cat .env | grep -v '^#' | xargs) fi # Find all migration files for migration in ${BACKEND_DIR}/src/migrations/*.sql; do if [ -f "$migration" ]; then echo -e "${BLUE}Applying $(basename "$migration")...${NC}" docker compose exec -T db mysql -u root -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DB} < "$migration" 2>/dev/null || true fi done echo -e "${GREEN}Migrations complete!${NC}" } # Reset everything reset_all() { echo -e "${RED}WARNING: This will delete all data!${NC}" read -p "Are you sure? (yes/NO): " -r echo if [[ $REPLY == "yes" ]]; then cd "${PROJECT_ROOT}" echo -e "${YELLOW}Stopping services...${NC}" docker compose down -v echo -e "${YELLOW}Removing images...${NC}" docker compose down --rmi local echo -e "${GREEN}Reset complete!${NC}" else echo "Aborted." fi } # Run tests run_tests() { echo -e "${GREEN}Running tests...${NC}" # Backend tests if [ -d "${BACKEND_DIR}/tests" ]; then echo -e "${BLUE}Running backend tests...${NC}" cd "${PROJECT_ROOT}" docker compose exec api pytest fi # Frontend tests if [ -f "${FRONTEND_DIR}/package.json" ]; then echo -e "${BLUE}Running frontend tests...${NC}" cd "${PROJECT_ROOT}" docker compose exec frontend npm test fi echo -e "${GREEN}Tests complete!${NC}" } # Run linters run_lint() { echo -e "${GREEN}Running linters...${NC}" # Backend linting echo -e "${BLUE}Linting backend...${NC}" cd "${PROJECT_ROOT}" docker compose exec api flake8 src/ || true docker compose exec api mypy src/ || true # Frontend linting echo -e "${BLUE}Linting frontend...${NC}" docker compose exec frontend npm run lint || true echo -e "${GREEN}Linting complete!${NC}" } # Format code format_code() { echo -e "${GREEN}Formatting code...${NC}" # Backend formatting echo -e "${BLUE}Formatting backend...${NC}" cd "${PROJECT_ROOT}" docker compose exec api black src/ docker compose exec api isort src/ # Frontend formatting echo -e "${BLUE}Formatting frontend...${NC}" docker compose exec frontend npm run format || true echo -e "${GREEN}Formatting complete!${NC}" } # Clean up clean_up() { echo -e "${YELLOW}Cleaning up...${NC}" # Python cache find "${BACKEND_DIR}" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true find "${BACKEND_DIR}" -type f -name "*.pyc" -delete 2>/dev/null || true # Node modules (if you want to clean them) # rm -rf "${FRONTEND_DIR}/node_modules" # Docker cleanup docker system prune -f echo -e "${GREEN}Cleanup complete!${NC}" } # Main script logic check_docker case "$1" in start) start_services ;; stop) stop_services ;; restart) restart_services ;; status) show_status ;; logs) show_logs "$2" ;; build) build_services "$2" ;; shell) open_shell "$2" ;; db) connect_db ;; migrate) run_migrations ;; reset) reset_all ;; test) run_tests ;; lint) run_lint ;; format) format_code ;; clean) clean_up ;; *) usage ;; esac