feat(5.20): US-013 retragere accounts.rar_creds_enc -> per-env + DROP cu garda
Toate citirile pe coloana legacy accounts.rar_creds_enc mutate pe sloturile per-env (rar_creds_test_enc/rar_creds_prod_enc): worker fallback+keepalive, are_creds (web) si are_creds_rar (integrare, +are_creds_test/_prod), write-back API la reactivare, purjare la stergere cont, _get_acasa_context/_fetch_cont_env_state. Contract API (aditiv): POST /v1/conturi/rar-creds primeste rar_target optional (test/prod), scrie in slotul corect + activeaza mediul; DELETE primeste ?env (sterge un slot sau ambele). Documentat in docs/api-rar-contract.md. DROP cu garda in db.py (schema.sql fara coloana pe DB fresh): - 6a: eliminat ADD COLUMN rar_creds_enc (fara ping-pong re-ADD dupa DROP) - 6b: try/except fail-safe (nu crapa boot-ul) + garda sqlite_version >= 3.35 - 6c: re-backfill old->new imediat inainte de assert (ancora globala) - garda orfane: DROP anulat daca vreun creds legacy nu a aterizat in slot per-env - backup criptat accounts_rar_creds_enc_backup inainte de DROP - 6d: verificare prin PRAGMA table_info (NU grep — submissions are aceeasi coloana) Garda one-way, idempotenta la boot repetat (verificat). submissions.rar_creds_enc ramane neatinsa. tests/test_retragere_creds_enc.py: niciun read pe coloana veche, conturi rar-creds env-aware, are_creds per-env, DROP blocat de garda la lipsa copiere. 9 teste existente actualizate pe sloturi per-env. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -507,5 +507,48 @@ răspuns de validare (câmpuri, cod_prestatie, rezolvare operație) ca la trimit
|
||||
|
||||
Planul Gratuit are limită de **60 prezentări/lună** (indiferent de canal). La depășire: `422 PLAN_LIMITA_LUNARA`.
|
||||
Planul Pro nu are limită de volum. `GET /v1/nomenclator` rămâne public pe orice plan (exploatare pre-upgrade).
|
||||
|
||||
## Creds RAR durabile per-mediu (PRD 5.20 US-013)
|
||||
|
||||
`POST /v1/conturi/rar-creds` — setează credențialele RAR durabile per-cont, cu scriere în slotul per-mediu.
|
||||
|
||||
**Body JSON:**
|
||||
```json
|
||||
{
|
||||
"email": "user@firma.ro",
|
||||
"password": "parola",
|
||||
"rar_target": "test"
|
||||
}
|
||||
```
|
||||
|
||||
`rar_target`: `"test"` | `"prod"` | absent. Absent → ancora globală (`AUTOPASS_RAR_ENV`), implicit `"test"`.
|
||||
Schimbare **aditivă** (back-compat): clienții care nu trimit `rar_target` continuă să funcționeze.
|
||||
|
||||
Efecte: scrie în `accounts.rar_creds_{env}_enc` + activează `rar_{env}_enabled=1`.
|
||||
|
||||
**Răspuns:** `{"ok": true, "account_id": N, "rar_env": "test"}`
|
||||
|
||||
---
|
||||
|
||||
`DELETE /v1/conturi/rar-creds` — șterge credențialele RAR durabile per-cont.
|
||||
|
||||
**Query param** `env`: `test` | `prod` | absent.
|
||||
- `?env=test` → NULL doar slotul Testare + `rar_test_enabled=0`.
|
||||
- `?env=prod` → NULL doar slotul Producție + `rar_prod_enabled=0`.
|
||||
- Absent → NULL ambele sloturi (revenire completă la modelul efemer Treapta 1).
|
||||
|
||||
Schimbare **aditivă** (back-compat).
|
||||
|
||||
---
|
||||
|
||||
`GET /v1/ping` — răspuns include acum și câmpurile per-mediu:
|
||||
```json
|
||||
{
|
||||
"are_creds_rar": true,
|
||||
"are_creds_test": true,
|
||||
"are_creds_prod": false
|
||||
}
|
||||
```
|
||||
`are_creds_rar` rămâne (back-compat) = OR logic al celor două.
|
||||
</content>
|
||||
</invoke>
|
||||
|
||||
Reference in New Issue
Block a user