#!/usr/bin/env bash set -euo pipefail # Client UAT for skill-credit flow (safe by default: dry-run) # # Required env in live mode: # AUTH_BASE, CLIENT_KEY # # Optional env: # RUN_ID, QUANTITY, ACTUAL_CREDITS, FINAL_OUTCOME # # Examples: # AUTH_BASE=https://api-gw-test.yuanwei-lnc.com CLIENT_KEY=sk_xxx ./client-uat.sh # AUTH_BASE=https://api-gw-test.yuanwei-lnc.com CLIENT_KEY=sk_xxx ./client-uat.sh --live # AUTH_BASE=https://api-gw-test.yuanwei-lnc.com CLIENT_KEY=sk_xxx FINAL_OUTCOME=failed ./client-uat.sh --live AUTH_BASE="${AUTH_BASE:-}" CLIENT_KEY="${CLIENT_KEY:-}" RUN_ID="${RUN_ID:-wf_$(date +%Y%m%d_%H%M%S)}" QUANTITY="${QUANTITY:-1}" ACTUAL_CREDITS="${ACTUAL_CREDITS:-45}" FINAL_OUTCOME="${FINAL_OUTCOME:-completed}" # completed | failed LIVE=0 if [ "${1:-}" = "--live" ]; then LIVE=1 fi if [ "$LIVE" -eq 1 ]; then if [ -z "$AUTH_BASE" ] || [ -z "$CLIENT_KEY" ]; then echo "Missing env: AUTH_BASE and CLIENT_KEY are required in --live mode." exit 1 fi fi print_cmd() { echo "+ $*" } json_get() { local raw="$1" local key="$2" python3 - "$raw" "$key" <<'PY' import json, sys raw = sys.argv[1] key = sys.argv[2] try: data = json.loads(raw) except Exception: print("") raise SystemExit(0) val = data.get(key, "") if val is None: val = "" print(val) PY } echo "== Client UAT: skill-credit flow ==" echo "RUN_ID=$RUN_ID" echo "FINAL_OUTCOME=$FINAL_OUTCOME" if [ "$LIVE" -eq 0 ]; then echo "Mode: dry-run (no network request)" cat <" \\ -H "Content-Type: application/json" \\ -d '{"runId":"$RUN_ID","service":"skill","action":"cold_outreach_run","quantity":$QUANTITY}' 3) Finalize curl -X POST "\$AUTH_BASE/auth/skill-credit/runs/finalize" \\ -H "Authorization: Bearer " \\ -H "Content-Type: application/json" \\ -d '{"runId":"$RUN_ID","outcome":"$FINAL_OUTCOME","actualCredits":$ACTUAL_CREDITS}' 4) Check balance curl -X GET "\$AUTH_BASE/auth/skill-credit/balance" \\ -H "Authorization: Bearer " EOF exit 0 fi print_cmd curl -s -X POST "$AUTH_BASE/auth/skill-credit/session" -H "Content-Type: application/json" -d '{"clientKey":"***"}' SESSION_JSON="$(curl -s -X POST "$AUTH_BASE/auth/skill-credit/session" \ -H "Content-Type: application/json" \ -d "{\"clientKey\":\"$CLIENT_KEY\"}")" ACCESS_TOKEN="$(json_get "$SESSION_JSON" "accessToken")" if [ -z "$ACCESS_TOKEN" ]; then echo "Session exchange failed: $SESSION_JSON" exit 1 fi echo "Session OK." print_cmd curl -s -X POST "$AUTH_BASE/auth/skill-credit/runs/reserve" -H "Authorization: Bearer " -H "Content-Type: application/json" -d ... RESERVE_JSON="$(curl -s -X POST "$AUTH_BASE/auth/skill-credit/runs/reserve" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"runId\":\"$RUN_ID\",\"service\":\"skill\",\"action\":\"cold_outreach_run\",\"quantity\":$QUANTITY}")" echo "Reserve response: $RESERVE_JSON" if [ "$FINAL_OUTCOME" = "completed" ]; then FINAL_PAYLOAD="{\"runId\":\"$RUN_ID\",\"outcome\":\"completed\",\"actualCredits\":$ACTUAL_CREDITS}" else FINAL_PAYLOAD="{\"runId\":\"$RUN_ID\",\"outcome\":\"failed\",\"reason\":\"uat_failed_case\"}" fi print_cmd curl -s -X POST "$AUTH_BASE/auth/skill-credit/runs/finalize" -H "Authorization: Bearer " -H "Content-Type: application/json" -d ... FINALIZE_JSON="$(curl -s -X POST "$AUTH_BASE/auth/skill-credit/runs/finalize" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$FINAL_PAYLOAD")" echo "Finalize response: $FINALIZE_JSON" print_cmd curl -s -X GET "$AUTH_BASE/auth/skill-credit/balance" -H "Authorization: Bearer " BALANCE_JSON="$(curl -s -X GET "$AUTH_BASE/auth/skill-credit/balance" \ -H "Authorization: Bearer $ACCESS_TOKEN")" echo "Balance response: $BALANCE_JSON" echo "UAT completed."