#!/usr/bin/env bash set -euo pipefail BASE_URL="${BASE_URL:-http://127.0.0.1:3000}" DEVICE_FINGERPRINT="${DEVICE_FINGERPRINT:-benchmark-dashboard}" ADMIN_IDENTIFIER="${ADMIN_IDENTIFIER:-finance_mgr@hyinda.com}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-FinanceMgrPassword1234}" ITERATIONS="${ITERATIONS:-10}" if ! command -v curl >/dev/null 2>&1; then echo "[ERROR] curl not found" >&2 exit 1 fi if ! command -v jq >/dev/null 2>&1; then echo "[ERROR] jq not found" >&2 exit 1 fi TMP_DIR="$(mktemp -d)" cleanup() { rm -rf "$TMP_DIR" } trap cleanup EXIT login() { local out_file="$1" local status status="$(curl -sS -o "$out_file" -w "%{http_code}" \ -X POST "$BASE_URL/api/auth/login" \ -H "content-type: application/json" \ -H "x-device-fingerprint: $DEVICE_FINGERPRINT" \ -d "{\"identifier\":\"$ADMIN_IDENTIFIER\",\"password\":\"$ADMIN_PASSWORD\"}")" if [[ "$status" != "200" ]]; then echo "[ERROR] login failed: HTTP $status" >&2 cat "$out_file" >&2 exit 1 fi jq -er '.data.accessToken' "$out_file" } benchmark_endpoint() { local endpoint="$1" local token="$2" local total_ms=0 local max_ms=0 local min_ms=999999 for _ in $(seq 1 "$ITERATIONS"); do local body_file="$TMP_DIR/$(basename "$endpoint").json" local elapsed elapsed="$(curl -sS -o "$body_file" -w "%{time_total}" \ -H "authorization: Bearer $token" \ "$BASE_URL$endpoint")" local elapsed_ms elapsed_ms="$(python3 - < max_ms )); then max_ms=$elapsed_ms fi if (( elapsed_ms < min_ms )); then min_ms=$elapsed_ms fi done local avg_ms=$((total_ms / ITERATIONS)) echo "$endpoint avg=${avg_ms}ms min=${min_ms}ms max=${max_ms}ms iterations=$ITERATIONS" } echo "[1/2] Login" TOKEN="$(login "$TMP_DIR/login.json")" echo "[2/2] Dashboard endpoint benchmarks" benchmark_endpoint "/api/dashboard/expense-overview" "$TOKEN" benchmark_endpoint "/api/dashboard/trends" "$TOKEN" benchmark_endpoint "/api/dashboard/top-categories" "$TOKEN" benchmark_endpoint "/api/dashboard/approval-efficiency" "$TOKEN" echo "[OK] Dashboard benchmark completed"