spring_sea_orm/
lib.rs

1//! [![spring-rs](https://img.shields.io/github/stars/spring-rs/spring-rs)](https://spring-rs.github.io/docs/plugins/spring-sea-orm)
2#![doc(html_favicon_url = "https://spring-rs.github.io/favicon.ico")]
3#![doc(html_logo_url = "https://spring-rs.github.io/logo.svg")]
4
5pub mod config;
6pub mod pagination;
7
8use anyhow::Context;
9use config::SeaOrmConfig;
10use sea_orm::{ConnectOptions, Database};
11use spring::config::ConfigRegistry;
12use spring::plugin::{ComponentRegistry, MutableComponentRegistry};
13use spring::{app::AppBuilder, error::Result, plugin::Plugin};
14use spring::{async_trait, App};
15use std::sync::Arc;
16use std::time::Duration;
17
18pub type DbConn = sea_orm::DbConn;
19
20pub struct SeaOrmPlugin;
21
22#[async_trait]
23impl Plugin for SeaOrmPlugin {
24    async fn build(&self, app: &mut AppBuilder) {
25        let config = app
26            .get_config::<SeaOrmConfig>()
27            .expect("sea-orm plugin config load failed");
28
29        let conn = Self::connect(&config)
30            .await
31            .expect("sea-orm plugin load failed");
32        app.add_component(conn)
33            .add_shutdown_hook(|app| Box::new(Self::close_db_connection(app)));
34    }
35}
36
37impl SeaOrmPlugin {
38    pub async fn connect(config: &config::SeaOrmConfig) -> Result<DbConn> {
39        let mut opt = ConnectOptions::new(&config.uri);
40        opt.max_connections(config.max_connections)
41            .min_connections(config.min_connections)
42            .sqlx_logging(config.enable_logging);
43
44        if let Some(connect_timeout) = config.connect_timeout {
45            opt.connect_timeout(Duration::from_millis(connect_timeout));
46        }
47        if let Some(idle_timeout) = config.idle_timeout {
48            opt.idle_timeout(Duration::from_millis(idle_timeout));
49        }
50        if let Some(acquire_timeout) = config.acquire_timeout {
51            opt.acquire_timeout(Duration::from_millis(acquire_timeout));
52        }
53
54        Ok(Database::connect(opt)
55            .await
56            .with_context(|| format!("sea-orm connection failed:{}", &config.uri))?)
57    }
58
59    async fn close_db_connection(app: Arc<App>) -> Result<String> {
60        app.get_component::<DbConn>()
61            .expect("sea-orm db connection not exists")
62            .close()
63            .await
64            .context("sea-orm db connection close failed")?;
65        Ok("sea-orm db connection close successful!".into())
66    }
67}