Skip to main content

pipedash_core/application/
mod.rs

1mod config_watcher;
2pub mod fetch_scheduler;
3pub mod services;
4#[cfg(test)]
5pub(crate) mod test_support;
6
7use std::sync::Arc;
8
9pub use config_watcher::ConfigWatcher;
10pub use fetch_scheduler::{
11    AttemptHandle,
12    BackoffPolicy,
13    ClaimKind,
14    FetchClaim,
15    FetchResult,
16    FetchScheduler,
17    ForcedClaim,
18    Generation,
19    Outcome,
20    ScheduleView,
21};
22pub use services::device_alerts::recording_bus;
23pub use services::health_service::{
24    refresh_notifications,
25    HealthHandle,
26    HealthInput,
27    HealthReceivers,
28    HealthSnapshot,
29    LocalNotification,
30    NotificationState,
31    ProviderHealthInput,
32    ProviderHealthService,
33    ProviderHealthState,
34};
35pub use services::log_service::{
36    LogExport,
37    LogService,
38};
39pub use services::metrics_service::MetricsService;
40pub use services::pipeline_service::{
41    PipelineService,
42    RunWatch,
43    WatchedRun,
44};
45pub use services::pipeline_view_service::PipelineViewService;
46pub use services::provider_service::{
47    ProviderLease,
48    ProviderService,
49};
50use tokio::sync::watch;
51
52use crate::event::EventBus;
53use crate::infrastructure::database::Repository;
54use crate::infrastructure::run_logs::LogStore;
55use crate::infrastructure::{
56    ConfigState,
57    HttpClientManager,
58};
59
60mod refresh_manager;
61pub use refresh_manager::{
62    RefreshCommand,
63    RefreshDispatcher,
64    RefreshManager,
65    RefreshMode,
66};
67
68pub struct Services {
69    pub provider_service: Arc<ProviderService>,
70    pub pipeline_service: Arc<PipelineService>,
71    pub refresh_manager: Arc<RefreshManager>,
72    pub health: HealthHandle,
73    pub health_service: Arc<ProviderHealthService>,
74    pub log_service: Arc<LogService>,
75    pub pipeline_view_service: Arc<PipelineViewService>,
76}
77
78impl Services {
79    pub fn new(
80        repository: Arc<Repository>, http_client_manager: Arc<HttpClientManager>,
81        metrics_service: Option<Arc<MetricsService>>, event_bus: Arc<dyn EventBus>,
82        config_state: Arc<ConfigState>, log_store: Arc<LogStore>,
83    ) -> Self {
84        let (health, health_receivers) = HealthHandle::channel();
85        let (dispatcher, commands) = RefreshDispatcher::channel();
86        let (mode_tx, mode_rx) = watch::channel(RefreshMode::Active);
87        config_state.attach_health(health.clone());
88        let view_repository = Arc::clone(&repository);
89        let view_config_state = Arc::clone(&config_state);
90        let view_event_bus = Arc::clone(&event_bus);
91
92        let provider_service = Arc::new(ProviderService::new(
93            Arc::clone(&repository),
94            Arc::clone(&http_client_manager),
95            Arc::clone(&event_bus),
96            Arc::new(FetchScheduler::default()),
97            health.clone(),
98            dispatcher,
99            Arc::clone(&config_state),
100            Arc::clone(&log_store),
101        ));
102        let health_service = Arc::new(ProviderHealthService::new(
103            health_receivers,
104            Arc::clone(&provider_service),
105            http_client_manager,
106            Arc::clone(&event_bus),
107            config_state,
108            mode_tx.subscribe(),
109        ));
110        let log_service = Arc::new(LogService::new(
111            log_store,
112            Arc::clone(&provider_service),
113            Arc::clone(&repository),
114            Arc::clone(&event_bus),
115        ));
116        let pipeline_service = Arc::new(PipelineService::new(
117            repository,
118            Arc::clone(&provider_service),
119            metrics_service.clone(),
120            event_bus,
121            mode_rx,
122        ));
123        let refresh_manager = Arc::new(RefreshManager::new(
124            Arc::clone(&pipeline_service),
125            metrics_service,
126            mode_tx,
127            commands,
128        ));
129        let pipeline_view_service = Arc::new(PipelineViewService::new(
130            view_repository,
131            Arc::clone(&provider_service),
132            Arc::clone(&pipeline_service),
133            view_config_state,
134            view_event_bus,
135        ));
136
137        Self {
138            provider_service,
139            pipeline_service,
140            refresh_manager,
141            health,
142            health_service,
143            log_service,
144            pipeline_view_service,
145        }
146    }
147}