This commit is contained in:
Kirill
2026-07-02 23:13:13 +07:00
parent e997a20fe6
commit d4a57c0b6a
34 changed files with 524 additions and 67 deletions
+8 -1
View File
@@ -15,7 +15,11 @@ pub struct BillingService {
providers: HashMap<&'static str, Box<dyn PaymentProvider>>,
}
// Добавляем Clone вручную, так как dyn Traits не поддерживают derive(Clone) легко
// Добавляем Clone вручную, так как dyn Traits не поддерживают derive(Clone) легко.
// TODO: axum клонирует ApiState (а значит и BillingService) на каждый запрос —
// это означает повторное чтение env и пересборку HashMap<provider> на каждый HTTP-вызов,
// не только при реальном клонировании сервиса. Стоит завернуть `providers` в Arc и строить
// один раз в `new()`, чтобы `clone()` был дешёвым Arc::clone.
impl Clone for BillingService {
fn clone(&self) -> Self {
// Снова читаем из env при клонировании
@@ -79,6 +83,9 @@ impl BillingService {
})?;
// --- ДИНАМИЧЕСКИЙ ЗАПРОС КУРСА TON ---
// TODO: синхронный HTTP-запрос к TonAPI на каждый вызов initiate_payment
// тормозит создание инвойса и делает эндпоинт зависимым от доступности
// внешнего сервиса. Вынести в фоновый воркер с кешем в Redis (уже подключён).
let client = reqwest::Client::new();
let rate_res: serde_json::Value = client
.get("https://tonapi.io/v2/rates?tokens=ton&currencies=usd,rub")