(refactor) AppState to state mod

This commit is contained in:
Rorik Star Platinum 2025-11-05 00:47:34 +03:00
parent 8a03bdee96
commit 5b3c2d4ec7
6 changed files with 92 additions and 14 deletions

4
src/api.rs Normal file
View file

@ -0,0 +1,4 @@
// src/api.rs
// Объявляет клиенты для работы с внешними API
pub mod banking; // Наш HTTP клиент к банковским API

46
src/api/banking.rs Normal file
View file

@ -0,0 +1,46 @@
// src/api/banking.rs
use reqwest::Client as HttpClient;
use std::sync::Arc;
// Модели и ошибки можно вынести в отдельные файлы в api/
// Например, api/banking_models.rs
#[derive(Debug, serde::Deserialize)]
pub struct BankToken {
pub access_token: String,
pub expires_in: i64,
}
#[derive(Debug, Clone, Copy)]
pub enum Bank {
VBank,
ABank,
SBank,
}
impl Bank {
// ...
}
#[derive(Clone)]
pub struct BankClient {
// ...
}
impl BankClient {
// ...
}
#[derive(Clone)]
pub struct BankingClients {
pub vbank: BankClient,
pub abank: BankClient,
pub sbank: BankClient,
}
impl BankingClients {
pub async fn new() -> Self {
// ...
}
}

View file

@ -1,28 +1,24 @@
// src/main.rs // src/main.rs
mod route; // Объявляем модуль route (это либо route.rs, либо route/mod.rs) mod route;
mod db; // Объявляем модуль для работы с БД mod db;
mod state;
mod api;
use std::net::SocketAddr; use std::net::SocketAddr;
use sqlx::PgPool; use api::banking::BankingClients;
/// Общее состояние приложения, передаётся во все handlers /// Общее состояние приложения, передаётся во все handlers
/// Это паттерн Axum: State<AppState> используется в extract'ах /// Это паттерн Axum: State<AppState> используется в extract'ах
#[derive(Clone)]
pub struct AppState {
pub db_pool: PgPool,
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
// 1. Загружаем переменные окружения из .env или secrets (через sops) // 1. Загружаем переменные окружения из .env или secrets (через sops)
dotenvy::dotenv().ok(); dotenvy::dotenv().ok();
// 2. Инициализируем базу данных
let db_pool = db::init_pool().await;
println!("✅ Database connection pool created successfully.");
// 3. Создаём общее состояние приложения // 3. Создаём общее состояние приложения
let app_state = AppState { db_pool }; let app_state = AppState::new().await;
// 4. Конфигурируем роуты (все роуты централизованы в route::router()) // 4. Конфигурируем роуты (все роуты централизованы в route::router())
let app = route::router(app_state); let app = route::router(app_state);

View file

@ -7,7 +7,7 @@
pub mod handlers; // Объявляем подмодуль handlers pub mod handlers; // Объявляем подмодуль handlers
use axum::{routing::get, Router}; use axum::{routing::get, Router};
use crate::AppState; use crate::state::AppState;
/// Создаёт и возвращает Router со всеми сконфигурированными роутами /// Создаёт и возвращает Router со всеми сконфигурированными роутами
/// Функция принимает AppState и передаёт его всем handlers'ам /// Функция принимает AppState и передаёт его всем handlers'ам

View file

@ -10,7 +10,7 @@ use axum::{
Json, Json,
}; };
use serde_json::json; use serde_json::json;
use crate::AppState; use crate::state::AppState;
/// Health-check handler /// Health-check handler
/// ///

32
src/state.rs Normal file
View file

@ -0,0 +1,32 @@
// src/state.rs
// Ответственность: создание и управление общим состоянием приложения (AppState)
use crate::db;
use crate::api::banking::BankingClients;
use sqlx::PgPool;
/// Общее состояние приложения, доступное во всех handlers
#[derive(Clone)]
pub struct AppState {
pub db_pool: PgPool,
pub banking_clients: BankingClients,
}
impl AppState {
/// Асинхронный конструктор для AppState
///
/// Инициализирует все необходимые ресурсы (пул БД, HTTP клиенты)
/// и собирает их в единый стейт.
pub async fn new() -> Self {
let db_pool = db::init_pool().await;
println!("✅ Database connection pool created successfully.");
let banking_clients = BankingClients::new().await;
println!("✅ Banking API clients initialized.");
Self {
db_pool,
banking_clients,
}
}
}