From 7e4f23d4c48dc89e1b519e78c7f0606f6702f641 Mon Sep 17 00:00:00 2001 From: EVOTECH IT SRL Date: Sun, 12 Jul 2026 13:36:08 -0700 Subject: [PATCH] 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) --- backend/.gitlab-ci.yml | 178 + backend/admin-dashboard/nginx-ssl.conf | 13 +- .../AnalysisHistory/AnalysisHistory.tsx | 4 +- .../AnalysisHistory/HistoryTable.tsx | 17 +- .../AnalysisHistory/SocialPostModal.tsx | 90 +- backend/observability/docker-compose.yml | 8 +- backend/production/build-local.sh | 4 +- backend/scripts/acceptanta/dovezi-api.sh | 177 + backend/services/api-docs/agent-v3.yaml | 4725 ++++++ backend/services/api-docs/didi-framework.yaml | 14000 ++++++++++++++++ .../realm-import/didi-clients-realm.json | 10 +- .../didiKong/declarative/kong-cluster.yml | 10 +- .../orchestration-layer/agent-v3/.env.example | 10 +- .../agent-v3/docker-compose.yml | 10 +- .../agent-v3/src/api/routes.ts | 4 +- .../agent-v3/src/shared/media/vision.ts | 4 +- .../didiFramework/.env.example | 10 +- .../didiFramework/docker-compose.yml | 8 +- .../didiFramework/src/routes/admin/social.ts | 87 +- .../didiFramework/src/services/facebook.ts | 37 +- .../didiFramework/src/services/linkedin.ts | 177 + .../scripts/minio-switch.sh | 4 +- 22 files changed, 19477 insertions(+), 110 deletions(-) create mode 100644 backend/.gitlab-ci.yml create mode 100644 backend/scripts/acceptanta/dovezi-api.sh create mode 100644 backend/services/api-docs/agent-v3.yaml create mode 100644 backend/services/api-docs/didi-framework.yaml create mode 100644 backend/services/orchestration-layer/didiFramework/src/services/linkedin.ts diff --git a/backend/.gitlab-ci.yml b/backend/.gitlab-ci.yml new file mode 100644 index 0000000..e5d1efc --- /dev/null +++ b/backend/.gitlab-ci.yml @@ -0,0 +1,178 @@ +# ============================================================================= +# DiDi Lot 2 (Backend) — Pipeline CI/CD GitLab +# ============================================================================= +# Etape: verify (typecheck) → test (unitare) → build (imagini Docker, versionate) +# → publish (registry) → deploy (cu HEALTH-GATE) → rollback (manual) +# +# Variabile așteptate în GitLab (Settings → CI/CD → Variables): +# CI_REGISTRY / CI_REGISTRY_USER / CI_REGISTRY_PASSWORD — registry-ul de imagini +# DEPLOY_HOST — host-ul de deployment (SSH) +# DEPLOY_USER — utilizatorul de deployment +# Versionare imagini: $CI_COMMIT_SHORT_SHA (+ tag "latest" doar pe branch-ul implicit). +# Rollback: job manual care re-etichetează imaginea anterioară (previous) ca latest +# și redeployează — mecanismul de revenire cerut de documentație. +# ============================================================================= + +stages: + - verify + - test + - build + - publish + - deploy + - rollback + +default: + interruptible: true + +variables: + DOCKER_TLS_CERTDIR: "/certs" + AGENT_DIR: services/orchestration-layer/agent-v3 + FRAMEWORK_DIR: services/orchestration-layer/didiFramework + DASHBOARD_DIR: admin-dashboard + +# ---------- șabloane reutilizabile ---------- +.node: + image: node:20-alpine + before_script: + - node --version && npm --version + +.docker: + image: docker:27 + services: [docker:27-dind] + before_script: + - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY" + +# ============================================================================= +# VERIFY — compilare TypeScript (fără emitere) pe toate serviciile +# ============================================================================= +verify:agent-v3: + stage: verify + extends: .node + script: + - cd $AGENT_DIR && npm ci --prefer-offline + - npx tsc --noEmit + rules: [{ changes: ["services/orchestration-layer/agent-v3/**/*"] }, { when: always }] + +verify:framework: + stage: verify + extends: .node + script: + - cd $FRAMEWORK_DIR && npm ci --prefer-offline + - npx tsc --noEmit + +verify:dashboard: + stage: verify + extends: .node + script: + - cd $DASHBOARD_DIR && npm ci --prefer-offline + - npm run type-check + +# ============================================================================= +# TEST — teste unitare (vitest pe agent-v3; raport JUnit pentru GitLab) +# ============================================================================= +test:agent-v3: + stage: test + extends: .node + script: + - cd $AGENT_DIR && npm ci --prefer-offline + - npx vitest run --reporter=default --reporter=junit --outputFile=vitest-junit.xml + artifacts: + when: always + reports: + junit: $AGENT_DIR/vitest-junit.xml + expire_in: 30 days + +# validarea specificațiilor OpenAPI livrate (criteriul 6 — OpenAPI/Swagger) +test:openapi: + stage: test + image: python:3.12-alpine + script: + - pip install --quiet openapi-spec-validator pyyaml + - python -c "from openapi_spec_validator import validate; import yaml; validate(yaml.safe_load(open('$AGENT_DIR/openapi.yaml')))" + - python -c "from openapi_spec_validator import validate; import yaml; validate(yaml.safe_load(open('$FRAMEWORK_DIR/openapi.yaml')))" + +# ============================================================================= +# BUILD — imagini Docker versionate cu SHA-ul commit-ului +# ============================================================================= +build:agent-v3: + stage: build + extends: .docker + script: + - docker build -t "$CI_REGISTRY_IMAGE/agent-v3:$CI_COMMIT_SHORT_SHA" $AGENT_DIR + - docker push "$CI_REGISTRY_IMAGE/agent-v3:$CI_COMMIT_SHORT_SHA" + +build:framework: + stage: build + extends: .docker + script: + - docker build -t "$CI_REGISTRY_IMAGE/didi-framework:$CI_COMMIT_SHORT_SHA" $FRAMEWORK_DIR + - docker push "$CI_REGISTRY_IMAGE/didi-framework:$CI_COMMIT_SHORT_SHA" + +build:dashboard: + stage: build + extends: .docker + script: + - docker build -t "$CI_REGISTRY_IMAGE/didi-admin:$CI_COMMIT_SHORT_SHA" $DASHBOARD_DIR + - docker push "$CI_REGISTRY_IMAGE/didi-admin:$CI_COMMIT_SHORT_SHA" + +# ============================================================================= +# PUBLISH — pe branch-ul implicit, promovăm SHA-ul la :latest și păstrăm +# :previous (ținta de rollback) +# ============================================================================= +publish:latest: + stage: publish + extends: .docker + rules: [{ if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' }] + script: + - | + for svc in agent-v3 didi-framework didi-admin; do + # păstrează versiunea curentă ca :previous (rollback target) + docker pull "$CI_REGISTRY_IMAGE/$svc:latest" || true + docker tag "$CI_REGISTRY_IMAGE/$svc:latest" "$CI_REGISTRY_IMAGE/$svc:previous" || true + docker push "$CI_REGISTRY_IMAGE/$svc:previous" || true + # promovează build-ul curent + docker pull "$CI_REGISTRY_IMAGE/$svc:$CI_COMMIT_SHORT_SHA" + docker tag "$CI_REGISTRY_IMAGE/$svc:$CI_COMMIT_SHORT_SHA" "$CI_REGISTRY_IMAGE/$svc:latest" + docker push "$CI_REGISTRY_IMAGE/$svc:latest" + done + +# ============================================================================= +# DEPLOY — cu HEALTH-GATE: deploy-ul e considerat reușit DOAR dacă +# /api/v3/health/all răspunde healthy/degraded după repornire +# ============================================================================= +deploy:production: + stage: deploy + image: alpine:3.20 + rules: [{ if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH', when: manual }] + environment: { name: production } + before_script: [ "apk add --no-cache openssh-client curl" ] + script: + - ssh -o StrictHostKeyChecking=accept-new "$DEPLOY_USER@$DEPLOY_HOST" " + cd ~/didi/backend/services/orchestration-layer/agent-v3 && docker compose pull && docker compose up -d && + cd ../didiFramework && docker compose pull && docker compose up -d" + # HEALTH-GATE: max 120s până când platforma raportează sănătate + - | + for i in $(seq 1 24); do + code=$(ssh "$DEPLOY_USER@$DEPLOY_HOST" "curl -sk -o /dev/null -w '%{http_code}' http://localhost:24803/api/v3/health/all" || echo 000) + echo "health-gate încercarea $i: HTTP $code" + [ "$code" = "200" ] && exit 0 + sleep 5 + done + echo "HEALTH-GATE EȘUAT — deploy-ul NU este sănătos"; exit 1 + +# ============================================================================= +# ROLLBACK — manual: repune imaginile :previous și redeployează +# ============================================================================= +rollback:production: + stage: rollback + extends: .docker + rules: [{ if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH', when: manual }] + environment: { name: production } + script: + - | + for svc in agent-v3 didi-framework didi-admin; do + docker pull "$CI_REGISTRY_IMAGE/$svc:previous" + docker tag "$CI_REGISTRY_IMAGE/$svc:previous" "$CI_REGISTRY_IMAGE/$svc:latest" + docker push "$CI_REGISTRY_IMAGE/$svc:latest" + done + - echo "Imaginile anterioare repromovate la :latest — rulați deploy:production pentru a le aplica." diff --git a/backend/admin-dashboard/nginx-ssl.conf b/backend/admin-dashboard/nginx-ssl.conf index 2d67d73..213a3b2 100644 --- a/backend/admin-dashboard/nginx-ssl.conf +++ b/backend/admin-dashboard/nginx-ssl.conf @@ -1,12 +1,20 @@ server { listen 443 ssl; - server_name localhost 10.11.10.12; + server_name localhost didi.local; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; + # Cererile HTTP simplu pe portul HTTPS (ex. utilizator tastează http://host:3001) + # primesc redirect către https în loc de "400 Bad Request". + error_page 497 =301 https://$http_host$request_uri; + + # Redirecturi RELATIVE (ex. /admin → /admin/): altfel nginx pune portul intern + # (443) în Location și se pierde :3001 din adresa publică → pagină inaccesibilă. + absolute_redirect off; + # Global: allow large file uploads (video up to 100MB) client_max_body_size 100M; @@ -173,7 +181,8 @@ server { # HTTP server (for Kong proxy + direct access) server { listen 80; - server_name localhost 10.11.10.12; + absolute_redirect off; + server_name localhost didi.local; client_max_body_size 100M; diff --git a/backend/admin-dashboard/src/components/AnalysisHistory/AnalysisHistory.tsx b/backend/admin-dashboard/src/components/AnalysisHistory/AnalysisHistory.tsx index c40aa7b..7a95012 100644 --- a/backend/admin-dashboard/src/components/AnalysisHistory/AnalysisHistory.tsx +++ b/backend/admin-dashboard/src/components/AnalysisHistory/AnalysisHistory.tsx @@ -40,6 +40,7 @@ export const AnalysisHistory: React.FC = () => { const [sessionToDelete, setSessionToDelete] = useState(null); const [socialPostOpen, setSocialPostOpen] = useState(false); const [socialPostSession, setSocialPostSession] = useState(null); + const [socialPostPlatform, setSocialPostPlatform] = useState<'facebook' | 'linkedin'>('facebook'); const handleCopyId = (e: React.MouseEvent, id: string) => { e.stopPropagation(); @@ -250,7 +251,7 @@ export const AnalysisHistory: React.FC = () => { onDeleteClick={handleDeleteClick} onCancelClick={handleCancel} onResumeClick={handleResume} - onSocialPostClick={(s) => { setSocialPostSession(s); setSocialPostOpen(true); }} + onSocialPostClick={(s, platform) => { setSocialPostSession(s); setSocialPostPlatform(platform || 'facebook'); setSocialPostOpen(true); }} onCopyId={handleCopyId} /> @@ -270,6 +271,7 @@ export const AnalysisHistory: React.FC = () => { { setSocialPostOpen(false); setSocialPostSession(null); diff --git a/backend/admin-dashboard/src/components/AnalysisHistory/HistoryTable.tsx b/backend/admin-dashboard/src/components/AnalysisHistory/HistoryTable.tsx index af017da..1eb4e57 100644 --- a/backend/admin-dashboard/src/components/AnalysisHistory/HistoryTable.tsx +++ b/backend/admin-dashboard/src/components/AnalysisHistory/HistoryTable.tsx @@ -9,6 +9,7 @@ import { Visibility as VisibilityIcon, ContentCopy as CopyIcon, Facebook as FacebookIcon, + LinkedIn as LinkedInIcon, Cancel as CancelIcon, Replay as ResumeIcon, } from '@mui/icons-material'; @@ -30,7 +31,7 @@ interface Props { onViewDetails: (sessionId: string) => void; onDeleteClick: (session: AnalysisSession) => void; onCopyId: (e: React.MouseEvent, id: string) => void; - onSocialPostClick?: (session: AnalysisSession) => void; + onSocialPostClick?: (session: AnalysisSession, platform?: 'facebook' | 'linkedin') => void; onCancelClick?: (session: AnalysisSession) => void; onResumeClick?: (session: AnalysisSession) => void; } @@ -216,13 +217,23 @@ export const HistoryTable: React.FC = ({ {onSocialPostClick && ( onSocialPostClick(analysis)} - title="Post to Facebook" + onClick={() => onSocialPostClick(analysis, 'facebook')} + title="Postează pe Facebook" sx={{ color: '#1877F2' }} > )} + {onSocialPostClick && ( + onSocialPostClick(analysis, 'linkedin')} + title="Postează pe LinkedIn" + sx={{ color: '#0A66C2' }} + > + + + )} {onCancelClick && CANCELABLE.has(analysis.status) && ( = { + facebook: { label: 'Facebook', color: '#1877F2', hover: '#0e5fc8' }, + linkedin: { label: 'LinkedIn', color: '#0A66C2', hover: '#084d92' }, +}; type Block = { id: string; @@ -30,6 +36,7 @@ interface Props { open: boolean; onClose: () => void; session: AnalysisSession | null; + initialPlatform?: Platform; onSuccess?: (postId: string, externalUrl: string) => void; } @@ -121,8 +128,9 @@ const joinBlocks = (blocks: Block[]): string => .map((b) => b.content.trim()) .join('\n\n'); -export const SocialPostModal: React.FC = ({ open, onClose, session, onSuccess }) => { +export const SocialPostModal: React.FC = ({ open, onClose, session, initialPlatform, onSuccess }) => { const [status, setStatus] = useState('idle'); + const [platform, setPlatform] = useState('facebook'); const [blocks, setBlocks] = useState([]); const [imageUrl, setImageUrl] = useState(''); const [linkUrl, setLinkUrl] = useState(''); @@ -134,6 +142,7 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc useEffect(() => { if (!open || !session) return; setStatus('loading'); + setPlatform(initialPlatform || 'facebook'); setBlocks([]); setImageUrl(''); setLinkUrl(session.session_id ? `${SHARE_BASE}/${session.session_id}` : ''); @@ -157,7 +166,7 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc setError(e?.response?.data?.error || e.message); setStatus('error'); }); - }, [open, session]); + }, [open, session, initialPlatform]); const previewText = useMemo(() => joinBlocks(blocks), [blocks]); const charCount = previewText.length; @@ -182,7 +191,7 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc content: previewText, image_url: imageUrl || undefined, link_url: linkUrl || undefined, - platform: 'facebook', + platform, }, { headers: { Authorization: `Bearer ${token}` } }, ); @@ -192,7 +201,8 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc const pubRes = await axios.post( `${FRAMEWORK_BASE}/api/admin/social/publish/${createdId}`, - scheduledAt ? { scheduled_at: new Date(scheduledAt).toISOString() } : {}, + scheduledAt && platform === 'facebook' + ? { scheduled_at: new Date(scheduledAt).toISOString() } : {}, { headers: { Authorization: `Bearer ${token}` } }, ); if (pubRes.data?.success && pubRes.data.data) { @@ -214,8 +224,21 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc return ( - - Post to Facebook + {platform === 'linkedin' + ? + : } + Post to {PLATFORM_META[platform].label} + { if (v) { setPlatform(v); if (v === 'linkedin') { setScheduledAt(''); setImageUrl(''); } } }} + disabled={status === 'publishing'} + sx={{ ml: 2 }} + > + Facebook + LinkedIn + @@ -294,10 +317,19 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc Preview post · {charCount} caractere - {charCount > 500 && ( + {platform === 'linkedin' && charCount > 210 && ( + + )} + {platform === 'facebook' && charCount > 500 && ( )} + {platform === 'linkedin' && charCount > 210 && ( + + LinkedIn afișează în feed doar ~210 caractere (fără „vezi mai mult"). Restul e + postat, dar ascuns. Recomandare: păstrează postul scurt + atașează link-ul analizei. + + )} = ({ open, onClose, session, onSuc setImageUrl(e.target.value)} fullWidth size="small" - disabled={status === 'publishing'} + disabled={status === 'publishing' || platform === 'linkedin'} placeholder="https://didi365.eu/share/image.png" /> = ({ open, onClose, session, onSuc color={scheduledAt ? 'warning' : 'default'} onDelete={scheduledAt ? () => setScheduledAt('') : undefined} /> - - setScheduledAt(e.target.value)} - inputProps={{ min: minScheduleDate }} - disabled={status === 'publishing'} - sx={{ width: 220 }} - /> + + + setScheduledAt(e.target.value)} + inputProps={{ min: minScheduleDate }} + disabled={status === 'publishing' || platform === 'linkedin'} + sx={{ width: 220 }} + /> + @@ -368,7 +406,7 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc {status === 'published' && ( - {scheduledAt ? '✓ Programat cu success pe Facebook!' : '✓ Publicat cu success pe Facebook!'} + {scheduledAt ? `✓ Programat cu succes pe ${PLATFORM_META[platform].label}!` : `✓ Publicat cu succes pe ${PLATFORM_META[platform].label}!`} {externalUrl && ( )} @@ -407,13 +445,13 @@ export const SocialPostModal: React.FC = ({ open, onClose, session, onSuc } onClick={handlePublish} disabled={status !== 'editing' || !previewText.trim()} - sx={{ bgcolor: '#1877F2', '&:hover': { bgcolor: '#0e5fc8' } }} + sx={{ bgcolor: PLATFORM_META[platform].color, '&:hover': { bgcolor: PLATFORM_META[platform].hover } }} > {status === 'publishing' ? 'Se publică...' - : scheduledAt + : scheduledAt && platform === 'facebook' ? 'Programează' - : 'Publică pe Facebook'} + : `Publică pe ${PLATFORM_META[platform].label}`} )} diff --git a/backend/observability/docker-compose.yml b/backend/observability/docker-compose.yml index c16213d..89db6d6 100644 --- a/backend/observability/docker-compose.yml +++ b/backend/observability/docker-compose.yml @@ -17,10 +17,10 @@ # docker compose up -d # # UI access: -# Grafana: http://10.11.10.12:3030 (admin / GRAFANA_ADMIN_PASSWORD) -# Prometheus: http://10.11.10.12:9090 -# Jaeger UI: http://10.11.10.12:16686 -# Alertmanager: http://10.11.10.12:9093 +# Grafana: http://didi.local:3030 (admin / GRAFANA_ADMIN_PASSWORD) +# Prometheus: http://didi.local:9090 +# Jaeger UI: http://didi.local:16686 +# Alertmanager: http://didi.local:9093 services: prometheus: diff --git a/backend/production/build-local.sh b/backend/production/build-local.sh index 1721c27..db467c2 100644 --- a/backend/production/build-local.sh +++ b/backend/production/build-local.sh @@ -142,12 +142,12 @@ for entry in "bos_parammgmt|technique|166" "bos_parammgmt|dimension|8" "bos_para done # Localizare config LLM: seed-ul livrează modelul primar ca `Qwen3.5-397B-A17B` pe -# provider remote `10.11.10.17` — dar vLLM-ul local servește `qwen3.5` prin routerul +# provider remote `llm.local` — dar vLLM-ul local servește `qwen3.5` prin routerul # `llm-api:14011`. Aliniem model_code + provider base_url (idempotent, rulează la fiecare build). log "Localizez config LLM (model → qwen3.5, provideri → llm-api:14011)..." docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c " UPDATE bos_parammgmt.llm_model SET model_code='qwen3.5', model_name='Qwen 3.5 (local)' WHERE model_code='Qwen3.5-397B-A17B'; - UPDATE bos_parammgmt.llm_provider SET base_url='http://llm-api:14011/v1' WHERE base_url LIKE 'http://10.11.10.17:1401%'; + UPDATE bos_parammgmt.llm_provider SET base_url='http://llm-api:14011/v1' WHERE base_url LIKE 'http://llm.local:1401%'; " >/dev/null 2>&1 && ok "Config LLM localizat (qwen3.5 @ llm-api:14011)" || warn "Localizarea config LLM a eșuat — verifică manual" wait_healthy didi-cache 30 diff --git a/backend/scripts/acceptanta/dovezi-api.sh b/backend/scripts/acceptanta/dovezi-api.sh new file mode 100644 index 0000000..65909ca --- /dev/null +++ b/backend/scripts/acceptanta/dovezi-api.sh @@ -0,0 +1,177 @@ +#!/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= 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//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//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}" diff --git a/backend/services/api-docs/agent-v3.yaml b/backend/services/api-docs/agent-v3.yaml new file mode 100644 index 0000000..4e69193 --- /dev/null +++ b/backend/services/api-docs/agent-v3.yaml @@ -0,0 +1,4725 @@ +openapi: 3.0.3 +info: + title: DIDI Agent V3 — Pipeline Orchestration & Execution API + version: 3.0.0 + description: 'API-ul motorului de analiză a dezinformării DIDI (Lot 2 — Modulele 1–3). + + Toate endpoint-urile de analiză sunt asincrone (dispatch pe RabbitMQ, răspuns 202 + poll). + + Pipeline = workflow cu dependențe explicite: intake → [media_preprocess] → {techniques ∥ ai_tampered ∥ claims + ∥ domain} → verdict → persist. + + Include dry-run, cancel, resume din checkpoint, istoric și coada de moderare HIL. + + Autentificare: JWT Keycloak RS256 (verificat criptografic în backend, nu doar la gateway).' +servers: +- url: http://localhost:18000/agent-v3 + description: Kong API Gateway (JWT enforced) — punctul unic de intrare public +tags: +- name: ai-tampered +- name: claims +- name: core +- name: domain +- name: health +- name: media +- name: moderation +- name: pipeline +- name: source-assessment +- name: techniques +security: +- bearerAuth: [] +# ============================================================================= +# Integrare cu Lotul 1 (Platforma AI) — dependențe OUTBOUND ale agent-v3. +# Nu sunt rute expuse de acest serviciu, ci servicii AI consumate prin HTTP pe +# rețeaua Docker `didi-network` (adresare pe nume de container). Fiecare integrare +# este fail-open (degradare grațioasă la indisponibilitate). Starea lor live este +# expusă prin GET /api/v3/health/all. Testele de integrare: raport 04 (Lot1↔Lot2). +# ============================================================================= +x-integrations: + network: didi-network + contract: fail-open (timeout/indisponibil ⇒ degradare grațioasă, analiza nu eșuează) + health_probe: /api/v3/health/all + services: + - key: llm + env: LLM_ROUTER_URL + target: http://llm-api:14011 + role: Modele LLM text (Qwen 3.5 local, vLLM) — analiză + explicație verdict + - key: vision + env: VISION_LLM_URL + target: http://llm-api:14011 + role: OCR / analiză imagine (Qwen vision) + - key: whisper + env: M17_WHISPER_URL + target: http://audio-api:54300 + role: Transcriere audio (Whisper large-v3) + - key: video + env: VIDEO_ANALYSIS_URL + target: http://video-api:54600 + role: Detecție deepfake video (BusterX) + - key: extractors + env: EXTRACTORS_URL + target: http://extractors:54400 + role: EXIF/ELA/spectrogramă, NER, YOLO, OCR + - key: forensic + env: FORENSIC_API_URL + target: http://forensic:8080 + role: Trăsături forensice media (rPPG/lip-sync/forgery) + - key: brain + env: DIDI_BRAIN_URL + target: http://brain-api:8090 + role: Cache verificare + RAG (fact-checking) + - key: web + env: M17_WEB_API_URL + target: http://web-api:51100 + role: Căutare web pentru claims/surse (evidence) + - key: domain_check + env: DOMAIN_CHECK_API_URL + target: http://domain-check-api:11000 + role: WHOIS/DNS/SSL/blacklist domeniu — scor credibilitate sursă (T4) +paths: + /: + get: + summary: Citește root + tags: + - core + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/ai-tampered/analyze: + post: + summary: Creează / execută analyze + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/analyze-image: + post: + summary: Creează / execută analyze image + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/analyze-media: + post: + summary: Creează / execută analyze media + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/categories: + get: + summary: Listează categories + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/ai-tampered/config: + get: + summary: Citește config + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/ai-tampered/health: + get: + summary: Citește health + tags: + - ai-tampered + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/ai-tampered/models: + get: + summary: Listează models + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/ai-tampered/quick: + post: + summary: Creează / execută quick + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/results/{sessionId}: + get: + summary: Citește results + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/ai-tampered/stage-assignments: + get: + summary: Listează stage assignments + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Actualizează stage assignments + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/ai-tampered/test-model: + post: + summary: Creează / execută test model + tags: + - ai-tampered + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/analyze: + post: + summary: Creează / execută analyze + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/analyze-media: + post: + summary: Creează / execută analyze media + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/config: + get: + summary: Citește config + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/claims/health: + get: + summary: Citește health + tags: + - claims + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/claims/models: + get: + summary: Listează models + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/claims/results/{sessionId}: + get: + summary: Citește results + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/claims/stage-assignments: + get: + summary: Listează stage assignments + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Actualizează stage assignments + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/statuses: + get: + summary: Listează statuses + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/claims/test-model: + post: + summary: Creează / execută test model + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/claims/types: + get: + summary: Listează types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/domain/analyze: + post: + summary: Creează / execută analyze + tags: + - domain + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy — înlocuit de /api/v3/source-assessment/analyze + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/domain/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - domain + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy — înlocuit de source-assessment + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/health: + get: + summary: Citește health + tags: + - health + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/health/all: + get: + summary: Health profund — dependențe interne + integrare Lot 1 (AI) + description: > + Sondează toate dependențele agent-v3: infrastructura proprie (PostgreSQL, + Redis, RabbitMQ, didiFramework) și **serviciile de inteligență artificială + din Lotul 1** consumate prin `didi-network` (llm/vision, whisper, web, + video/BusterX, extractors, forensic, brain, domain-check T4). Serviciile + Lot 1 sunt verificate *fail-open*: o dependență AI indisponibilă produce + `degraded` (HTTP 200), nu `unhealthy` — reflectând degradarea grațioasă a + pipeline-ului. Endpoint-ul dublează rol de sondă de integrare Lot1↔Lot2 + (vezi `x-integrations` la nivel de specificație). + tags: + - health + security: + - bearerAuth: [] + responses: + '200': + description: Sistem healthy sau degraded (dependențe AI fail-open indisponibile) + content: + application/json: + schema: + $ref: '#/components/schemas/DeepHealthResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '503': + description: Sistem unhealthy (o dependență critică internă e jos) + content: + application/json: + schema: + $ref: '#/components/schemas/DeepHealthResponse' + x-tested: + date: '2026-07-09' + http_status: 200 + note: Probat live pe didi11; acoperă toate 9 integrări Lot 1 (raport 04) + /api/v3/media/download-url: + post: + summary: Creează / execută download url + tags: + - media + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/media/file/{bucket}/{objectKey}: + get: + summary: Citește {*objectKey} + tags: + - media + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: bucket + in: path + required: true + schema: + type: string + - name: objectKey + in: path + required: true + schema: + type: string + /api/v3/media/upload: + post: + summary: Creează / execută upload + tags: + - media + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/media/upload-url: + post: + summary: Creează / execută upload url + tags: + - media + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/moderation/flag: + post: + summary: Creează / execută flag + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/moderation/queue: + get: + summary: 'Coada de review HIL (filtre: status CSV, priority CSV, assigned_to)' + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + data: + type: array + items: + $ref: '#/components/schemas/ModerationQueueEntry' + total: + type: integer + limit: + type: integer + offset: + type: integer + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/moderation/queue/{queueId}: + get: + summary: Citește queue + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: queueId + in: path + required: true + schema: + type: string + /api/v3/moderation/queue/{queueId}/claim: + post: + summary: Creează / execută claim + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 403 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: queueId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/moderation/queue/{queueId}/resolve: + put: + summary: Rezolva o intrare HIL (approved/corrected/rejected); approved/corrected promoveaza atomii brain la + gold + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 403 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: queueId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ModerationResolveRequest' + /api/v3/moderation/stats: + get: + summary: Listează stats + tags: + - moderation + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/pipeline/{sessionId}/cancel: + post: + summary: Anuleaza o sesiune in curs (ownership check; starea `canceled` propagata Redis+PG) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/{sessionId}/component/{name}: + get: + summary: Citește component + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + - name: name + in: path + required: true + schema: + type: string + /api/v3/pipeline/{sessionId}/queue-status: + get: + summary: Progres procesare async (procent + componente finalizate) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/QueueStatus' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/pipeline/{sessionId}/result: + get: + summary: Rezultatul complet al sesiunii (cand status=completed) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AnalysisSession' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/pipeline/{sessionId}/resume: + post: + summary: 'Resume din checkpoint: re-dispatch DOAR componentele necompletate (409 daca completed/input expirat)' + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/{sessionId}/status: + get: + summary: Status sesiune (polling) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/QueueStatus' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/pipeline/analyze: + post: + summary: Analiza completa sincrona (toate componentele + verdict) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AnalysisSession' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeRequest' + /api/v3/pipeline/analyze-async: + post: + summary: Analiza completa asincrona — dispatch pe RabbitMQ, 202 + poll + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '202': + description: 202 Accepted + content: + application/json: + schema: + $ref: '#/components/schemas/AsyncAccepted' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeRequest' + /api/v3/pipeline/analyze-media: + post: + summary: Analiza media sincrona (media_url din MinIO) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeRequest' + /api/v3/pipeline/analyze-url: + post: + summary: Analiza URL inteligenta (detecteaza video/articol/imagine) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeRequest' + /api/v3/pipeline/dry-run: + post: + summary: 'Dry-run: rezolva planul complet (flow, dependente, cozi, lanturi modele, profil verdict) FARA dispatch + si zero credite' + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DryRunPlan' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeRequest' + /api/v3/pipeline/extension/analyze: + post: + summary: Creează / execută analyze + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 401 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/extension/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 401 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/extension/keys: + get: + summary: Listează keys + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută keys + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/extension/keys/{id}: + delete: + summary: Șterge keys + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/v3/pipeline/extension/status/{sessionId}: + get: + summary: Citește status + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 401 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/pipeline/extension/upload: + post: + summary: Creează / execută upload + tags: + - pipeline + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 401 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/pipeline/history: + get: + summary: Istoric analize utilizator (paginat) + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/HistoryPage' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/pipeline/history/{id}: + delete: + summary: Șterge history + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește history + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/v3/pipeline/history/admin: + get: + summary: 'Istoric admin, toti utilizatorii (filtre: search, risk_level, status, date) — necesita rol admin' + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/HistoryPage' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/pipeline/history/admin/{id}: + delete: + summary: Șterge admin + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește admin + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 500 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/v3/pipeline/queue-health: + get: + summary: Citește queue health + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/pipeline/verdict-config: + get: + summary: Citește verdict config + tags: + - pipeline + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/source-assessment/analyze: + post: + summary: Creează / execută analyze + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/source-assessment/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/source-assessment/analyze-media: + post: + summary: Creează / execută analyze media + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/source-assessment/config: + get: + summary: Citește config + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/source-assessment/health: + get: + summary: Citește health + tags: + - source-assessment + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/source-assessment/models: + get: + summary: Listează models + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/source-assessment/stage-assignments: + get: + summary: Listează stage assignments + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Actualizează stage assignments + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/source-assessment/test-model: + post: + summary: Creează / execută test model + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/analyze: + post: + summary: Creează / execută analyze + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/analyze-async: + post: + summary: Creează / execută analyze async + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/analyze-media: + post: + summary: Creează / execută analyze media + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/config: + get: + summary: Citește config + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/techniques/definitions: + get: + summary: Listează definitions + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/techniques/models: + get: + summary: Listează models + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/v3/techniques/results/{sessionId}: + get: + summary: Citește results + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/v3/techniques/stage-assignments: + get: + summary: Listează stage assignments + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Actualizează stage assignments + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/test-model: + post: + summary: Creează / execută test model + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/v3/techniques/test-openrouter: + post: + summary: Creează / execută test openrouter + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /metrics: + get: + summary: Listează metrics + tags: + - core + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + description: JWT Keycloak (realms didi-clients / didi-admins), semnat RS256, verificat criptografic contra + JWKS atât la gateway (Kong) cât și în backend + apiKeyAuth: + type: apiKey + in: header + name: X-API-Key + description: Cheie API extensie browser (format didi_ext_..., emisă via /api/extension-keys) + schemas: + ErrorResponse: + type: object + properties: + success: + type: boolean + example: false + error: + type: string + error_code: + type: string + correlation_id: + type: string + format: uuid + HealthCheck: + type: object + description: Rezultatul sondării unei dependențe individuale. + properties: + status: + type: string + enum: [healthy, unhealthy, unknown] + description: > + healthy = răspunde OK; unhealthy = eroare/HTTP non-2xx pe dependență + critică; unknown = dependență AL 1 fail-open indisponibilă (nu invalidează sistemul). + latency_ms: + type: integer + example: 12 + error: + type: string + DeepHealthResponse: + type: object + description: > + Răspunsul GET /api/v3/health/all. `checks` conține infrastructura internă + (postgres, redis, rabbitmq, framework) și integrările Lot 1 (llm, vision, + whisper, video, extractors, forensic, brain, domain_check). + properties: + status: + type: string + enum: [healthy, degraded, unhealthy] + description: degraded = o integrare Lot 1 fail-open (unknown) e indisponibilă + example: healthy + service: + type: string + example: agent-v3 + version: + type: string + example: 3.0.0 + timestamp: + type: string + format: date-time + total_check_ms: + type: integer + example: 76 + checks: + type: object + additionalProperties: + $ref: '#/components/schemas/HealthCheck' + properties: + postgres: { $ref: '#/components/schemas/HealthCheck' } + redis: { $ref: '#/components/schemas/HealthCheck' } + rabbitmq: { $ref: '#/components/schemas/HealthCheck' } + framework: { $ref: '#/components/schemas/HealthCheck' } + llm: { $ref: '#/components/schemas/HealthCheck' } + vision: { $ref: '#/components/schemas/HealthCheck' } + whisper: { $ref: '#/components/schemas/HealthCheck' } + video: { $ref: '#/components/schemas/HealthCheck' } + buster: { $ref: '#/components/schemas/HealthCheck' } + extractors: { $ref: '#/components/schemas/HealthCheck' } + forensic: { $ref: '#/components/schemas/HealthCheck' } + brain: { $ref: '#/components/schemas/HealthCheck' } + domain_check: { $ref: '#/components/schemas/HealthCheck' } + AnalyzeRequest: + type: object + properties: + text: + type: string + description: Text de analizat (20–50000 caractere) + minLength: 20 + maxLength: 50000 + media_type: + type: string + enum: + - text + - url + - image + - audio + - video + media_url: + type: string + description: URL media (MinIO sau extern) pentru image/audio/video + url: + type: string + description: URL articol/video pentru analiza de tip url + user_id: + type: string + description: keycloak_id; in productie derivat din JWT (fallback body doar in STAGING_MODE) + plan_type: + type: integer + minimum: 1 + maximum: 6 + description: Plan abonament 1–6; decide tier free(1–3)/premium(4–6) si prioritatea in coada + components: + type: array + items: + type: string + enum: + - techniques + - ai_tampered + - claims + - domain + description: Subset de componente de rulat (implicit toate) + skip_components: + type: array + items: + type: string + user_flagged: + type: boolean + description: true = enqueue fortat in coada de moderare HIL + media_duration_sec: + type: number + description: 'Durata media (guard API: video max 180s, audio max 420s)' + required: + - media_type + AsyncAccepted: + type: object + properties: + success: + type: boolean + async_: + type: boolean + data: + type: object + properties: + session_id: + type: string + format: uuid + status: + type: string + example: processing + queued_components: + type: array + items: + type: string + plan_type: + type: integer + poll_url: + type: string + result_url: + type: string + AnalysisSession: + type: object + properties: + session_id: + type: string + format: uuid + user_id: + type: string + user_email: + type: string + input_type: + type: string + enum: + - text + - url + - image + - audio + - video + input_text: + type: string + input_url: + type: string + input_media_url: + type: string + input_hash: + type: string + status: + type: string + enum: + - pending + - processing + - running + - completed + - failed + - canceled + components_run: + type: array + items: + type: string + components_skipped: + type: array + items: + type: string + risk_score: + type: number + minimum: 0 + maximum: 100 + risk_category: + type: string + risk_level: + type: string + confidence: + type: number + confidence_level: + type: string + started_at: + type: string + format: date-time + completed_at: + type: string + format: date-time + total_duration_ms: + type: integer + scenario_applied: + type: string + topic_applied: + type: string + source_app: + type: string + api_version: + type: string + example: v3 + created_at: + type: string + format: date-time + techniques: + $ref: '#/components/schemas/TechniquesResult' + ai_tampered: + $ref: '#/components/schemas/AiTamperedResult' + claims: + $ref: '#/components/schemas/ClaimsResult' + domain: + $ref: '#/components/schemas/DomainResult' + verdict: + $ref: '#/components/schemas/VerdictResult' + description: 'Contractul central al platformei (Anexa B din propunerea tehnica): sesiunea de analiza cu rezultatele + celor 4 componente + verdict' + TechniquesResult: + type: object + properties: + manipulation_score: + type: number + minimum: 0 + maximum: 100 + total_severity: + type: number + dimensions_affected: + type: array + items: + type: string + techniques_count: + type: integer + techniques_detected: + type: array + items: + type: object + coupling_context: + type: object + llm_screening: + type: string + llm_deep: + type: string + screening_duration_ms: + type: integer + deep_analysis_duration_ms: + type: integer + total_duration_ms: + type: integer + fallbacks_screening: + type: integer + fallbacks_deep: + type: integer + AiTamperedResult: + type: object + properties: + ai_probability: + type: number + minimum: 0 + maximum: 100 + verdict: + type: string + risk_score: + type: number + categories_affected: + type: array + items: + type: string + indicators_count: + type: integer + disclosure_detected: + type: boolean + disclosure_explicit: + type: boolean + disclosure_text: + type: string + indicators_detected: + type: array + items: + type: object + content_type: + type: string + image_analysis: + type: object + llm_screening: + type: string + llm_deep: + type: string + total_duration_ms: + type: integer + ClaimsResult: + type: object + properties: + total_claims: + type: integer + verified_true: + type: integer + verified_false: + type: integer + unverified: + type: integer + opinions: + type: integer + credibility_score: + type: number + minimum: 0 + maximum: 100 + interpretation: + type: string + claims_by_status: + type: object + claims_by_type: + type: object + claims_verified: + type: array + items: + type: object + llm_extraction: + type: string + llm_verification: + type: string + web_searches_made: + type: integer + total_duration_ms: + type: integer + DomainResult: + type: object + properties: + domain: + type: string + trust_score: + type: number + minimum: 0 + maximum: 100 + verdict: + type: string + risk_level: + type: string + age_days: + type: integer + is_blacklisted: + type: boolean + has_ssl: + type: boolean + ssl_valid: + type: boolean + red_flags: + type: array + items: + type: string + warnings: + type: array + items: + type: string + duration_ms: + type: integer + VerdictResult: + type: object + properties: + risk_score: + type: number + minimum: 0 + maximum: 100 + risk_category: + type: string + risk_category_color: + type: string + risk_level: + type: string + risk_level_color: + type: string + severity: + type: string + recommended_action: + type: string + confidence: + type: number + confidence_level: + type: string + score_manipulation: + type: number + score_claims: + type: number + score_ai: + type: number + score_source: + type: number + score_context: + type: number + applied_weights: + type: object + override_applied: + type: boolean + override_type: + type: string + override_reason: + type: string + override_adjustment: + type: number + context_summary: + type: object + components_used: + type: array + items: + type: string + weights_source: + type: string + duration_ms: + type: integer + explanation_ro: + type: string + explanation_en: + type: string + virality_score: + type: number + virality_level: + type: string + virality_factors: + type: array + items: + type: object + DryRunPlan: + type: object + properties: + success: + type: boolean + dry_run: + type: boolean + example: true + data: + type: object + properties: + media_type: + type: string + plan_type: + type: integer + flow: + type: string + example: intake → [techniques ∥ ai_tampered ∥ claims] → verdict_aggregator → persist + description: Reprezentarea workflow-ului cu dependente explicite (DAG-sau-workflow, caiet r.982) + results_queue: + type: string + nodes: + type: array + items: + type: object + properties: + component: + type: string + queue: + type: string + priority: + type: integer + timeout_ms: + type: integer + depends_on: + type: array + items: + type: string + stages: + type: object + description: Lanturile de modele LLM per etapa si tier (primary + fallbacks) + prompt_config_keys: + type: array + items: + type: string + skipped: + type: array + items: + type: object + properties: + component: + type: string + reason: + type: string + verdict_profile: + type: object + properties: + profile_code: + type: string + profile_name: + type: string + is_active: + type: boolean + weights: + type: object + min_components: + type: integer + override_cap: + type: integer + note: + type: string + QueueStatus: + type: object + properties: + session_id: + type: string + format: uuid + status: + type: string + progress: + type: number + completed_components: + type: array + items: + type: string + total_components: + type: integer + HistoryPage: + type: object + properties: + success: + type: boolean + data: + type: object + properties: + items: + type: array + items: + type: object + description: Sumar sesiune (fara JSONB-uri grele) + pagination: + type: object + properties: + page: + type: integer + limit: + type: integer + total: + type: integer + pages: + type: integer + ModerationQueueEntry: + type: object + properties: + queue_id: + type: integer + session_id: + type: string + format: uuid + priority: + type: integer + minimum: 1 + maximum: 5 + enqueue_reason: + type: string + enum: + - flagged + - low_confidence + - sensitive_topic + - mixed + enqueue_meta: + type: object + status: + type: string + enum: + - pending + - in_review + - resolved + - declined + - auto_closed + assigned_to: + type: string + assigned_at: + type: string + format: date-time + resolved_at: + type: string + format: date-time + resolved_by: + type: string + resolution_action: + type: string + enum: + - approved + - corrected + - rejected + time_in_queue_ms: + type: integer + time_in_review_ms: + type: integer + created_at: + type: string + format: date-time + ModerationResolveRequest: + type: object + properties: + action: + type: string + enum: + - approved + - corrected + - rejected + corrections: + type: object + description: 'Diff JSONB: {verdict?, techniques?, ai_tampered?, claims?}' + notes: + type: string + required: + - action diff --git a/backend/services/api-docs/didi-framework.yaml b/backend/services/api-docs/didi-framework.yaml new file mode 100644 index 0000000..4b58f62 --- /dev/null +++ b/backend/services/api-docs/didi-framework.yaml @@ -0,0 +1,14000 @@ +openapi: 3.0.3 +info: + title: DIDI Framework — Parameters & Platform Management API + version: 3.0.0 + description: 'API-ul de management al parametrilor platformei DIDI (Lot 2 — Modulele 5–7). + + CRUD complet pe definițiile de pipeline (clonare/versionare/activare/import-export), ierarhia + + de tehnici, verdicte, ponderi, provideri și modele LLM (cu tier free/premium), utilizatori, + + credite și configurarea HIL. Sincronizare PostgreSQL → Redis prin POST /api/sync-redis. + + Alias: /api/pipelines ≡ /api/input-profiles.' +servers: +- url: http://localhost:18000/framework + description: Kong API Gateway (JWT enforced) — punctul unic de intrare public +tags: +- name: admin +- name: auth +- name: author-classifications +- name: author-credibility +- name: claims +- name: core +- name: dimensions +- name: domain-age-scores +- name: domain-red-flags +- name: domain-risk-levels +- name: extension-keys +- name: health +- name: history +- name: indicators +- name: input-profiles +- name: metrics +- name: moderation-config +- name: moderation-roles +- name: notifications +- name: overview +- name: platform-modifiers +- name: platforms +- name: prompts +- name: providers +- name: sensitive-topics +- name: skills +- name: source-assessment +- name: source-assessment-ranges +- name: source-credibility +- name: sources +- name: subdimensions +- name: subscriptions +- name: sync-analysis +- name: sync-redis +- name: techniques +- name: uploads +- name: validation-rules +- name: verdicts +- name: waitlist +- name: webhooks +- name: weights +security: +- bearerAuth: [] +paths: + /: + get: + summary: Citește root + tags: + - core + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/audit-log: + get: + summary: Citește audit log + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/containers: + get: + summary: Listează containers + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/groups: + get: + summary: Listează groups + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/logs/{container}: + get: + summary: Citește logs + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: container + in: path + required: true + schema: + type: string + /api/admin/plans: + get: + summary: Listează plans + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/plans/{id}: + get: + summary: Citește plans + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează plans + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/realm-roles: + get: + summary: Listează realm roles + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/social/{post_id}: + delete: + summary: Șterge social + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: post_id + in: path + required: true + schema: + type: string + get: + summary: Citește social + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: post_id + in: path + required: true + schema: + type: string + /api/admin/social/draft: + post: + summary: Creează / execută draft + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/social/drafts: + get: + summary: Listează drafts + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/social/generate-from-session/{session_id}: + post: + summary: Creează / execută generate from session + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: session_id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/social/health: + get: + summary: Citește health + tags: + - admin + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/social/history: + get: + summary: Citește history + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/admin/social/publish/{post_id}: + post: + summary: Creează / execută publish + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: post_id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users: + get: + summary: Listează users + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută users + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}: + delete: + summary: Șterge users + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește users + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează users + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/email-verified: + put: + summary: Actualizează email verified + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/group: + get: + summary: Citește group + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează group + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/reset-password: + post: + summary: Creează / execută reset password + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/roles: + get: + summary: Listează roles + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează roles + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/subscription: + put: + summary: Actualizează subscription + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/admin/users/{id}/usage-history: + get: + summary: Citește usage history + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/admin/users/sync: + post: + summary: Creează / execută sync + tags: + - admin + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/auth/credits: + get: + summary: Listează credits + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/auth/internal/check-credits: + post: + summary: '[intern, apelat de agent-v3] Verifica creditele si returneaza planType — sursa unica de adevar pentru + tier' + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CheckCreditsResponse' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CheckCreditsRequest' + /api/auth/internal/deduct-credits: + post: + summary: '[intern] Deduce creditele dupa analiza' + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + keycloak_id: + type: string + media_type: + type: string + session_id: + type: string + /api/auth/internal/get-bucket-info: + post: + summary: Creează / execută get bucket info + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/auth/me: + get: + summary: Citește me + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/auth/profile: + put: + summary: Actualizează profile + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/auth/register: + post: + summary: Creează / execută register + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/auth/use-credit: + post: + summary: Creează / execută use credit + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/auth/verify-email: + get: + summary: Citește verify email + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută verify email + tags: + - auth + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/author-classifications: + get: + summary: Listează author classifications + tags: + - author-classifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută author classifications + tags: + - author-classifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/author-classifications/{id}: + delete: + summary: Șterge author classifications + tags: + - author-classifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește author classifications + tags: + - author-classifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează author classifications + tags: + - author-classifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/author-credibility: + get: + summary: Citește author credibility + tags: + - author-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută author credibility + tags: + - author-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/author-credibility/{id}: + delete: + summary: Șterge author credibility + tags: + - author-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește author credibility + tags: + - author-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează author credibility + tags: + - author-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/all: + get: + summary: Citește all + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/claims/confidence: + get: + summary: Citește confidence + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută confidence + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/confidence/{id}: + delete: + summary: Șterge confidence + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește confidence + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează confidence + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/interpretation: + get: + summary: Citește interpretation + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută interpretation + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/interpretation/{id}: + delete: + summary: Șterge interpretation + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește interpretation + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează interpretation + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/status: + get: + summary: Listează status + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută status + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/status/{id}: + delete: + summary: Șterge status + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește status + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează status + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/types: + get: + summary: Listează types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/claims/types/{id}: + delete: + summary: Șterge types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează types + tags: + - claims + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/dimensions: + get: + summary: Listează dimensions + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută dimensions + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/dimensions/{id}: + delete: + summary: Șterge dimensions + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește dimensions + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează dimensions + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/dimensions/{id}/dependencies: + get: + summary: Listează dependencies + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/dimensions/with-counts: + get: + summary: Listează with counts + tags: + - dimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/domain-age-scores: + get: + summary: Listează domain age scores + tags: + - domain-age-scores + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută domain age scores + tags: + - domain-age-scores + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/domain-age-scores/{id}: + delete: + summary: Șterge domain age scores + tags: + - domain-age-scores + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește domain age scores + tags: + - domain-age-scores + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează domain age scores + tags: + - domain-age-scores + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/domain-red-flags: + get: + summary: Listează domain red flags + tags: + - domain-red-flags + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută domain red flags + tags: + - domain-red-flags + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/domain-red-flags/{id}: + delete: + summary: Șterge domain red flags + tags: + - domain-red-flags + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește domain red flags + tags: + - domain-red-flags + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează domain red flags + tags: + - domain-red-flags + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/domain-risk-levels: + get: + summary: Listează domain risk levels + tags: + - domain-risk-levels + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută domain risk levels + tags: + - domain-risk-levels + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/domain-risk-levels/{id}: + delete: + summary: Șterge domain risk levels + tags: + - domain-risk-levels + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește domain risk levels + tags: + - domain-risk-levels + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează domain risk levels + tags: + - domain-risk-levels + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/extension-keys: + get: + summary: Listează extension keys + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută extension keys + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/extension-keys/{id}: + delete: + summary: Șterge extension keys + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează extension keys + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/extension-keys/{id}/usage: + post: + summary: Creează / execută usage + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/extension-keys/usage-by-key: + post: + summary: Creează / execută usage by key + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/extension-keys/user/{userId}: + get: + summary: Citește user + tags: + - extension-keys + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: userId + in: path + required: true + schema: + type: string + /api/extension-keys/validate: + get: + summary: Citește validate + tags: + - extension-keys + security: + - apiKeyAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + /api/history: + get: + summary: Citește history + tags: + - history + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + /api/history/{sessionId}: + delete: + summary: Șterge history + tags: + - history + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + get: + summary: Citește history + tags: + - history + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + /api/history/admin: + get: + summary: Citește admin + tags: + - history + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/indicators: + get: + summary: Listează indicators + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută indicators + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/indicators/{techniqueId}/{indicatorId}: + delete: + summary: Șterge indicators + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + - name: indicatorId + in: path + required: true + schema: + type: string + put: + summary: Actualizează indicators + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + - name: indicatorId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/indicators/bulk: + post: + summary: Creează / execută bulk + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/indicators/bulk-for-technique/{techniqueId}: + post: + summary: Creează / execută bulk for technique + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/indicators/by-technique/{techniqueId}: + delete: + summary: Șterge by technique + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + get: + summary: Citește by technique + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + /api/indicators/missing: + get: + summary: Citește missing + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/indicators/stats: + get: + summary: Listează stats + tags: + - indicators + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/input-profiles: + get: + summary: Listează input profiles + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/input-profiles/{code}: + get: + summary: Citește input profiles + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + put: + summary: Actualizează input profiles + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/{code}/${action}: + post: + summary: Creează / execută ${action} + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + - name: action + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/{code}/clone: + post: + summary: Creează / execută clone + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/{code}/overrides: + get: + summary: Listează overrides + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + put: + summary: Actualizează overrides + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/{code}/versions: + get: + summary: Listează versions + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + /api/input-profiles/{code}/versions/{versionId}/restore: + post: + summary: Creează / execută restore + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + - name: versionId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/import: + post: + summary: Creează / execută import + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/input-profiles/scoring-config/{component}: + get: + summary: Citește scoring config + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: component + in: path + required: true + schema: + type: string + put: + summary: Actualizează scoring config + tags: + - input-profiles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: component + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/moderation-config: + get: + summary: Config HIL triage + brain client (single-row) + tags: + - moderation-config + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + data: + $ref: '#/components/schemas/ModerationConfig' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Update config HIL (campuri whitelisted) + tags: + - moderation-config + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ModerationConfig' + /api/moderation-roles: + get: + summary: Listează moderation roles + tags: + - moderation-roles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/moderation-roles/{code}: + put: + summary: Actualizează moderation roles + tags: + - moderation-roles + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: code + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/notifications/credit-reset: + post: + summary: Creează / execută credit reset + tags: + - notifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/notifications/health: + get: + summary: Citește health + tags: + - notifications + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/notifications/test: + post: + summary: Creează / execută test + tags: + - notifications + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/overview/docker-health: + get: + summary: Citește docker health + tags: + - overview + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/overview/health: + get: + summary: Citește health + tags: + - overview + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/overview/stats: + get: + summary: Listează stats + tags: + - overview + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/platform-modifiers: + get: + summary: Listează platform modifiers + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută platform modifiers + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/platform-modifiers/{id}: + delete: + summary: Șterge platform modifiers + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește platform modifiers + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează platform modifiers + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/platform-modifiers/{id}/dependencies: + get: + summary: Listează dependencies + tags: + - platform-modifiers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/platforms: + get: + summary: Listează platforms + tags: + - platforms + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută platforms + tags: + - platforms + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/platforms/{id}: + delete: + summary: Șterge platforms + tags: + - platforms + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește platforms + tags: + - platforms + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează platforms + tags: + - platforms + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/prompts: + get: + summary: Listează prompts + tags: + - prompts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy — prompturile operaționale sunt în DB (/api/providers/prompts) + /api/prompts/{step}: + get: + summary: Citește prompts + tags: + - prompts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy + parameters: + - name: step + in: path + required: true + schema: + type: string + /api/prompts/{step}/sections: + get: + summary: Listează sections + tags: + - prompts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy + parameters: + - name: step + in: path + required: true + schema: + type: string + /api/providers/all: + get: + summary: Citește all + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/providers/assignments: + get: + summary: Assignments componenta→model per etapa si tier (?tier=free|premium filtreaza server-side) + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + data: + type: array + items: + $ref: '#/components/schemas/StageAssignment' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută assignments + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/assignments/{id}: + delete: + summary: Șterge assignments + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește assignments + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează assignments + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/configs: + get: + summary: Listează configs + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută configs + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/configs/{id}: + delete: + summary: Șterge configs + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește configs + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează configs + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/keys: + get: + summary: Listează keys + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută keys + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/keys/{id}: + delete: + summary: Șterge keys + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește keys + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează keys + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/models: + get: + summary: Catalog modele LLM cu atribute deployment/compute_target/quantization/capabilities + costuri per + 1M tokeni + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + data: + type: array + items: + $ref: '#/components/schemas/LlmModel' + count: + type: integer + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută models + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/models/{id}: + delete: + summary: Șterge models + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește models + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează models + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/prompts: + get: + summary: Listează prompts + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută prompts + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/prompts/{id}: + delete: + summary: Șterge prompts + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește prompts + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează prompts + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/providers/test/{providerId}: + post: + summary: Creează / execută test + tags: + - providers + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: providerId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sensitive-topics: + get: + summary: Listează sensitive topics + tags: + - sensitive-topics + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută sensitive topics + tags: + - sensitive-topics + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sensitive-topics/{id}: + delete: + summary: Șterge sensitive topics + tags: + - sensitive-topics + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează sensitive topics + tags: + - sensitive-topics + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/skills: + get: + summary: 'Catalog skills: 6 componente de analiza + 10 module platforma AI (?health=true adauga probe live) + + code-jobs container-isolated' + tags: + - skills + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SkillsCatalog' + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/source-assessment-ranges: + get: + summary: Listează source assessment ranges + tags: + - source-assessment-ranges + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/source-assessment/all: + get: + summary: Citește all + tags: + - source-assessment + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/source-credibility: + get: + summary: Citește source credibility + tags: + - source-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută source credibility + tags: + - source-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/source-credibility/{id}: + delete: + summary: Șterge source credibility + tags: + - source-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește source credibility + tags: + - source-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează source credibility + tags: + - source-credibility + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sources: + get: + summary: Listează sources + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută sources + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sources/{id}: + delete: + summary: Șterge sources + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 409 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește sources + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează sources + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sources/{id}/dependencies: + get: + summary: Listează dependencies + tags: + - sources + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/subdimensions: + get: + summary: Listează subdimensions + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută subdimensions + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/subdimensions/{id}: + delete: + summary: Șterge subdimensions + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește subdimensions + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează subdimensions + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/subdimensions/{id}/dependencies: + get: + summary: Listează dependencies + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/subdimensions/by-dimension/{dimensionId}: + get: + summary: Citește by dimension + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: dimensionId + in: path + required: true + schema: + type: string + /api/subdimensions/with-counts: + get: + summary: Listează with counts + tags: + - subdimensions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/subscriptions/one-time-products: + get: + summary: Listează one time products + tags: + - subscriptions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/subscriptions/plans: + get: + summary: Listează plans + tags: + - subscriptions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/subscriptions/portal: + post: + summary: Creează / execută portal + tags: + - subscriptions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/subscriptions/upgrade: + post: + summary: Creează / execută upgrade + tags: + - subscriptions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/subscriptions/usage: + get: + summary: Citește usage + tags: + - subscriptions + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/sync-analysis/{sessionId}: + post: + summary: Creează / execută sync analysis + tags: + - sync-analysis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy — agent-v3 persistă direct în PG + parameters: + - name: sessionId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sync-analysis/batch: + post: + summary: Creează / execută batch + tags: + - sync-analysis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sync-analysis/pending: + get: + summary: Citește pending + tags: + - sync-analysis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy + /api/sync-analysis/stats: + get: + summary: Listează stats + tags: + - sync-analysis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Legacy + /api/sync-redis: + post: + summary: Sincronizeaza toti parametrii din PostgreSQL in Redis (idempotent; ~51 chei didi:framework:* + didi:config:*) + tags: + - sync-redis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/sync-redis/data/{category}: + get: + summary: Citește data + tags: + - sync-redis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: category + in: path + required: true + schema: + type: string + /api/sync-redis/status: + get: + summary: Listează status + tags: + - sync-redis + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/techniques: + get: + summary: Listează techniques + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută techniques + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/techniques/{id}: + delete: + summary: Șterge techniques + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește techniques + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează techniques + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/techniques/{id}/dependencies: + get: + summary: Listează dependencies + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/techniques/by-subdimension/{subdimensionId}: + get: + summary: Citește by subdimension + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: subdimensionId + in: path + required: true + schema: + type: string + /api/techniques/with-hierarchy: + get: + summary: Citește with hierarchy + tags: + - techniques + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/uploads: + get: + summary: Listează uploads + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută uploads + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/uploads/{fileId}: + delete: + summary: Șterge uploads + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: fileId + in: path + required: true + schema: + type: string + get: + summary: Citește uploads + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: fileId + in: path + required: true + schema: + type: string + /api/uploads/{fileId}/url: + get: + summary: Citește url + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: fileId + in: path + required: true + schema: + type: string + /api/uploads/buckets/stats: + get: + summary: Listează stats + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/uploads/health: + get: + summary: Citește health + tags: + - uploads + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/uploads/multipart: + post: + summary: Creează / execută multipart + tags: + - uploads + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/validation-rules: + get: + summary: Listează validation rules + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută validation rules + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/validation-rules/{id}: + delete: + summary: Șterge validation rules + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește validation rules + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează validation rules + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/validation-rules/bulk-for-technique/{techniqueId}: + post: + summary: Creează / execută bulk for technique + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/validation-rules/by-technique/{techniqueId}: + delete: + summary: Șterge by technique + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + get: + summary: Citește by technique + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: techniqueId + in: path + required: true + schema: + type: string + /api/validation-rules/stats: + get: + summary: Listează stats + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/validation-rules/with-techniques: + get: + summary: Listează with techniques + tags: + - validation-rules + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/verdicts/all: + get: + summary: Citește all + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/verdicts/categories: + get: + summary: Listează categories + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută categories + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/categories/{id}: + delete: + summary: Șterge categories + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește categories + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează categories + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/risk: + get: + summary: Citește risk + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută risk + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/risk/{id}: + delete: + summary: Șterge risk + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește risk + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează risk + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/runtime-config: + get: + summary: Citește runtime config + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + put: + summary: Actualizează runtime config + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/runtime-config/{section}: + patch: + summary: Actualizează parțial runtime config + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: section + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/severity: + get: + summary: Citește severity + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută severity + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/verdicts/severity/{id}: + delete: + summary: Șterge severity + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește severity + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează severity + tags: + - verdicts + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/waitlist: + get: + summary: Citește waitlist + tags: + - waitlist + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 500 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Necesită STAGING_DB_HOST + container staging-postgres (absent pe didi11) + post: + summary: Creează / execută waitlist + tags: + - waitlist + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Necesită STAGING_DB_HOST + container staging-postgres (absent pe didi11) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/waitlist/{id}: + delete: + summary: Șterge waitlist + tags: + - waitlist + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 500 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Vezi /api/waitlist + parameters: + - name: id + in: path + required: true + schema: + type: string + /api/waitlist/count: + get: + summary: Citește count + tags: + - waitlist + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 500 + note: Probat live pe didi11 (proba non-distructivă) + deprecated: true + description: Vezi /api/waitlist + /api/weights/all: + get: + summary: Citește all + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /api/weights/components: + get: + summary: Listează components + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută components + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/weights/components/{id}: + delete: + summary: Șterge components + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește components + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează components + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/weights/multipliers: + get: + summary: Listează multipliers + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută multipliers + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/weights/multipliers/{id}: + delete: + summary: Șterge multipliers + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește multipliers + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează multipliers + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/weights/multipliers/type/{type}: + get: + summary: Citește type + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: type + in: path + required: true + schema: + type: string + /api/weights/scenarios: + get: + summary: Listează scenarios + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + post: + summary: Creează / execută scenarios + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /api/weights/scenarios/{id}: + delete: + summary: Șterge scenarios + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + get: + summary: Citește scenarios + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + put: + summary: Actualizează scenarios + tags: + - weights + security: + - bearerAuth: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 404 + note: Probat live pe didi11 (proba non-distructivă) + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + /health: + get: + summary: Citește health + tags: + - health + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /health/all: + get: + summary: Citește all + tags: + - health + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /metrics: + get: + summary: Listează metrics + tags: + - metrics + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 200 + note: Probat live pe didi11 (proba non-distructivă) + /webhooks/stripe: + post: + summary: Creează / execută stripe + tags: + - webhooks + security: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + example: true + data: + description: Payload-ul raspunsului + '400': + description: Cerere invalidă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Token lipsă/invalid (JWT RS256 verificat criptografic) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Resursă inexistentă + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + x-tested: + date: '2026-07-08' + http_status: 400 + note: Probat live pe didi11 (proba non-distructivă) + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + description: JWT Keycloak (realms didi-clients / didi-admins), semnat RS256, verificat criptografic contra + JWKS atât la gateway (Kong) cât și în backend + apiKeyAuth: + type: apiKey + in: header + name: X-API-Key + description: Cheie API extensie browser (format didi_ext_..., emisă via /api/extension-keys) + schemas: + ErrorResponse: + type: object + properties: + success: + type: boolean + example: false + error: + type: string + error_code: + type: string + correlation_id: + type: string + format: uuid + PipelineProfile: + type: object + properties: + profile_id: + type: integer + profile_code: + type: string + enum: + - text_no_url + - text_with_url + - image + - audio + - video + - url + profile_name: + type: string + description: + type: string + weight_techniques: + type: integer + weight_claims: + type: integer + weight_ai_tampered: + type: integer + weight_source: + type: integer + role_techniques: + type: string + role_claims: + type: string + role_ai_tampered: + type: string + role_source: + type: string + min_components: + type: integer + primary_components: + type: array + items: + type: string + required_any: + type: array + items: + type: string + missing_techniques: + type: string + missing_claims: + type: string + missing_ai_tampered: + type: string + missing_source: + type: string + override_cap: + type: integer + confidence_config: + type: object + is_active: + type: boolean + description: 'Definitia de pipeline (input_type_profile): ponderi per componenta, reguli INCONCLUSIVE, override-uri. + CRUD + clonare + versionare + activare = cerinta Modul 1 caiet' + CheckCreditsRequest: + type: object + properties: + keycloak_id: + type: string + format: uuid + media_type: + type: string + enum: + - text + - url + - image + - audio + - video + required: + - keycloak_id + - media_type + CheckCreditsResponse: + type: object + properties: + success: + type: boolean + data: + type: object + properties: + hasEnoughCredits: + type: boolean + creditsRemained: + type: integer + creditCost: + type: integer + planName: + type: string + planType: + type: integer + minimum: 1 + maximum: 6 + description: 'Sursa unica de adevar pentru tier: 1–3 = free, 4–6 = premium' + mediaType: + type: string + LlmModel: + type: object + properties: + model_id: + type: integer + provider_id: + type: integer + model_code: + type: string + model_name: + type: string + context_window: + type: integer + max_output_tokens: + type: integer + input_cost_per_1m: + type: string + output_cost_per_1m: + type: string + supports_streaming: + type: boolean + supports_tools: + type: boolean + supports_vision: + type: boolean + is_active: + type: boolean + deployment: + type: string + enum: + - local + - remote + description: Atribut catalog (migratia 017) + compute_target: + type: string + enum: + - cpu + - gpu + description: Atribut catalog (migratia 017) + quantization: + type: string + capabilities: + type: array + items: + type: string + provider_code: + type: string + provider_name: + type: string + StageAssignment: + type: object + properties: + assignment_id: + type: integer + component_code: + type: string + stage_code: + type: string + tier: + type: string + enum: + - free + - premium + fallback_order: + type: integer + model_id: + type: integer + is_active: + type: boolean + description: Lantul de modele LLM per componenta+etapa+tier (primary = fallback_order 1) + SkillsCatalog: + type: object + properties: + success: + type: boolean + data: + type: object + properties: + analysis_components: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + queue: + type: string + inputs: + type: array + items: + type: string + outputs: + type: array + items: + type: string + configurable_via: + type: string + extractor_skills: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + runtime: + type: string + port: + type: integer + health_path: + type: string + capabilities: + type: array + items: + type: string + description: + type: string + host: + type: string + health: + type: string + description: Prezent doar cu ?health=true + code_jobs: + type: object + properties: + status: + type: string + note: + type: string + models_catalog: + type: string + pipelines_catalog: + type: string + counts: + type: object + properties: + analysis_components: + type: integer + extractor_skills: + type: integer + ModerationConfig: + type: object + properties: + config_id: + type: integer + example: 1 + triage_enabled: + type: boolean + confidence_low: + type: string + risk_grey_min: + type: string + risk_grey_max: + type: string + queue_relax_at: + type: integer + queue_strict_at: + type: integer + auto_tune_enabled: + type: boolean + brain_enabled: + type: boolean + brain_url: + type: string + brain_lookup_timeout_ms: + type: integer + brain_write_timeout_ms: + type: integer + brain_confidence_min_silver: + type: string + brain_semantic_threshold: + type: string + brain_per_component: + type: object + properties: + techniques: + type: boolean + ai_tampered: + type: boolean + claims: + type: boolean + updated_by: + type: string + updated_at: + type: string + format: date-time + CrudEntity: + type: object + description: Entitate parametru framework — campurile corespund coloanelor tabelei PG (vezi INDEX.md didiFramework + §Baza de date) + additionalProperties: true diff --git a/backend/services/gateway-auth-layer/didiKeycloak/realm-import/didi-clients-realm.json b/backend/services/gateway-auth-layer/didiKeycloak/realm-import/didi-clients-realm.json index b86520c..995cb8c 100644 --- a/backend/services/gateway-auth-layer/didiKeycloak/realm-import/didi-clients-realm.json +++ b/backend/services/gateway-auth-layer/didiKeycloak/realm-import/didi-clients-realm.json @@ -215,7 +215,7 @@ "serviceAccountsEnabled": false, "attributes": { "pkce.code.challenge.method": "S256", - "post.logout.redirect.uris": "http://localhost:13003/* http://localhost:3003/* http://localhost:33003/* http://10.11.50.11:33003/*" + "post.logout.redirect.uris": "http://localhost:13003/* http://localhost:3003/* http://localhost:33003/* http://ext.local:33003/*" }, "redirectUris": [ "http://localhost:13003/*", @@ -227,8 +227,8 @@ "http://127.0.0.1:3003/*", "http://127.0.0.1:33003/*", "http://127.0.0.1:33001/*", - "http://10.11.50.11:33003/*", - "http://10.11.50.11:3003/*" + "http://ext.local:33003/*", + "http://ext.local:3003/*" ], "webOrigins": [ "http://localhost:13003", @@ -240,8 +240,8 @@ "http://127.0.0.1:3003", "http://127.0.0.1:33003", "http://127.0.0.1:33001", - "http://10.11.50.11:33003", - "http://10.11.50.11:3003", + "http://ext.local:33003", + "http://ext.local:3003", "+" ] }, diff --git a/backend/services/gateway-auth-layer/didiKong/declarative/kong-cluster.yml b/backend/services/gateway-auth-layer/didiKong/declarative/kong-cluster.yml index 94d2516..bf410bd 100644 --- a/backend/services/gateway-auth-layer/didiKong/declarative/kong-cluster.yml +++ b/backend/services/gateway-auth-layer/didiKong/declarative/kong-cluster.yml @@ -12,9 +12,9 @@ _info: # ============================================================ # DIDI tenant configuration for shared Kong cluster -# Cluster CP: 10.11.10.176:8001 | DP1: 10.11.10.177 | DP2: 10.11.10.178 | LB: 10.11.10.175 +# Cluster CP: kong-cp.local:8001 | DP1: kong-dp1.local | DP2: kong-dp2.local | LB: kong-lb.local # Hosts: didi365.eu (public) + www.didi365.eu + localhost (internal alias) -# Upstreams: 10.11.10.12 (DIDI host) on exposed ports +# Upstreams: didi.local (DIDI host) on exposed ports # Plugins are applied per-service (NOT global) — cluster shared with lege365/rafai/biddie/notify # ============================================================ @@ -146,7 +146,7 @@ services: # ---------------------------------------------------------- - name: didi-agent-v3 protocol: http - host: 10.11.10.12 + host: didi.local port: 24803 retries: 5 connect_timeout: 60000 @@ -430,7 +430,7 @@ services: # ---------------------------------------------------------- - name: didi-framework protocol: http - host: 10.11.10.12 + host: didi.local port: 3005 retries: 5 connect_timeout: 60000 @@ -525,7 +525,7 @@ services: tags: [product:didi, env:prod] # ---------------------------------------------------------- - # NOTE: didi-admin NOT migrated — internal-only (VPN access to 10.11.10.12 directly). + # NOTE: didi-admin NOT migrated — internal-only (VPN access to didi.local directly). # Will be revisited after admin nginx is replaced with simpler setup. # ---------------------------------------------------------- diff --git a/backend/services/orchestration-layer/agent-v3/.env.example b/backend/services/orchestration-layer/agent-v3/.env.example index 098d0ce..7f58ffc 100644 --- a/backend/services/orchestration-layer/agent-v3/.env.example +++ b/backend/services/orchestration-layer/agent-v3/.env.example @@ -33,11 +33,11 @@ EXTRACTORS_URL=http://:54400 # Lot 1 — Platforma AI: TOATE URL-urile serviciilor AI, configurabile per deployment. # Pe o mașină nouă cu Lot 1 propriu, schimbă doar host-urile de mai jos. # ============================================================================ -LLM_ROUTER_URL=http://10.11.10.17:14011 # llm-inference (Qwen text/OCR) -VISION_LLM_URL=http://10.11.10.17:14011 # Qwen Vision (fallback la LLM_ROUTER_URL) -DIDI_BRAIN_URL=http://10.11.10.12:8090 # brain (verification cache + RAG) -M17_WHISPER_URL=http://10.11.10.17:54300/v1/audio/transcriptions # transcriere audio -M17_WEB_API_URL=http://10.11.10.13:51100 # web search (claims/source) +LLM_ROUTER_URL=http://llm.local:14011 # llm-inference (Qwen text/OCR) +VISION_LLM_URL=http://llm.local:14011 # Qwen Vision (fallback la LLM_ROUTER_URL) +DIDI_BRAIN_URL=http://didi.local:8090 # brain (verification cache + RAG) +M17_WHISPER_URL=http://llm.local:54300/v1/audio/transcriptions # transcriere audio +M17_WEB_API_URL=http://websearch.local:51100 # web search (claims/source) FORENSIC_API_URL=http://forensic-features-api:8080 # forensic m25-m29 DOMAIN_CHECK_API_URL=http://domain-check-api:11000/api/v1/check/check # domain check INTERNAL_MEDIA_URL=http://didi-agent-v3:24803 # URL intern media pt modelele locale diff --git a/backend/services/orchestration-layer/agent-v3/docker-compose.yml b/backend/services/orchestration-layer/agent-v3/docker-compose.yml index dc8dcc7..d51183e 100644 --- a/backend/services/orchestration-layer/agent-v3/docker-compose.yml +++ b/backend/services/orchestration-layer/agent-v3/docker-compose.yml @@ -32,13 +32,13 @@ x-worker-env: &worker-env JWT_VERIFY_ENABLED: ${JWT_VERIFY_ENABLED:-true} FRAMEWORK_API_URL: http://didi-framework:3005 SYNC_API_URL: http://didi-framework:3005/api/sync-analysis - PUBLIC_API_BASE_URL: ${PUBLIC_API_BASE_URL:-https://10.11.10.11:8443} + PUBLIC_API_BASE_URL: ${PUBLIC_API_BASE_URL:-https://api.local:8443} INTERNAL_MEDIA_URL: ${INTERNAL_MEDIA_URL:-http://didi-agent-v3:24803} # === Lot 1 (platforma AI) — toate configurabile per deployment via .env === - LLM_ROUTER_URL: ${LLM_ROUTER_URL:-http://10.11.10.17:14011} - VISION_LLM_URL: ${VISION_LLM_URL:-http://10.11.10.17:14011} + LLM_ROUTER_URL: ${LLM_ROUTER_URL:-http://llm.local:14011} + VISION_LLM_URL: ${VISION_LLM_URL:-http://llm.local:14011} DOMAIN_CHECK_API_URL: ${DOMAIN_CHECK_API_URL:-http://domain-check-api:11000/api/v1/check/check} - M17_WEB_API_URL: ${M17_WEB_API_URL:-http://10.11.10.13:51100} + M17_WEB_API_URL: ${M17_WEB_API_URL:-http://websearch.local:51100} DIDI_BRAIN_URL: ${DIDI_BRAIN_URL:-http://didibrain-api:8090} # OpenTelemetry — traces export to OTel Collector → Jaeger OTEL_EXPORTER_OTLP_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT:-http://didi-otel-collector:4317} @@ -47,7 +47,7 @@ x-worker-env: &worker-env # to /api/ingest/event so analyses appear in the unified Insights/History # view (module=agent_v3). Empty = sink disabled. DASHBOARD_URL: ${DASHBOARD_URL:-http://didiAI-dashboard:51300} - M17_WHISPER_URL: ${M17_WHISPER_URL:-http://10.11.10.17:54300/v1/audio/transcriptions} + M17_WHISPER_URL: ${M17_WHISPER_URL:-http://llm.local:54300/v1/audio/transcriptions} M17_WHISPER_TOKEN: ${M17_WHISPER_TOKEN} OPENROUTER_API_KEY: ${OPENROUTER_API_KEY} OPENAI_API_KEY: ${OPENAI_API_KEY} diff --git a/backend/services/orchestration-layer/agent-v3/src/api/routes.ts b/backend/services/orchestration-layer/agent-v3/src/api/routes.ts index b98d666..ad4ce2a 100644 --- a/backend/services/orchestration-layer/agent-v3/src/api/routes.ts +++ b/backend/services/orchestration-layer/agent-v3/src/api/routes.ts @@ -83,7 +83,7 @@ router.get('/health/all', async (req: Request, res: Response) => { } // Brain (didi_brain) — fail-open dependency - const brainUrl = process.env.DIDI_BRAIN_URL || 'http://10.11.10.12:8090'; + const brainUrl = process.env.DIDI_BRAIN_URL || 'http://didi.local:8090'; try { const t = Date.now(); const r = await fetch(`${brainUrl}/health`, { signal: AbortSignal.timeout(3000) }); @@ -93,7 +93,7 @@ router.get('/health/all', async (req: Request, res: Response) => { } // LLM router - const llmUrl = process.env.LLM_ROUTER_URL || 'http://10.11.10.17:14011'; + const llmUrl = process.env.LLM_ROUTER_URL || 'http://llm.local:14011'; try { const t = Date.now(); const r = await fetch(`${llmUrl}/health`, { signal: AbortSignal.timeout(5000) }); diff --git a/backend/services/orchestration-layer/agent-v3/src/shared/media/vision.ts b/backend/services/orchestration-layer/agent-v3/src/shared/media/vision.ts index 2bb8580..498bfe3 100644 --- a/backend/services/orchestration-layer/agent-v3/src/shared/media/vision.ts +++ b/backend/services/orchestration-layer/agent-v3/src/shared/media/vision.ts @@ -13,7 +13,7 @@ import { log } from '../logger'; // Internal URL for local models that can't reach didi365.eu // Points to MinIO directly since public URLs use /storage/ path (Kong→MinIO) -const INTERNAL_MEDIA_BASE = process.env.INTERNAL_MEDIA_URL || 'http://10.11.10.12:9000'; +const INTERNAL_MEDIA_BASE = process.env.INTERNAL_MEDIA_URL || 'http://didi.local:9000'; // Vision LLMs may have training cutoffs; without an explicit current date they // can flag content dated e.g. "September 2025" as a "future date" while the @@ -79,7 +79,7 @@ const DEFAULT_VISION_MODELS: VisionModel[] = [ model: 'Qwen3.5-397B-A17B', provider: 'qwen-local', // Configurabil per deployment (Lot 1 pe mașina nouă). Fallback = LLM_ROUTER_URL, apoi IP didi. - endpoint: (process.env.VISION_LLM_URL || process.env.LLM_ROUTER_URL || 'http://10.11.10.17:14011') + endpoint: (process.env.VISION_LLM_URL || process.env.LLM_ROUTER_URL || 'http://llm.local:14011') .replace(/\/+$/, '') + '/v1/chat/completions', auth_type: 'none', timeout: 60000, diff --git a/backend/services/orchestration-layer/didiFramework/.env.example b/backend/services/orchestration-layer/didiFramework/.env.example index a618f06..e703b00 100644 --- a/backend/services/orchestration-layer/didiFramework/.env.example +++ b/backend/services/orchestration-layer/didiFramework/.env.example @@ -1,5 +1,5 @@ # Database Configuration -DB_HOST=10.11.50.167 +DB_HOST=db.local DB_PORT=5000 DB_NAME=DIDI DB_USER=bos_interface @@ -11,4 +11,10 @@ PORT=3005 HOST=0.0.0.0 # CORS -CORS_ORIGIN=http://localhost:3000 \ No newline at end of file +CORS_ORIGIN=http://localhost:3000 +# ── LinkedIn (postare automată pe pagina de organizație — provider paralel cu Facebook) ── +# App LinkedIn cu produsul "Community Management API" + OAuth2 scope w_organization_social, +# autorizat de un admin al paginii. Detalii: src/services/linkedin.ts +LINKEDIN_ACCESS_TOKEN=CHANGE_ME +LINKEDIN_ORG_URN=urn:li:organization:CHANGE_ME +LINKEDIN_API_VERSION=202506 diff --git a/backend/services/orchestration-layer/didiFramework/docker-compose.yml b/backend/services/orchestration-layer/didiFramework/docker-compose.yml index 2786bf6..f251afa 100644 --- a/backend/services/orchestration-layer/didiFramework/docker-compose.yml +++ b/backend/services/orchestration-layer/didiFramework/docker-compose.yml @@ -6,7 +6,7 @@ services: context: . dockerfile: Dockerfile container_name: didi-framework - # Bound on VLAN 10 IP for Kong cluster (10.11.10.176/177/178) reachability. + # Bound on VLAN 10 IP for Kong cluster (kong-cp.local/177/178) reachability. # Internal traffic (other DIDI containers) still uses didi-network DNS. ports: - "3005:3005" @@ -46,6 +46,10 @@ services: - FACEBOOK_PAGE_ID=${FACEBOOK_PAGE_ID:-1152853237912005} - FACEBOOK_PAGE_ACCESS_TOKEN=${FACEBOOK_PAGE_ACCESS_TOKEN:-} - FACEBOOK_API_VERSION=${FACEBOOK_API_VERSION:-v21.0} + # LinkedIn (postare automată pe profil/pagină — provider paralel cu Facebook) + - LINKEDIN_ACCESS_TOKEN=${LINKEDIN_ACCESS_TOKEN:-} + - LINKEDIN_ORG_URN=${LINKEDIN_ORG_URN:-} + - LINKEDIN_API_VERSION=${LINKEDIN_API_VERSION:-202506} # Stripe (test mode keys come from .env file) - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY:-} - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET:-} @@ -58,7 +62,7 @@ services: - SMTP_PASS=${SMTP_PASS:-} - SMTP_FROM_NAME=${SMTP_FROM_NAME:-DIDI} - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL:-} - - PUBLIC_APP_URL=${PUBLIC_APP_URL:-https://10.11.10.11:8443} + - PUBLIC_APP_URL=${PUBLIC_APP_URL:-https://api.local:8443} # OTel — traces to Jaeger via OTel Collector - OTEL_ENABLED=${OTEL_ENABLED:-true} - OTEL_EXPORTER_OTLP_ENDPOINT=${OTEL_EXPORTER_OTLP_ENDPOINT:-http://didi-otel-collector:4318/v1/traces} diff --git a/backend/services/orchestration-layer/didiFramework/src/routes/admin/social.ts b/backend/services/orchestration-layer/didiFramework/src/routes/admin/social.ts index 5a522d6..8ecbf95 100644 --- a/backend/services/orchestration-layer/didiFramework/src/routes/admin/social.ts +++ b/backend/services/orchestration-layer/didiFramework/src/routes/admin/social.ts @@ -1,5 +1,5 @@ /** - * Admin SOCIAL POSTS routes — postare automată pe Facebook (DESI 6). + * Admin SOCIAL POSTS routes — postare automată pe Facebook + LinkedIn (DESI 6). * * Endpoints (toate sub /api/admin/social/): * POST /social/draft — creează draft din session_id sau content manual @@ -25,6 +25,16 @@ import { debugFacebookToken, generateDraftFromAnalysisSession, } from '../../services/facebook'; +import { + postToLinkedInPage, + deleteLinkedInPost, + debugLinkedInToken, + isLinkedInConfigured, +} from '../../services/linkedin'; + +// Platformele suportate pentru postare (extensibil — adaugă provider + ramură în publish/delete) +const SUPPORTED_PLATFORMS = ['facebook', 'linkedin'] as const; +type Platform = typeof SUPPORTED_PLATFORMS[number]; const router = Router(); @@ -54,10 +64,11 @@ interface SocialPostRow { // ───────────────────────────────────────────────────────────────────────── router.get('/social/health', async (_req: Request, res: Response) => { try { - const debug = await debugFacebookToken(); + const [debug, liDebug] = await Promise.all([debugFacebookToken(), debugLinkedInToken()]); res.json({ success: true, data: { + platforms: SUPPORTED_PLATFORMS, facebook: { configured: !!process.env.FACEBOOK_PAGE_ACCESS_TOKEN && !!process.env.FACEBOOK_PAGE_ID, page_id: process.env.FACEBOOK_PAGE_ID || null, @@ -67,6 +78,7 @@ router.get('/social/health', async (_req: Request, res: Response) => { scopes: debug.scopes, error: debug.error, }, + linkedin: liDebug, }, }); } catch (e) { @@ -87,6 +99,12 @@ router.post('/social/draft', async (req: Request, res: Response) => { if (content.length > 60000) { return res.status(400).json({ success: false, error: 'content too long (max 60k chars)' }); } + if (platform && !SUPPORTED_PLATFORMS.includes(platform)) { + return res.status(400).json({ + success: false, + error: `platform invalid: '${platform}'. Platforme suportate: ${SUPPORTED_PLATFORMS.join(', ')}`, + }); + } const createdBy = (req as Request & { adminUser?: { sub?: string; email?: string } }) .adminUser?.email || (req as Request & { adminUser?: { sub?: string; email?: string } }).adminUser?.sub @@ -144,9 +162,17 @@ router.post('/social/publish/:post_id', async (req: Request, res: Response) => { return res.status(409).json({ success: false, error: 'Already published' }); } + const platform = (draft.platform || 'facebook') as Platform; + const scheduledAtIso = req.body?.scheduled_at as string | undefined; let scheduledUnix: number | undefined; if (scheduledAtIso) { + if (platform === 'linkedin') { + return res.status(400).json({ + success: false, + error: 'LinkedIn nu suportă programare (scheduled publish) prin API — doar publicare imediată', + }); + } const ts = Math.floor(new Date(scheduledAtIso).getTime() / 1000); if (isNaN(ts) || ts * 1000 < Date.now() + 9 * 60 * 1000) { return res.status(400).json({ @@ -157,6 +183,14 @@ router.post('/social/publish/:post_id', async (req: Request, res: Response) => { scheduledUnix = ts; } + // Ghid clar înainte de a marca 'publishing': platforma trebuie configurată + if (platform === 'linkedin' && !isLinkedInConfigured()) { + return res.status(400).json({ + success: false, + error: 'LinkedIn nu este configurat — setează LINKEDIN_ACCESS_TOKEN și LINKEDIN_ORG_URN în .env (vezi services/linkedin.ts)', + }); + } + // Mark as publishing (prevent double-publish) await query( `UPDATE bos_sysadmin.social_post SET status='publishing', updated_at=now() WHERE post_id=$1`, @@ -164,12 +198,18 @@ router.post('/social/publish/:post_id', async (req: Request, res: Response) => { ); try { - const fbResult = await postToFacebookPage({ - message: draft.content, - link: draft.link_url || undefined, - imageUrl: draft.image_url || undefined, - scheduledPublishTime: scheduledUnix, - }); + const fbResult = platform === 'linkedin' + ? await postToLinkedInPage({ + message: draft.content, + link: draft.link_url || undefined, + // imaginile pe LinkedIn cer flux separat de upload — neimplementat în v1 + }) + : await postToFacebookPage({ + message: draft.content, + link: draft.link_url || undefined, + imageUrl: draft.image_url || undefined, + scheduledPublishTime: scheduledUnix, + }); const finalStatus = scheduledUnix ? 'scheduled' : 'published'; const updated = await queryOne(` @@ -194,7 +234,7 @@ router.post('/social/publish/:post_id', async (req: Request, res: Response) => { postId, ]); - log.info(`[social] Post ${postId} → FB ${fbResult.id} (${finalStatus})`); + log.info(`[social] Post ${postId} → ${platform} ${fbResult.id} (${finalStatus})`); res.json({ success: true, data: updated }); } catch (fbErr) { const errMsg = (fbErr as Error).message; @@ -203,8 +243,8 @@ router.post('/social/publish/:post_id', async (req: Request, res: Response) => { SET status = 'failed', error_message = $1, updated_at = now() WHERE post_id = $2 `, [errMsg, postId]); - log.error(`[social] FB publish failed for ${postId}: ${errMsg}`); - res.status(502).json({ success: false, error: `Facebook publish failed: ${errMsg}` }); + log.error(`[social] ${platform} publish failed for ${postId}: ${errMsg}`); + res.status(502).json({ success: false, error: `${platform} publish failed: ${errMsg}` }); } } catch (e) { internalError(res, e, 'social_publish'); @@ -270,7 +310,7 @@ router.get('/social/:post_id', async (req: Request, res: Response) => { } // Refresh engagement dacă published și mai vechi de 5 min - if (row.status === 'published' && row.external_post_id) { + if (row.status === 'published' && row.external_post_id && (row.platform || 'facebook') === 'facebook') { const lastUpdate = row.engagement_updated_at ? new Date(row.engagement_updated_at).getTime() : 0; if (Date.now() - lastUpdate > 5 * 60 * 1000) { try { @@ -307,13 +347,17 @@ router.delete('/social/:post_id', async (req: Request, res: Response) => { return res.status(404).json({ success: false, error: 'Not found' }); } - // Delete from FB only if published + // Delete de pe platforma externa doar daca e publicat if (row.external_post_id && row.status === 'published') { try { - await deleteFacebookPost(row.external_post_id); - } catch (fbErr) { - // Continue with DB delete even if FB delete fails (post might be already gone) - log.warn(`[social] FB delete failed: ${(fbErr as Error).message}`); + if ((row.platform || 'facebook') === 'linkedin') { + await deleteLinkedInPost(row.external_post_id); + } else { + await deleteFacebookPost(row.external_post_id); + } + } catch (extErr) { + // Continuam cu soft-delete in DB chiar daca delete-ul extern esueaza + log.warn(`[social] ${row.platform} delete failed: ${(extErr as Error).message}`); } } @@ -379,13 +423,18 @@ router.post('/social/generate-from-session/:session_id', async (req: Request, re || (req as Request & { adminUser?: { sub?: string; email?: string } }).adminUser?.sub || 'unknown'; + const genPlatform = (req.body?.platform as string) || 'facebook'; + if (!SUPPORTED_PLATFORMS.includes(genPlatform as Platform)) { + return res.status(400).json({ success: false, error: `platform invalid: '${genPlatform}'` }); + } + // Salvează draft în DB const row = await queryOne(` INSERT INTO bos_sysadmin.social_post (session_id, platform, content, status, created_by) - VALUES ($1, 'facebook', $2, 'draft', $3) + VALUES ($1, $2, $3, 'draft', $4) RETURNING * - `, [sessionId, content, createdBy]); + `, [sessionId, genPlatform, content, createdBy]); res.status(201).json({ success: true, data: row }); } catch (e) { diff --git a/backend/services/orchestration-layer/didiFramework/src/services/facebook.ts b/backend/services/orchestration-layer/didiFramework/src/services/facebook.ts index 778d628..827f6b8 100644 --- a/backend/services/orchestration-layer/didiFramework/src/services/facebook.ts +++ b/backend/services/orchestration-layer/didiFramework/src/services/facebook.ts @@ -247,29 +247,20 @@ export function generateDraftFromAnalysisSession(session: { : category === 'UNCERTAIN' ? 'Conținut cu credibilitate incertă.' : 'Conținut analizat.'); - // Trim explanation to ~400 chars for FB readability - const explanation = verdictRo.length > 400 - ? verdictRo.slice(0, 400).trim() + '...' - : verdictRo; - - // Snippet din input - const inputPreview = session.input_text - ? `"${session.input_text.slice(0, 150).trim()}${session.input_text.length > 150 ? '...' : ''}"` - : session.input_url - ? `🔗 ${session.input_url}` - : ''; + // IMPORTANT: LinkedIn afișează în feed doar ~210 caractere din postările prin API + // (fără expander „see more"), iar Facebook colapsează la fel textele lungi. Generăm + // deci un post CONCIS care se afișează integral: verdict + scor + esența într-o + // singură frază + hashtags. Detaliul complet rămâne accesibil prin link-ul analizei. + const oneLiner = verdictRo.replace(/\s+/g, ' ').trim(); + // rezervăm loc pentru antet (~35) + hashtags (~48); ținta ~210 caractere total + const room = 210 - 35 - 48; + const shortExplanation = oneLiner.length > room + ? oneLiner.slice(0, room).replace(/[\s,.;:]+\S*$/, '').trim() + '…' + : oneLiner; return [ - `${emoji} Alertă dezinformare — DiDi`, - '', - inputPreview ? `Conținut analizat:\n${inputPreview}` : '', - '', - `📊 Scor risc: ${score}/100 (${category})`, - '', - explanation, - '', - '🔍 Analiza completă prin platforma DiDi — detecție automată tehnici de manipulare, AI-generated content, verificare claims și evaluare surse.', - '', - '#DiDi #Dezinformare #FactChecking #AI #Clossers', - ].filter(Boolean).join('\n'); + `${emoji} DiDi · ${category} · Scor ${score}/100`, + shortExplanation, + '#DiDi #Dezinformare #FactChecking #AntiFake', + ].filter(Boolean).join('\n\n'); } diff --git a/backend/services/orchestration-layer/didiFramework/src/services/linkedin.ts b/backend/services/orchestration-layer/didiFramework/src/services/linkedin.ts new file mode 100644 index 0000000..8b55e24 --- /dev/null +++ b/backend/services/orchestration-layer/didiFramework/src/services/linkedin.ts @@ -0,0 +1,177 @@ +/** + * LinkedIn REST API client — postare automată din admin-dashboard pe pagina + * de organizație LinkedIn. Provider paralel cu facebook.ts (DESI 6). + * + * Config (ENV): + * LINKEDIN_ACCESS_TOKEN — access token cu scope `w_organization_social` + * (aplicație LinkedIn cu produsul "Community Management API", + * autorizată de un admin al paginii de organizație) + * LINKEDIN_ORG_URN — URN-ul organizației, ex: urn:li:organization:12345678 + * LINKEDIN_API_VERSION — header LinkedIn-Version, format YYYYMM (default 202506) + * + * Cum obții credențialele (pe scurt): + * 1. https://developer.linkedin.com → Create app, legată de pagina companiei. + * 2. Products → adaugă "Community Management API" (necesită aprobarea LinkedIn). + * 3. OAuth2 cu scope w_organization_social, autorizat de un admin al paginii. + * 4. ID-ul organizației e în URL-ul paginii de admin (numeric) → urn:li:organization:. + * + * Limitări față de Facebook (v1): + * - LinkedIn NU suportă programare (scheduled publish) prin API — doar publicare imediată. + * - Imaginile cer un flux separat de upload (initializeUpload) — neimplementat în v1; + * postările sunt text + link (articol atașat). + * + * Folosit de: src/routes/admin/social.ts + */ + +export interface LinkedInPostOptions { + message: string; + link?: string; // atașat ca articol (card cu preview) + linkTitle?: string; // titlul cardului de articol (LinkedIn îl cere obligatoriu când e link) +} + +export interface LinkedInPostResult { + id: string; // URN-ul postării, ex: urn:li:share:7222... + external_url?: string; // URL public al postării +} + +const API_VERSION = process.env.LINKEDIN_API_VERSION || '202506'; +const BASE_URL = 'https://api.linkedin.com'; + +export function isLinkedInConfigured(): boolean { + return !!process.env.LINKEDIN_ACCESS_TOKEN && !!process.env.LINKEDIN_ORG_URN; +} + +function getOrgUrn(): string { + const urn = process.env.LINKEDIN_ORG_URN; + if (!urn) throw new Error('LINKEDIN_ORG_URN env var not set (ex: urn:li:organization:12345678)'); + return urn; +} + +function getToken(): string { + const t = process.env.LINKEDIN_ACCESS_TOKEN; + if (!t) throw new Error('LINKEDIN_ACCESS_TOKEN env var not set — LinkedIn nu este configurat'); + return t; +} + +function apiHeaders(): Record { + return { + 'Authorization': `Bearer ${getToken()}`, + 'Content-Type': 'application/json', + 'X-Restli-Protocol-Version': '2.0.0', + 'LinkedIn-Version': API_VERSION, + }; +} + +/** + * Publică un post pe pagina de organizație LinkedIn (POST /rest/posts). + * Text simplu sau text + link (articol). Fără programare (nesuportat de API). + */ +export async function postToLinkedInPage( + options: LinkedInPostOptions, +): Promise { + const orgUrn = getOrgUrn(); + + const body: Record = { + author: orgUrn, + commentary: options.message, + visibility: 'PUBLIC', + distribution: { + feedDistribution: 'MAIN_FEED', + targetEntities: [], + thirdPartyDistributionChannels: [], + }, + lifecycleState: 'PUBLISHED', + isReshareDisabledByAuthor: false, + }; + if (options.link) { + // LinkedIn cere `title` obligatoriu pentru cardul de articol. Fallback: prima linie + // din mesaj (max 100 caractere) sau un titlu generic. + const firstLine = (options.message || '').split('\n').map(s => s.trim()).find(Boolean) || ''; + const title = (options.linkTitle || firstLine || 'Analiză DiDi').slice(0, 100); + body.content = { article: { source: options.link, title } }; + } + + const res = await fetch(`${BASE_URL}/rest/posts`, { + method: 'POST', + headers: apiHeaders(), + body: JSON.stringify(body), + signal: AbortSignal.timeout(30_000), + }); + + if (!res.ok) { + const text = await res.text().catch(() => ''); + let msg = `HTTP ${res.status}`; + try { + const err = JSON.parse(text) as { message?: string }; + if (err.message) msg = err.message; + } catch { /* text brut */ } + throw new Error(`LinkedIn API error: ${msg}`); + } + + // ID-ul postării vine în headerul x-restli-id (URN) + const postUrn = res.headers.get('x-restli-id') || res.headers.get('x-linkedin-id') || ''; + if (!postUrn) { + throw new Error('LinkedIn API: missing x-restli-id header in response'); + } + + return { + id: postUrn, + external_url: `https://www.linkedin.com/feed/update/${encodeURIComponent(postUrn)}/`, + }; +} + +/** + * Șterge o postare de pe pagina LinkedIn (DELETE /rest/posts/{urn}). + */ +export async function deleteLinkedInPost(postUrn: string): Promise { + const res = await fetch( + `${BASE_URL}/rest/posts/${encodeURIComponent(postUrn)}`, + { + method: 'DELETE', + headers: apiHeaders(), + signal: AbortSignal.timeout(15_000), + }, + ); + if (!res.ok && res.status !== 404) { + const text = await res.text().catch(() => ''); + throw new Error(`LinkedIn delete failed (HTTP ${res.status}): ${text.slice(0, 300)}`); + } + return true; +} + +/** + * Verifică starea configurării LinkedIn (folosit la /social/health). + * Best-effort: confirmă prezența credențialelor și încearcă un apel ușor. + */ +export async function debugLinkedInToken(): Promise<{ + configured: boolean; + org_urn: string | null; + token_valid: boolean; + error?: string; +}> { + const configured = isLinkedInConfigured(); + if (!configured) { + return { + configured: false, + org_urn: process.env.LINKEDIN_ORG_URN || null, + token_valid: false, + error: 'LINKEDIN_ACCESS_TOKEN / LINKEDIN_ORG_URN nu sunt setate', + }; + } + try { + // Introspecție ușoară: /v2/userinfo merge pentru token-urile OIDC; + // pentru token-urile doar-organizație poate întoarce 403 — tratăm ca „prezent, nevalidabil aici". + const res = await fetch(`${BASE_URL}/v2/userinfo`, { + headers: { Authorization: `Bearer ${getToken()}` }, + signal: AbortSignal.timeout(5_000), + }); + return { + configured: true, + org_urn: getOrgUrn(), + token_valid: res.ok, + error: res.ok ? undefined : `userinfo HTTP ${res.status} (tokenul poate fi valid doar pt. scope organizație)`, + }; + } catch (e) { + return { configured: true, org_urn: getOrgUrn(), token_valid: false, error: (e as Error).message }; + } +} diff --git a/backend/services/orchestration-layer/scripts/minio-switch.sh b/backend/services/orchestration-layer/scripts/minio-switch.sh index 3e3c2f7..3279e0a 100644 --- a/backend/services/orchestration-layer/scripts/minio-switch.sh +++ b/backend/services/orchestration-layer/scripts/minio-switch.sh @@ -27,10 +27,10 @@ fi # ------------------------------------------------------------------------- # Cluster (external S3 cluster live since 2026-04-23) # ------------------------------------------------------------------------- -# NOTE: Using VIP IP directly (10.11.10.128) instead of DNS — +# NOTE: Using VIP IP directly (minio-cluster.local) instead of DNS — # Docker containers don't resolve internal pfSense DNS (they use systemd-resolved # at 127.0.0.53 which doesn't see minio-host zone). VIP IP is stable. -CLUSTER_ENDPOINT="10.11.10.128" +CLUSTER_ENDPOINT="minio-cluster.local" CLUSTER_PORT="9000" CLUSTER_USE_SSL="false" CLUSTER_BUCKET="didi-prod"