diff --git a/src/services/_authentication.rs b/src/services/_authentication.rs index 9a1a39b..c5d94ab 100644 --- a/src/services/_authentication.rs +++ b/src/services/_authentication.rs @@ -5,6 +5,7 @@ use cookie::time::OffsetDateTime; use cookie::{Cookie, CookieJar, Key}; use rusqlite::Connection; +#[derive(Clone)] pub struct SessionService { key: Key, } diff --git a/src/services/_users.rs b/src/services/_users.rs index 0296937..a2acab6 100644 --- a/src/services/_users.rs +++ b/src/services/_users.rs @@ -2,7 +2,6 @@ use rusqlite::Connection; use serde::Deserialize; use serde::Serialize; - use crate::db::users::{list_users, User}; use crate::util::CustomResult; diff --git a/src/services/mod.rs b/src/services/mod.rs index 64f35ec..7e4c0a8 100644 --- a/src/services/mod.rs +++ b/src/services/mod.rs @@ -1,4 +1,4 @@ -use crate::{CustomResult}; + use rusqlite::Connection; pub use crate::services::_authentication::SessionService; @@ -23,8 +23,4 @@ impl ReadOnlyServiceFactory<'_> { pub fn get_user_service(&self) -> UserService { UserService::new(self.conn) } - - pub fn get_authentication_service(&mut self) -> CustomResult { - SessionService::from_conn(self.conn) - } } diff --git a/src/webui/index_views.rs b/src/webui/index_views.rs index c4d2426..5ac0aab 100644 --- a/src/webui/index_views.rs +++ b/src/webui/index_views.rs @@ -1,10 +1,10 @@ -use actix_web::{web, HttpRequest, Responder}; -use crate::services::ReadOnlyServiceFactory; + +use crate::webui::services::{Services}; use crate::webui::templates::MiniJinjaRenderer; -use crate::SQLiteConnectionFactory; + +use actix_web::{web, HttpRequest, Responder}; use minijinja::context; use serde::Deserialize; -use crate::webui::services::{DbPool, Services}; #[derive(Deserialize, Debug)] pub struct LoginPayload { @@ -16,11 +16,9 @@ pub struct LoginPayload { pub async fn login( tmpl_env: MiniJinjaRenderer, web::Json(form): web::Json, - conn_factory: web::Data, + service_factory: web::Data, ) -> actix_web::Result { - let mut conn = conn_factory.readonly().unwrap(); // todo; to proper 500 - let mut service_factory = ReadOnlyServiceFactory::new(&mut conn); - let authentication_service = service_factory.get_authentication_service().unwrap(); + let authentication_service = service_factory.get_authentication_service()?; let cookie = authentication_service.create_login_cookie(&form.username); let ctx = context! { name => form.username, @@ -33,13 +31,10 @@ pub async fn login( #[actix_web::post("/logout")] pub async fn logout( - conn_factory: web::Data, + service_factory: web::Data, tmpl_env: MiniJinjaRenderer, ) -> actix_web::Result { - let mut conn = conn_factory.readonly().unwrap(); // todo; to proper 500 - let mut service_factory = ReadOnlyServiceFactory::new(&mut conn); - let authentication_service = service_factory.get_authentication_service().unwrap(); - + let authentication_service = service_factory.get_authentication_service()?; let res = tmpl_env.render("partials/index/form.html", context! {})?; Ok(res .customize() @@ -49,10 +44,10 @@ pub async fn logout( #[actix_web::get("/")] pub async fn index( req: HttpRequest, - pool: web::Data, + service_factory: web::Data, tmpl_env: MiniJinjaRenderer, ) -> actix_web::Result { - let authentication_service = Services::get_authentication_service(& pool).unwrap(); + let authentication_service = service_factory.get_authentication_service()?; let userid = authentication_service.get_login(&req); let username = userid.clone().unwrap_or("".to_string()); let ctx = context! { diff --git a/src/webui/mod.rs b/src/webui/mod.rs index e7a3041..6de2edd 100644 --- a/src/webui/mod.rs +++ b/src/webui/mod.rs @@ -12,11 +12,11 @@ use async_channel; use futures::{pin_mut, select, FutureExt}; use minijinja; use minijinja_autoreload::AutoReloader; -use r2d2_sqlite::SqliteConnectionManager; + use crate::events::Event; use crate::util::{CustomResult, Error, SQLiteConnectionFactory}; -use crate::webui::services::creat_db_pool; +use crate::webui::services::{creat_db_pool, Services}; use crate::webui::templates::MiniJinjaRenderer; use crate::webui::worker::event_processor_loop; @@ -62,8 +62,6 @@ fn create_views_scope() -> Scope { .service(views::actions_partials) } - - #[tokio::main] pub async fn web_ui_main( conn_fact: SQLiteConnectionFactory, @@ -76,16 +74,15 @@ pub async fn web_ui_main( // https://github.com/ivanceras/r2d2-sqlite) use // https://docs.rs/actix-web/4.3.1/actix_web/web/fn.block.html // in handlers. - let pool = creat_db_pool(& conn_fact.path().unwrap()); - // let db_pool = web::Data::new(); - let cloned_conn_fact = conn_fact.clone(); + let pool = creat_db_pool(&conn_fact.path().unwrap()); + let services = Services::new(pool); + let server = HttpServer::new(move || { let template_reloader = create_auto_reloader(enable_template_autoreload); App::new() - .app_data(web::Data::new(pool.clone())) + .app_data(web::Data::new(services.clone())) .app_data(web::Data::new(template_reloader)) .app_data(web::Data::new(event_sender.clone())) - .app_data(web::Data::new(cloned_conn_fact.clone())) .service(create_static_scope()) .service(create_api_scope()) .service(create_views_scope()) diff --git a/src/webui/services.rs b/src/webui/services.rs index 1c21146..ecc310d 100644 --- a/src/webui/services.rs +++ b/src/webui/services.rs @@ -1,27 +1,51 @@ -use std::path::PathBuf; +use crate::services::{SessionService, UserService}; + +use actix_web::{error, Result}; +use r2d2::PooledConnection; use r2d2_sqlite::SqliteConnectionManager; -use crate::services::{SessionService}; -use crate::util::{CustomResult, Error, SQLiteConnectionFactory}; + +use std::path::PathBuf; pub type DbPool = r2d2::Pool; -pub fn creat_db_pool(path: & PathBuf) -> DbPool { +pub fn creat_db_pool(path: &PathBuf) -> DbPool { let manager = SqliteConnectionManager::file(path); r2d2::Pool::new(manager).unwrap() } +#[derive(Clone)] struct ServicesCache { session_service: SessionService, } -pub struct Services {} +#[derive(Clone)] +pub struct Services { + pool: DbPool, + cache: ServicesCache, +} impl Services { - - pub fn get_authentication_service(dbPool: & DbPool) -> CustomResult { - let mut conn = dbPool.get().unwrap(); - SessionService::from_conn(&mut conn) + pub fn new(pool: DbPool) -> Services { + let mut conn = pool.get().unwrap(); + let session_service = SessionService::from_conn(&mut conn).unwrap(); + let cache = ServicesCache { session_service }; + Services { pool, cache } } + pub fn get_connection(&self) -> Result> { + self.pool + .get() + .map_err(|_e| error::ErrorBadRequest("Cannot get DB connection.")) + } + pub fn get_authentication_service(&self) -> Result { + Ok(self.cache.session_service.clone()) + } + + pub fn get_user_service<'a>( + &'a self, + conn: &'a PooledConnection, + ) -> Result { + Ok(UserService::new(conn)) + } } diff --git a/src/webui/views.rs b/src/webui/views.rs index 8b7c832..b7e1e7c 100644 --- a/src/webui/views.rs +++ b/src/webui/views.rs @@ -6,10 +6,10 @@ use log::info; use minijinja::context; use serde::Deserialize; - use crate::events::Event; -use crate::services::ReadOnlyServiceFactory; -use crate::util::SQLiteConnectionFactory; + + +use crate::webui::services::Services; use crate::webui::templates::MiniJinjaRenderer; #[actix_web::get("/actions")] @@ -25,11 +25,11 @@ pub async fn accounts(tmpl_env: MiniJinjaRenderer) -> actix_web::Result, + service_factory: web::Data, ) -> actix_web::Result { - let mut conn = conn_factory.readonly().unwrap(); // todo; to proper 500 - let service_factory = ReadOnlyServiceFactory::new(&mut conn); - let user_service = service_factory.get_user_service(); + let conn = service_factory.get_connection()?; + let user_service = service_factory.get_user_service(&conn)?; + let users = user_service.list_users().unwrap(); let ctx = context! { users => users, @@ -39,7 +39,6 @@ pub async fn overview( #[actix_web::get("/partials/overview/submit_button")] pub async fn overview_submit_button( - _req: HttpRequest, tmpl_env: MiniJinjaRenderer, query: web::Query>, ) -> actix_web::Result { @@ -51,7 +50,6 @@ pub async fn overview_submit_button( #[actix_web::get("/partials/actions/action-form")] pub async fn actions_partials( - _req: HttpRequest, tmpl_env: MiniJinjaRenderer, query: web::Query>, ) -> actix_web::Result { diff --git a/src/webui/worker.rs b/src/webui/worker.rs index a158023..b595929 100644 --- a/src/webui/worker.rs +++ b/src/webui/worker.rs @@ -1,9 +1,3 @@ - - - - - - use crate::event_processor::process_event; use crate::events::Event; use crate::util::Error::FuckingError;