diff --git a/src/cli/serve.rs b/src/cli/serve.rs index 1183814..e1d0fa3 100644 --- a/src/cli/serve.rs +++ b/src/cli/serve.rs @@ -10,7 +10,7 @@ pub fn serve(config: &crate::config::Config) -> u8 { let ctx = server::Context { repo: repo.clone(), - store: crate::gpodder::GpodderRepository::new(Box::new(repo)), + store: crate::gpodder::GpodderRepository::new(repo), }; let app = server::app(ctx); diff --git a/src/gpodder/mod.rs b/src/gpodder/mod.rs index 567badf..eb6daa2 100644 --- a/src/gpodder/mod.rs +++ b/src/gpodder/mod.rs @@ -11,6 +11,10 @@ pub enum AuthErr { Other(Box), } +pub trait Store: AuthStore + DeviceRepository {} + +impl Store for T where T: AuthStore + DeviceRepository {} + pub trait AuthRepository { /// Validate the given session ID and return its user. fn validate_session(&self, session_id: i64) -> Result; diff --git a/src/gpodder/repository.rs b/src/gpodder/repository.rs index a6fb0b1..9314369 100644 --- a/src/gpodder/repository.rs +++ b/src/gpodder/repository.rs @@ -3,21 +3,19 @@ use std::sync::Arc; use argon2::{Argon2, PasswordHash, PasswordVerifier}; use rand::Rng; -use super::{models, AuthErr, AuthStore}; +use super::{models, AuthErr, Store}; const MAX_SESSION_AGE: i64 = 60 * 60 * 24 * 7; -type Store = dyn AuthStore + Send + Sync; - #[derive(Clone)] pub struct GpodderRepository { - store: Arc, + store: Arc, } impl GpodderRepository { - pub fn new(store: Box) -> Self { + pub fn new(store: impl Store + Send + Sync + 'static) -> Self { Self { - store: Arc::from(store), + store: Arc::new(store), } } @@ -71,4 +69,17 @@ impl GpodderRepository { pub fn remove_session(&self, session_id: i64) -> Result<(), AuthErr> { self.store.remove_session(session_id) } + + pub fn devices_for_user(&self, user: &models::User) -> Result, AuthErr> { + self.store.devices_for_user(user) + } + + pub fn update_device_info( + &self, + user: &models::User, + device_id: &str, + patch: models::DevicePatch, + ) -> Result<(), AuthErr> { + self.store.update_device_info(user, device_id, patch) + } } diff --git a/src/server/gpodder/advanced/devices.rs b/src/server/gpodder/advanced/devices.rs index bb90dc2..397ddb3 100644 --- a/src/server/gpodder/advanced/devices.rs +++ b/src/server/gpodder/advanced/devices.rs @@ -6,7 +6,7 @@ use axum::{ }; use crate::{ - gpodder::{self, DeviceRepository}, + gpodder, server::{ error::{AppError, AppResult}, gpodder::{ @@ -38,7 +38,7 @@ async fn get_devices( } Ok( - tokio::task::spawn_blocking(move || ctx.repo.devices_for_user(&user)) + tokio::task::spawn_blocking(move || ctx.store.devices_for_user(&user)) .await .unwrap() .map(Json)?, @@ -55,7 +55,7 @@ async fn post_device( return Err(AppError::NotFound); } - tokio::task::spawn_blocking(move || ctx.repo.update_device_info(&user, &id, patch)) + tokio::task::spawn_blocking(move || ctx.store.update_device_info(&user, &id, patch)) .await .unwrap()?;