Commit graph

4 commits

Author SHA1 Message Date
bot-backend
9c12407c09 fix(tradein/quota): per-user quota override + no burn on empty result
All checks were successful
CI Trade-In / backend-tests (pull_request) Successful in 4m54s
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Two bugs hit the first paying pilot (user2/Брусника):

1. Bonus attempts were granted via negative `used` hack
   (account_estimate_usage.used = -35), which made /quota return
   {limit:15, used:-35, remaining:50} -> frontend rendered the absurd
   "Осталось 50 из 15". Replaced with a proper personal monthly limit:
   account_quota_overrides table (migration 184) + account_quota.user_limit()
   used across get_status/check_and_raise/increment instead of the hardcoded
   global MONTHLY_LIMIT. get_status now clamps remaining = max(0, limit -
   max(0, used)) so remaining can never exceed limit even if a negative
   used leaks through again. Migration seeds user2 -> monthly_limit=50 and
   resets the old hack (used<0 -> 0), so user2 now sees "50 из 50".

2. POST /estimate unconditionally called account_quota.increment() after
   estimate_quality, even when the address failed to geocode and the
   handler returned the _empty_estimate fallback (median=0, n_analogs=0,
   insufficient_data=True, HTTP 200) -- burning a paid slot for a null
   result. Now increment is skipped when result.insufficient_data is True;
   the #747 TOCTOU-safe atomic increment/429 gate is unchanged for real
   results.
2026-07-13 22:53:14 +03:00
a74591d7cc fix(tradein): atomic conditional quota increment — close TOCTOU (#747) (#749)
All checks were successful
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / deploy (push) Successful in 34s
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / test (push) Successful in 24s
Deploy Trade-In / build-backend (push) Successful in 40s
Co-authored-by: bot-backend <bot-backend@gendsgn.local>
Co-committed-by: bot-backend <bot-backend@gendsgn.local>
2026-05-30 15:52:34 +00:00
ed4c8b3f02 feat(tradein): configurable estimate quota + new exhausted-quota copy (#658) (#671)
Some checks failed
Deploy Trade-In / changes (push) Successful in 4s
Deploy Trade-In / build-backend (push) Successful in 46s
Deploy Trade-In / build-frontend (push) Successful in 1m38s
Deploy Trade-In / deploy (push) Has been cancelled
Co-authored-by: bot-backend <bot-backend@gendsgn.local>
Co-committed-by: bot-backend <bot-backend@gendsgn.local>
2026-05-29 16:07:02 +00:00
bd3e5c8216 feat(tradein): аккаунт praktika + лимит 15 оценок/мес, чистка PRINZIP в UI (#635)
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy Trade-In / changes (push) Successful in 7s
Deploy / build-backend (push) Successful in 29s
Deploy / build-frontend (push) Successful in 28s
Deploy / build-worker (push) Successful in 29s
Deploy Trade-In / build-backend (push) Successful in 46s
Deploy / deploy (push) Successful in 58s
Deploy Trade-In / build-frontend (push) Successful in 1m40s
Deploy Trade-In / deploy (push) Successful in 39s
2026-05-28 22:04:58 +00:00