feat(api): rar_credentials optional pe POST /v1/prezentari

Cand `rar_credentials` lipseste din cerere, submission-ul intra fara creds
efemere, iar worker-ul cade pe creds-urile RAR durabile ale contului
(accounts.rar_creds_enc). Identificarea contului ramane pe cheia API.
Trimiterea explicita a creds-urilor suprascrie creds-urile contului pe acea
cerere (back-compat: fluxul vechi ROAAUTO merge identic).

- models.py: rar_credentials: RarCredentials | None = None
- router.py: cripteaza creds doar daca exista (altfel creds_enc=NULL)
- worker NEATINS: avea deja fallback _creds_for(...) or _creds_from_account(...)

Pagina /integrare aliniata: exemplele cod (7 limbaje) + export Postman nu mai
includ rar_credentials in payload; nota noua explica modelul (creds pe cont,
optional in payload). README rescris compact + reflecta optionalitatea.

Test nou: enqueue fara creds -> submission fara creds efemere -> fallback pe
contul cu creds salvate. Suita: 673 passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-06-23 13:39:53 +00:00
parent 0517ae59fb
commit 5dc963a02c
8 changed files with 188 additions and 375 deletions

View File

@@ -112,9 +112,15 @@ def test_payload_acopera_campurile_obligatorii_din_model():
for camp in obligatorii:
assert camp in snippet, f"camp obligatoriu absent din snippet: {camp}"
# Credentiale RAR (email + password)
assert "email" in snippet, "camp 'email' absent din snippet (RarCredentials)"
assert "password" in snippet, "camp 'password' absent din snippet (RarCredentials)"
def test_payload_nu_include_credentiale_rar():
"""rar_credentials e OPTIONAL: snippet-ul exemplu trimite doar cheia API + datele
prezentarii (creds-urile RAR se configureaza pe cont, nu in fiecare cerere)."""
for limbaj in LIMBAJE_OBLIGATORII:
snippet = RESULT[limbaj]["prezentari"]
assert "rar_credentials" not in snippet, (
f"{limbaj}.prezentari include rar_credentials — nu mai e necesar in payload"
)
def test_prestatii_in_snippet_are_cod():