feat(api): wire library_repo, app_settings_repo, library_sync_adapter into AppState; start scheduler
This commit is contained in:
@@ -7,12 +7,13 @@ use std::sync::Arc;
|
|||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
use domain::{ChannelService, IProviderRegistry, ScheduleEngineService, UserService};
|
use domain::{ChannelService, IProviderRegistry, ScheduleEngineService, UserService};
|
||||||
use infra::factory::{build_activity_log_repository, build_channel_repository, build_provider_config_repository, build_schedule_repository, build_user_repository};
|
use infra::factory::{build_activity_log_repository, build_app_settings_repository, build_channel_repository, build_library_repository, build_provider_config_repository, build_schedule_repository, build_user_repository};
|
||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
use infra::factory::build_transcode_settings_repository;
|
use infra::factory::build_transcode_settings_repository;
|
||||||
|
|
||||||
mod config;
|
mod config;
|
||||||
mod database;
|
mod database;
|
||||||
|
mod library_scheduler;
|
||||||
mod provider_registry;
|
mod provider_registry;
|
||||||
mod dto;
|
mod dto;
|
||||||
mod error;
|
mod error;
|
||||||
@@ -80,6 +81,11 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
let transcode_settings_repo = build_transcode_settings_repository(&db_pool).await.ok();
|
let transcode_settings_repo = build_transcode_settings_repository(&db_pool).await.ok();
|
||||||
|
|
||||||
|
let library_repo = build_library_repository(&db_pool).await?;
|
||||||
|
let app_settings_repo = build_app_settings_repository(&db_pool).await?;
|
||||||
|
let library_sync_adapter: Arc<dyn domain::LibrarySyncAdapter> =
|
||||||
|
Arc::new(infra::FullSyncAdapter::new(Arc::clone(&library_repo)));
|
||||||
|
|
||||||
#[allow(unused_mut)]
|
#[allow(unused_mut)]
|
||||||
let mut state = AppState::new(
|
let mut state = AppState::new(
|
||||||
user_service,
|
user_service,
|
||||||
@@ -93,6 +99,9 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
handles.log_history,
|
handles.log_history,
|
||||||
activity_log_repo,
|
activity_log_repo,
|
||||||
db_pool,
|
db_pool,
|
||||||
|
library_repo,
|
||||||
|
library_sync_adapter,
|
||||||
|
app_settings_repo,
|
||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
transcode_settings_repo,
|
transcode_settings_repo,
|
||||||
)
|
)
|
||||||
@@ -113,5 +122,11 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
event_tx,
|
event_tx,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
tokio::spawn(library_scheduler::run_library_sync(
|
||||||
|
Arc::clone(&state.library_sync_adapter),
|
||||||
|
Arc::clone(&state.provider_registry),
|
||||||
|
Arc::clone(&state.app_settings_repo),
|
||||||
|
));
|
||||||
|
|
||||||
server::build_and_serve(state, &config).await
|
server::build_and_serve(state, &config).await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ use tokio::sync::broadcast;
|
|||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::events::EventBus;
|
use crate::events::EventBus;
|
||||||
use crate::log_layer::LogLine;
|
use crate::log_layer::LogLine;
|
||||||
use domain::{ActivityLogRepository, ChannelService, ProviderConfigRepository, ScheduleEngineService, UserService};
|
use domain::{ActivityLogRepository, ChannelService, IAppSettingsRepository, ILibraryRepository, LibrarySyncAdapter, ProviderConfigRepository, ScheduleEngineService, UserService};
|
||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
use domain::TranscodeSettingsRepository;
|
use domain::TranscodeSettingsRepository;
|
||||||
use k_core::db::DatabasePool;
|
use k_core::db::DatabasePool;
|
||||||
@@ -53,6 +53,9 @@ pub struct AppState {
|
|||||||
pub transcode_settings_repo: Option<Arc<dyn TranscodeSettingsRepository>>,
|
pub transcode_settings_repo: Option<Arc<dyn TranscodeSettingsRepository>>,
|
||||||
/// Database pool — used by infra factory functions for hot-reload.
|
/// Database pool — used by infra factory functions for hot-reload.
|
||||||
pub db_pool: Arc<DatabasePool>,
|
pub db_pool: Arc<DatabasePool>,
|
||||||
|
pub library_repo: Arc<dyn ILibraryRepository>,
|
||||||
|
pub library_sync_adapter: Arc<dyn LibrarySyncAdapter>,
|
||||||
|
pub app_settings_repo: Arc<dyn IAppSettingsRepository>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
@@ -69,6 +72,9 @@ impl AppState {
|
|||||||
log_history: Arc<Mutex<VecDeque<LogLine>>>,
|
log_history: Arc<Mutex<VecDeque<LogLine>>>,
|
||||||
activity_log_repo: Arc<dyn ActivityLogRepository>,
|
activity_log_repo: Arc<dyn ActivityLogRepository>,
|
||||||
db_pool: Arc<DatabasePool>,
|
db_pool: Arc<DatabasePool>,
|
||||||
|
library_repo: Arc<dyn ILibraryRepository>,
|
||||||
|
library_sync_adapter: Arc<dyn LibrarySyncAdapter>,
|
||||||
|
app_settings_repo: Arc<dyn IAppSettingsRepository>,
|
||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
transcode_settings_repo: Option<Arc<dyn TranscodeSettingsRepository>>,
|
transcode_settings_repo: Option<Arc<dyn TranscodeSettingsRepository>>,
|
||||||
) -> anyhow::Result<Self> {
|
) -> anyhow::Result<Self> {
|
||||||
@@ -155,6 +161,9 @@ impl AppState {
|
|||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
transcode_settings_repo,
|
transcode_settings_repo,
|
||||||
db_pool,
|
db_pool,
|
||||||
|
library_repo,
|
||||||
|
library_sync_adapter,
|
||||||
|
app_settings_repo,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::db::DatabasePool;
|
use crate::db::DatabasePool;
|
||||||
use domain::{ActivityLogRepository, ChannelRepository, ProviderConfigRepository, ScheduleRepository, TranscodeSettingsRepository, UserRepository};
|
use domain::{ActivityLogRepository, ChannelRepository, IAppSettingsRepository, ILibraryRepository, ProviderConfigRepository, ScheduleRepository, TranscodeSettingsRepository, UserRepository};
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum FactoryError {
|
pub enum FactoryError {
|
||||||
@@ -119,6 +119,36 @@ pub async fn build_transcode_settings_repository(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn build_library_repository(
|
||||||
|
pool: &DatabasePool,
|
||||||
|
) -> FactoryResult<Arc<dyn ILibraryRepository>> {
|
||||||
|
match pool {
|
||||||
|
#[cfg(feature = "sqlite")]
|
||||||
|
DatabasePool::Sqlite(pool) => Ok(Arc::new(
|
||||||
|
crate::library_repository::SqliteLibraryRepository::new(pool.clone()),
|
||||||
|
)),
|
||||||
|
#[allow(unreachable_patterns)]
|
||||||
|
_ => Err(FactoryError::NotImplemented(
|
||||||
|
"LibraryRepository not implemented for this database".to_string(),
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn build_app_settings_repository(
|
||||||
|
pool: &DatabasePool,
|
||||||
|
) -> FactoryResult<Arc<dyn IAppSettingsRepository>> {
|
||||||
|
match pool {
|
||||||
|
#[cfg(feature = "sqlite")]
|
||||||
|
DatabasePool::Sqlite(pool) => Ok(Arc::new(
|
||||||
|
crate::app_settings_repository::SqliteAppSettingsRepository::new(pool.clone()),
|
||||||
|
)),
|
||||||
|
#[allow(unreachable_patterns)]
|
||||||
|
_ => Err(FactoryError::NotImplemented(
|
||||||
|
"AppSettingsRepository not implemented for this database".to_string(),
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "local-files")]
|
#[cfg(feature = "local-files")]
|
||||||
pub struct LocalFilesBundle {
|
pub struct LocalFilesBundle {
|
||||||
pub provider: Arc<crate::LocalFilesProvider>,
|
pub provider: Arc<crate::LocalFilesProvider>,
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ impl ProviderRegistry {
|
|||||||
self.providers.is_empty()
|
self.providers.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the provider registered under `id`, if any.
|
||||||
|
pub fn get_provider(&self, id: &str) -> Option<Arc<dyn IMediaProvider>> {
|
||||||
|
self.providers
|
||||||
|
.iter()
|
||||||
|
.find(|(pid, _)| pid == id)
|
||||||
|
.map(|(_, p)| Arc::clone(p))
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Internal helpers
|
// Internal helpers
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user