(refactor) AppState to state mod
This commit is contained in:
parent
8a03bdee96
commit
5b3c2d4ec7
6 changed files with 92 additions and 14 deletions
4
src/api.rs
Normal file
4
src/api.rs
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
// src/api.rs
|
||||||
|
// Объявляет клиенты для работы с внешними API
|
||||||
|
|
||||||
|
pub mod banking; // Наш HTTP клиент к банковским API
|
||||||
46
src/api/banking.rs
Normal file
46
src/api/banking.rs
Normal 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 {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main.rs
20
src/main.rs
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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'ам
|
||||||
|
|
|
||||||
|
|
@ -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
32
src/state.rs
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue