#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" WEBAPI_PROJECT="$ROOT_DIR/Events.WebAPI/Events.WebAPI.csproj" FILESAPI_PROJECT="$ROOT_DIR/Events.FilesAPI/Events.FilesAPI.csproj" CLIENTAPP_DIR="$ROOT_DIR/Events.ClientApp" pids=() start_process() { if command -v setsid >/dev/null 2>&1; then setsid "$@" & else "$@" & fi pids+=($!) } stop_process() { local signal="$1" local pid="$2" kill "-$signal" -- "-$pid" 2>/dev/null || kill "-$signal" "$pid" 2>/dev/null || true } cleanup() { local exit_code=$? trap - INT TERM EXIT if ((${#pids[@]} > 0)); then echo echo "Stopping Events stack..." for pid in "${pids[@]}"; do stop_process INT "$pid" done sleep 1 for pid in "${pids[@]}"; do stop_process TERM "$pid" done sleep 1 for pid in "${pids[@]}"; do stop_process KILL "$pid" done wait "${pids[@]}" 2>/dev/null || true fi exit "$exit_code" } trap cleanup INT TERM EXIT if [[ ! -d "$CLIENTAPP_DIR/node_modules" ]]; then echo "Missing node_modules in Events.ClientApp." echo "Run: cd \"$CLIENTAPP_DIR\" && npm install" exit 1 fi "$ROOT_DIR/stop-all.sh" >/dev/null 2>&1 || true echo "Starting Events.WebAPI on https://localhost:7295" start_process dotnet run --launch-profile https --project "$WEBAPI_PROJECT" echo "Starting Events.FilesAPI on https://localhost:7296" start_process dotnet run --launch-profile https --project "$FILESAPI_PROJECT" echo "Starting Events.ClientApp on http://localhost:5173" start_process env CLIENTAPP_DIR="$CLIENTAPP_DIR" bash -c 'cd "$CLIENTAPP_DIR" && npm run dev' echo echo "Events stack is starting." echo "WebAPI: https://localhost:7295" echo "FilesAPI: https://localhost:7296" echo "ClientApp: http://localhost:5173" echo echo "Press Ctrl+C to stop all processes." wait