didi-lot2-backend/backend/scripts/acceptanta/dovezi-api.sh
EVOTECH IT SRL 7e4f23d4c4 Optimizare scripturi build/CI si functionalitati noi Lot 2
- CI/CD GitLab (.gitlab-ci.yml): verify -> test -> build -> publish ->
  deploy cu health-gate (/api/v3/health/all) + rollback manual
- Publicare pe retele sociale (LinkedIn/Facebook) din Analysis History
  (social.ts, linkedin.ts, facebook.ts, SocialPostModal)
- Specificatii OpenAPI: agent-v3 (87 op.) si didi-framework (287 op.)
- Matrice testare acceptanta beneficiar + script dovezi API
- Fix nginx SSL: redirect port 3001 (error_page 497, absolute_redirect off)
- Adrese interne inlocuite cu hostname-uri generice (.local)
2026-07-12 13:36:08 -07:00

177 lines
10 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# DiDi Lot 2 — Dovezi API pentru matricea de acceptanță (doc 08)
# =============================================================================
# Ruleaza pe rand fiecare proba API din matrice. Dupa fiecare test se opreste
# ca sa faci captura de ecran (SNIP). Fiecare bloc afiseaza: numarul din
# matrice, DATA+ORA, comanda exacta si raspunsul.
#
# Utilizare:
# bash dovezi-api.sh # interactiv (pauza dupa fiecare test)
# bash dovezi-api.sh --auto # fara pauze (verificare rapida)
# =============================================================================
set -uo pipefail
HOST="${HOST:-localhost}" # ruleaza pe server; override: HOST=<ip> bash dovezi-api.sh
AGENT="http://$HOST:24803"
KC="http://$HOST:28080"
AUTO=0; [ "${1:-}" = "--auto" ] && AUTO=1
B="\033[1m"; G="\033[32m"; C="\033[36m"; Y="\033[33m"; N="\033[0m"
pauza() {
[ "$AUTO" = "1" ] && { echo; return; }
echo; echo -e "${Y}>>> Fa SNIP la blocul de mai sus, apoi apasa ENTER pentru testul urmator...${N}"; read -r; clear
}
antet() { # nr_matrice titlu
echo -e "${B}==============================================================================${N}"
echo -e "${B} PROBA $1$2${N}"
echo -e " Data/ora testarii: ${G}$(date '+%Y-%m-%d %H:%M:%S %Z')${N} Server: $HOST Operator: $(whoami)"
echo -e "${B}==============================================================================${N}"
}
cmd() { echo -e "${C}\$ $*${N}"; }
jq_sau_cat() { python3 -m json.tool 2>/dev/null || cat; }
clear
# --- utilizator de test (cu credite) ---
UID_TEST=$(docker exec didi-postgres psql -U bos_interface -d DIDI -tA -c \
"SELECT uc.keycloak_id FROM bos_sysadmin.user_credential uc JOIN bos_sysadmin.internet_user iu ON iu.internet_user_id=uc.internet_user_id WHERE iu.credits_remained > 100 LIMIT 1;" 2>/dev/null)
echo "Utilizator de test: $UID_TEST"
# =============================================================================
antet "M7.1" "Autentificare OIDC — obtinere token JWT (SSO)"
cmd "curl -X POST $KC/auth/realms/didi-admins/protocol/openid-connect/token -d grant_type=password -d client_id=admin-dashboard -d username=admin -d password=*****"
TOKEN=$(curl -sk -X POST "$KC/auth/realms/didi-admins/protocol/openid-connect/token" \
-d grant_type=password -d client_id=admin-dashboard -d username=admin -d password=Admin12345 \
| python3 -c "import sys,json;print(json.load(sys.stdin).get('access_token',''))")
if [ -n "$TOKEN" ]; then
echo -e "${G}TOKEN OBTINUT (JWT RS256).${N} Claims relevante din token:"
echo "$TOKEN" | cut -d. -f2 | python3 -c "
import sys,json,base64
p=sys.stdin.read().strip(); p+='='*(-len(p)%4)
d=json.loads(base64.urlsafe_b64decode(p))
print(json.dumps({k:d[k] for k in ('iss','preferred_username','realm_access','exp') if k in d}, indent=2, ensure_ascii=False))"
else
echo "EROARE: nu s-a obtinut token"
fi
pauza
# =============================================================================
antet "M1.4" "Executie SINCRONA — POST /api/v3/pipeline/analyze (text)"
cmd "curl -X POST $AGENT/api/v3/pipeline/analyze {media_type:text, text:'...', user_id}"
curl -sk --max-time 120 -X POST "$AGENT/api/v3/pipeline/analyze" -H 'Content-Type: application/json' \
-d "{\"media_type\":\"text\",\"text\":\"Guvernul a anuntat astazi noi masuri economice care vor intra in vigoare luna viitoare, potrivit comunicatului oficial.\",\"user_id\":\"$UID_TEST\"}" \
| python3 -c "
import sys,json
d=json.load(sys.stdin); s=d.get('data',d)
print(json.dumps({'success':d.get('success'),'session_id':s.get('session_id'),'status':s.get('status'),'risk_score':s.get('risk_score'),'risk_category':s.get('risk_category'),'components_run':s.get('components_run')}, indent=2, ensure_ascii=False))"
echo -e "${G}=> HTTP 200 cu verdict complet in raspuns = executie sincrona OK${N}"
pauza
# =============================================================================
antet "M1.5" "Executie ASINCRONA — POST /api/v3/pipeline/analyze-async (202 + poll)"
cmd "curl -X POST $AGENT/api/v3/pipeline/analyze-async {media_type:text, ...}"
RESP=$(curl -sk --max-time 30 -X POST "$AGENT/api/v3/pipeline/analyze-async" -H 'Content-Type: application/json' \
-d "{\"media_type\":\"text\",\"text\":\"OMS a confirmat oficial ca vaccinurile contin microcipuri 5G pentru controlul populatiei prin unde radio.\",\"user_id\":\"$UID_TEST\"}")
echo "$RESP" | jq_sau_cat
SID=$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin)['data']['session_id'])" 2>/dev/null)
echo -e "${G}=> Raspuns imediat cu session_id + poll_url + result_url = dispatch async OK${N}"
pauza
# =============================================================================
antet "M1.9" "Status executie — GET /pipeline/<id>/queue-status (polling)"
cmd "curl $AGENT/api/v3/pipeline/$SID/queue-status (repetat pana la completed)"
for i in $(seq 1 40); do
ST=$(curl -sk "$AGENT/api/v3/pipeline/$SID/queue-status" | python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('data',{}).get('status') or d.get('status',''))" 2>/dev/null)
echo " poll #$i @ $(date '+%H:%M:%S'): status=$ST"
[ "$ST" = "completed" ] || [ "$ST" = "failed" ] && break
sleep 3
done
echo -e "${G}=> Progres urmarit in timp real pana la 'completed'${N}"
pauza
# =============================================================================
antet "M2.5" "Rezultat final structurat — GET /pipeline/<id>/result"
cmd "curl $AGENT/api/v3/pipeline/$SID/result"
curl -sk "$AGENT/api/v3/pipeline/$SID/result" | python3 -c "
import sys,json
d=json.load(sys.stdin); s=d.get('data',d)
print(json.dumps({'session_id':s.get('session_id'),'status':s.get('status'),'input_type':s.get('input_type'),'risk_score':s.get('risk_score'),'risk_category':s.get('risk_category'),'risk_level':s.get('risk_level'),'confidence':s.get('confidence'),'components_run':s.get('components_run'),'llm_usage_total':(s.get('llm_usage') or {}).get('total')}, indent=2, ensure_ascii=False))"
echo -e "${G}=> Text de dezinformare detectat cu scor mare = pipeline complet functional${N}"
pauza
# =============================================================================
antet "M1.6" "Simulare DRY-RUN — POST /pipeline/dry-run (plan fara executie)"
cmd "curl -X POST $AGENT/api/v3/pipeline/dry-run {media_type:text, ...}"
curl -sk --max-time 30 -X POST "$AGENT/api/v3/pipeline/dry-run" -H 'Content-Type: application/json' \
-d "{\"media_type\":\"text\",\"text\":\"test de simulare dry run pentru acceptanta\",\"user_id\":\"$UID_TEST\"}" \
| python3 -m json.tool 2>/dev/null | head -60
echo -e "${G}=> Planul de executie (noduri, cozi, modele) FARA a consuma resurse${N}"
pauza
# =============================================================================
antet "M2.6" "Health profund — GET /api/v3/health/all (infra + 9 servicii AI Lot 1)"
cmd "curl $AGENT/api/v3/health/all"
curl -sk --max-time 30 "$AGENT/api/v3/health/all" | jq_sau_cat
echo -e "${G}=> Toate dependentele (PostgreSQL/Redis/RabbitMQ/framework + 9 servicii AI) healthy${N}"
pauza
# =============================================================================
antet "M2.4 + M5.2" "Persistenta in PostgreSQL — istoricul analizelor (schema bos_analysis)"
cmd "SELECT input_type,status,risk_category,risk_score,created_at FROM bos_analysis.analysis_session ORDER BY created_at DESC LIMIT 5"
docker exec didi-postgres psql -U bos_interface -d DIDI -c \
"SELECT input_type, status, risk_category, risk_score, to_char(created_at,'YYYY-MM-DD HH24:MI') AS data_analiza FROM bos_analysis.analysis_session ORDER BY created_at DESC LIMIT 5;"
echo -e "${G}=> Analizele (inclusiv cele de mai sus) persistate in baza de date${N}"
pauza
# =============================================================================
antet "M5.3" "Organizarea pe scheme a bazei de date"
cmd "\\dn (lista schemelor)"
docker exec didi-postgres psql -U bos_interface -d DIDI -c "\dn"
docker exec didi-postgres psql -U bos_interface -d DIDI -c \
"SELECT 'tehnici' AS obiect, count(*) FROM bos_parammgmt.technique UNION ALL SELECT 'modele LLM', count(*) FROM bos_parammgmt.llm_model UNION ALL SELECT 'sesiuni analiza', count(*) FROM bos_analysis.analysis_session;"
echo -e "${G}=> 4 scheme (parametri/analiza/utilizatori/date personale) + date reale${N}"
pauza
# =============================================================================
antet "M4.2" "Gateway Kong — protectie: cerere FARA token => 401"
cmd "curl -X POST http://127.0.0.1:18000/agent-v3/api/v3/pipeline/analyze-async (FARA Authorization)"
CODE=$(curl -sk --max-time 10 -H 'Host: localhost' -o /dev/null -w '%{http_code}' \
-X POST "http://127.0.0.1:18000/agent-v3/api/v3/pipeline/analyze-async" \
-H 'Content-Type: application/json' -d '{"media_type":"text","text":"acces neautorizat"}')
echo " Raspuns HTTP: $CODE"
echo -e "${G}=> 401 Unauthorized = gateway-ul respinge cererile fara JWT (securitate la punct unic)${N}"
pauza
# =============================================================================
antet "M3.1" "Broker de mesaje — cozile RabbitMQ (componente x prioritati + DLQ)"
cmd "curl -u admin:*** http://$HOST:15672/api/queues (nume + consumeri)"
curl -s -u admin:rabbitmq123 "http://$HOST:15672/api/queues" | python3 -c "
import sys,json
qs=json.load(sys.stdin)
print(f'Total cozi: {len(qs)}')
for q in sorted(qs, key=lambda x:x['name'])[:30]:
print(f\" {q['name']:45s} consumeri={q.get('consumers',0):2d} mesaje={q.get('messages',0)}\")"
echo -e "${G}=> Cozile per componenta si prioritate, cu consumeri (workeri) atasati${N}"
pauza
# =============================================================================
antet "M9.1" "Containerizare — toate serviciile in containere, healthy"
cmd "docker ps (sumar pe categorii)"
TOTAL=$(docker ps -q | wc -l)
HEALTHY=$(docker ps --format '{{.Status}}' | grep -c healthy)
UNHEALTHY=$(docker ps --format '{{.Status}}' | grep -c unhealthy || true)
echo " Containere pornite: $TOTAL | cu healthcheck healthy: $HEALTHY | unhealthy: $UNHEALTHY"
echo
docker ps --format ' {{.Names}}\t{{.Status}}' | sort | head -30
echo " ... (lista completa: docker ps)"
echo -e "${G}=> Platforma integral containerizata, servicii sanatoase${N}"
pauza
echo -e "${B}==============================================================================${N}"
echo -e "${B} TOATE PROBELE API AU FOST RULATE — $(date '+%Y-%m-%d %H:%M:%S')${N}"
echo -e "${B}==============================================================================${N}"