Skip to content

Commit 52b3097

Browse files
committed
refactor: [torrust#1298] remove dependency on global app container in packages
To be able to move more code from the main mod to workspace packages. Packages cannot depend on global stuff.
1 parent 1bd5f0a commit 52b3097

File tree

9 files changed

+269
-85
lines changed

9 files changed

+269
-85
lines changed

packages/axum-http-tracker-server/src/container.rs

+45
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
use std::sync::Arc;
22

33
use bittorrent_tracker_core::announce_handler::AnnounceHandler;
4+
use bittorrent_tracker_core::authentication::key::repository::in_memory::InMemoryKeyRepository;
45
use bittorrent_tracker_core::authentication::service::AuthenticationService;
6+
use bittorrent_tracker_core::databases::setup::initialize_database;
57
use bittorrent_tracker_core::scrape_handler::ScrapeHandler;
8+
use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository;
9+
use bittorrent_tracker_core::torrent::repository::persisted::DatabasePersistentTorrentRepository;
610
use bittorrent_tracker_core::whitelist;
11+
use bittorrent_tracker_core::whitelist::authorization::WhitelistAuthorization;
12+
use bittorrent_tracker_core::whitelist::repository::in_memory::InMemoryWhitelist;
713
use torrust_tracker_configuration::{Core, HttpTracker};
814

915
pub struct HttpTrackerContainer {
@@ -15,3 +21,42 @@ pub struct HttpTrackerContainer {
1521
pub http_stats_event_sender: Arc<Option<Box<dyn bittorrent_http_tracker_core::statistics::event::sender::Sender>>>,
1622
pub authentication_service: Arc<AuthenticationService>,
1723
}
24+
25+
#[must_use]
26+
pub fn initialize_http_tracker_container(
27+
core_config: &Arc<Core>,
28+
http_tracker_config: &Arc<HttpTracker>,
29+
) -> Arc<HttpTrackerContainer> {
30+
// HTTP stats
31+
let (http_stats_event_sender, _http_stats_repository) =
32+
bittorrent_http_tracker_core::statistics::setup::factory(core_config.tracker_usage_statistics);
33+
let http_stats_event_sender = Arc::new(http_stats_event_sender);
34+
35+
let database = initialize_database(core_config);
36+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
37+
let whitelist_authorization = Arc::new(WhitelistAuthorization::new(core_config, &in_memory_whitelist.clone()));
38+
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
39+
let authentication_service = Arc::new(AuthenticationService::new(core_config, &in_memory_key_repository));
40+
41+
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
42+
let db_torrent_repository = Arc::new(DatabasePersistentTorrentRepository::new(&database));
43+
44+
let announce_handler = Arc::new(AnnounceHandler::new(
45+
core_config,
46+
&whitelist_authorization,
47+
&in_memory_torrent_repository,
48+
&db_torrent_repository,
49+
));
50+
51+
let scrape_handler = Arc::new(ScrapeHandler::new(&whitelist_authorization, &in_memory_torrent_repository));
52+
53+
Arc::new(HttpTrackerContainer {
54+
http_tracker_config: http_tracker_config.clone(),
55+
core_config: core_config.clone(),
56+
announce_handler: announce_handler.clone(),
57+
scrape_handler: scrape_handler.clone(),
58+
whitelist_authorization: whitelist_authorization.clone(),
59+
http_stats_event_sender: http_stats_event_sender.clone(),
60+
authentication_service: authentication_service.clone(),
61+
})
62+
}

src/app.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use torrust_tracker_configuration::Configuration;
2929
use tracing::instrument;
3030

3131
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
32-
use crate::container::{AppContainer, HttpApiContainer, UdpTrackerContainer};
32+
use crate::container::AppContainer;
3333
use crate::servers;
3434

3535
/// # Panics
@@ -79,7 +79,7 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
7979
);
8080
} else {
8181
let udp_tracker_config = Arc::new(udp_tracker_config.clone());
82-
let udp_tracker_container = Arc::new(UdpTrackerContainer::from_app_container(&udp_tracker_config, app_container));
82+
let udp_tracker_container = Arc::new(app_container.udp_tracker_container(&udp_tracker_config));
8383

8484
jobs.push(udp_tracker::start_job(udp_tracker_container, registar.give_form()).await);
8585
}
@@ -111,7 +111,7 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
111111
// Start HTTP API
112112
if let Some(http_api_config) = &config.http_api {
113113
let http_api_config = Arc::new(http_api_config.clone());
114-
let http_api_container = Arc::new(HttpApiContainer::from_app_container(&http_api_config, app_container));
114+
let http_api_container = Arc::new(app_container.http_api_container(&http_api_config));
115115

116116
if let Some(job) = tracker_apis::start_job(http_api_container, registar.give_form(), servers::apis::Version::V1).await {
117117
jobs.push(job);

src/bootstrap/app.rs

+75-2
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ use bittorrent_udp_tracker_core::MAX_CONNECTION_ID_ERRORS_PER_IP;
3333
use tokio::sync::RwLock;
3434
use torrust_tracker_clock::static_time;
3535
use torrust_tracker_configuration::validator::Validator;
36-
use torrust_tracker_configuration::{logging, Configuration, Logging};
36+
use torrust_tracker_configuration::{logging, Configuration, Core, HttpApi, Logging, UdpTracker};
3737
use tracing::instrument;
3838

3939
use super::config::initialize_configuration;
40-
use crate::container::AppContainer;
40+
use crate::container::{AppContainer, HttpApiContainer, UdpTrackerContainer};
4141

4242
/// It loads the configuration from the environment and builds app container.
4343
///
@@ -155,6 +155,79 @@ pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
155155
}
156156
}
157157

158+
#[must_use]
159+
pub fn initialize_http_api_container(core_config: &Arc<Core>, http_api_config: &Arc<HttpApi>) -> Arc<HttpApiContainer> {
160+
// HTTP stats
161+
let (_http_stats_event_sender, http_stats_repository) =
162+
bittorrent_http_tracker_core::statistics::setup::factory(core_config.tracker_usage_statistics);
163+
let http_stats_repository = Arc::new(http_stats_repository);
164+
165+
// UDP stats
166+
let (_udp_stats_event_sender, udp_stats_repository) =
167+
bittorrent_udp_tracker_core::statistics::setup::factory(core_config.tracker_usage_statistics);
168+
let udp_stats_repository = Arc::new(udp_stats_repository);
169+
170+
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
171+
let database = initialize_database(core_config);
172+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
173+
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
174+
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
175+
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
176+
let keys_handler = Arc::new(KeysHandler::new(
177+
&db_key_repository.clone(),
178+
&in_memory_key_repository.clone(),
179+
));
180+
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
181+
182+
Arc::new(HttpApiContainer {
183+
http_api_config: http_api_config.clone(),
184+
core_config: core_config.clone(),
185+
in_memory_torrent_repository: in_memory_torrent_repository.clone(),
186+
keys_handler: keys_handler.clone(),
187+
whitelist_manager: whitelist_manager.clone(),
188+
ban_service: ban_service.clone(),
189+
http_stats_repository: http_stats_repository.clone(),
190+
udp_stats_repository: udp_stats_repository.clone(),
191+
})
192+
}
193+
194+
#[must_use]
195+
pub fn initialize_udt_tracker_container(
196+
core_config: &Arc<Core>,
197+
udp_tracker_config: &Arc<UdpTracker>,
198+
) -> Arc<UdpTrackerContainer> {
199+
// UDP stats
200+
let (udp_stats_event_sender, _udp_stats_repository) =
201+
bittorrent_udp_tracker_core::statistics::setup::factory(core_config.tracker_usage_statistics);
202+
let udp_stats_event_sender = Arc::new(udp_stats_event_sender);
203+
204+
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
205+
let database = initialize_database(core_config);
206+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
207+
let whitelist_authorization = Arc::new(WhitelistAuthorization::new(core_config, &in_memory_whitelist.clone()));
208+
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
209+
let db_torrent_repository = Arc::new(DatabasePersistentTorrentRepository::new(&database));
210+
211+
let announce_handler = Arc::new(AnnounceHandler::new(
212+
core_config,
213+
&whitelist_authorization,
214+
&in_memory_torrent_repository,
215+
&db_torrent_repository,
216+
));
217+
218+
let scrape_handler = Arc::new(ScrapeHandler::new(&whitelist_authorization, &in_memory_torrent_repository));
219+
220+
Arc::new(UdpTrackerContainer {
221+
udp_tracker_config: udp_tracker_config.clone(),
222+
core_config: core_config.clone(),
223+
announce_handler: announce_handler.clone(),
224+
scrape_handler: scrape_handler.clone(),
225+
whitelist_authorization: whitelist_authorization.clone(),
226+
udp_stats_event_sender: udp_stats_event_sender.clone(),
227+
ban_service: ban_service.clone(),
228+
})
229+
}
230+
158231
/// It initializes the application static values.
159232
///
160233
/// These values are accessible throughout the entire application:

src/bootstrap/jobs/http_tracker.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -77,24 +77,24 @@ async fn start_v1(
7777
mod tests {
7878
use std::sync::Arc;
7979

80+
use torrust_axum_http_tracker_server::container::initialize_http_tracker_container;
8081
use torrust_axum_http_tracker_server::Version;
8182
use torrust_server_lib::registar::Registar;
8283
use torrust_tracker_test_helpers::configuration::ephemeral_public;
8384

84-
use crate::bootstrap::app::{initialize_app_container, initialize_global_services};
85+
use crate::bootstrap::app::initialize_global_services;
8586
use crate::bootstrap::jobs::http_tracker::start_job;
8687

8788
#[tokio::test]
8889
async fn it_should_start_http_tracker() {
8990
let cfg = Arc::new(ephemeral_public());
91+
let core_config = Arc::new(cfg.core.clone());
9092
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
9193
let http_tracker_config = Arc::new(http_tracker[0].clone());
9294

9395
initialize_global_services(&cfg);
9496

95-
let app_container = Arc::new(initialize_app_container(&cfg));
96-
97-
let http_tracker_container = Arc::new(app_container.http_tracker_container(&http_tracker_config));
97+
let http_tracker_container = initialize_http_tracker_container(&core_config, &http_tracker_config);
9898

9999
let version = Version::V1;
100100

src/bootstrap/jobs/tracker_apis.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,19 @@ mod tests {
100100
use torrust_server_lib::registar::Registar;
101101
use torrust_tracker_test_helpers::configuration::ephemeral_public;
102102

103-
use crate::bootstrap::app::{initialize_app_container, initialize_global_services};
103+
use crate::bootstrap::app::{initialize_global_services, initialize_http_api_container};
104104
use crate::bootstrap::jobs::tracker_apis::start_job;
105-
use crate::container::HttpApiContainer;
106105
use crate::servers::apis::Version;
107106

108107
#[tokio::test]
109108
async fn it_should_start_http_tracker() {
110109
let cfg = Arc::new(ephemeral_public());
110+
let core_config = Arc::new(cfg.core.clone());
111111
let http_api_config = Arc::new(cfg.http_api.clone().unwrap());
112112

113113
initialize_global_services(&cfg);
114114

115-
let app_container = Arc::new(initialize_app_container(&cfg));
116-
117-
let http_api_container = Arc::new(HttpApiContainer::from_app_container(&http_api_config, &app_container));
115+
let http_api_container = initialize_http_api_container(&core_config, &http_api_config);
118116

119117
let version = Version::V1;
120118

src/container.rs

+27-31
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,33 @@ impl AppContainer {
5050
authentication_service: self.authentication_service.clone(),
5151
}
5252
}
53+
54+
#[must_use]
55+
pub fn udp_tracker_container(&self, udp_tracker_config: &Arc<UdpTracker>) -> UdpTrackerContainer {
56+
UdpTrackerContainer {
57+
udp_tracker_config: udp_tracker_config.clone(),
58+
core_config: self.core_config.clone(),
59+
announce_handler: self.announce_handler.clone(),
60+
scrape_handler: self.scrape_handler.clone(),
61+
whitelist_authorization: self.whitelist_authorization.clone(),
62+
udp_stats_event_sender: self.udp_stats_event_sender.clone(),
63+
ban_service: self.ban_service.clone(),
64+
}
65+
}
66+
67+
#[must_use]
68+
pub fn http_api_container(&self, http_api_config: &Arc<HttpApi>) -> HttpApiContainer {
69+
HttpApiContainer {
70+
http_api_config: http_api_config.clone(),
71+
core_config: self.core_config.clone(),
72+
in_memory_torrent_repository: self.in_memory_torrent_repository.clone(),
73+
keys_handler: self.keys_handler.clone(),
74+
whitelist_manager: self.whitelist_manager.clone(),
75+
ban_service: self.ban_service.clone(),
76+
http_stats_repository: self.http_stats_repository.clone(),
77+
udp_stats_repository: self.udp_stats_repository.clone(),
78+
}
79+
}
5380
}
5481

5582
pub struct UdpTrackerContainer {
@@ -62,21 +89,6 @@ pub struct UdpTrackerContainer {
6289
pub ban_service: Arc<RwLock<BanService>>,
6390
}
6491

65-
impl UdpTrackerContainer {
66-
#[must_use]
67-
pub fn from_app_container(udp_tracker_config: &Arc<UdpTracker>, app_container: &Arc<AppContainer>) -> Self {
68-
Self {
69-
udp_tracker_config: udp_tracker_config.clone(),
70-
core_config: app_container.core_config.clone(),
71-
announce_handler: app_container.announce_handler.clone(),
72-
scrape_handler: app_container.scrape_handler.clone(),
73-
whitelist_authorization: app_container.whitelist_authorization.clone(),
74-
udp_stats_event_sender: app_container.udp_stats_event_sender.clone(),
75-
ban_service: app_container.ban_service.clone(),
76-
}
77-
}
78-
}
79-
8092
pub struct HttpApiContainer {
8193
pub core_config: Arc<Core>,
8294
pub http_api_config: Arc<HttpApi>,
@@ -87,19 +99,3 @@ pub struct HttpApiContainer {
8799
pub http_stats_repository: Arc<bittorrent_http_tracker_core::statistics::repository::Repository>,
88100
pub udp_stats_repository: Arc<bittorrent_udp_tracker_core::statistics::repository::Repository>,
89101
}
90-
91-
impl HttpApiContainer {
92-
#[must_use]
93-
pub fn from_app_container(http_api_config: &Arc<HttpApi>, app_container: &Arc<AppContainer>) -> Self {
94-
Self {
95-
http_api_config: http_api_config.clone(),
96-
core_config: app_container.core_config.clone(),
97-
in_memory_torrent_repository: app_container.in_memory_torrent_repository.clone(),
98-
keys_handler: app_container.keys_handler.clone(),
99-
whitelist_manager: app_container.whitelist_manager.clone(),
100-
ban_service: app_container.ban_service.clone(),
101-
http_stats_repository: app_container.http_stats_repository.clone(),
102-
udp_stats_repository: app_container.udp_stats_repository.clone(),
103-
}
104-
}
105-
}

src/servers/apis/server.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -298,19 +298,17 @@ mod tests {
298298
use torrust_server_lib::registar::Registar;
299299
use torrust_tracker_test_helpers::configuration::ephemeral_public;
300300

301-
use crate::bootstrap::app::{initialize_app_container, initialize_global_services};
302-
use crate::container::HttpApiContainer;
301+
use crate::bootstrap::app::{initialize_global_services, initialize_http_api_container};
303302
use crate::servers::apis::server::{ApiServer, Launcher};
304303

305304
#[tokio::test]
306305
async fn it_should_be_able_to_start_and_stop() {
307306
let cfg = Arc::new(ephemeral_public());
307+
let core_config = Arc::new(cfg.core.clone());
308308
let http_api_config = Arc::new(cfg.http_api.clone().unwrap());
309309

310310
initialize_global_services(&cfg);
311311

312-
let app_container = Arc::new(initialize_app_container(&cfg));
313-
314312
let bind_to = http_api_config.bind_address;
315313

316314
let tls = make_rust_tls(&http_api_config.tsl_config)
@@ -323,7 +321,7 @@ mod tests {
323321

324322
let register = &Registar::default();
325323

326-
let http_api_container = Arc::new(HttpApiContainer::from_app_container(&http_api_config, &app_container));
324+
let http_api_container = initialize_http_api_container(&core_config, &http_api_config);
327325

328326
let started = stopped
329327
.start(http_api_container, register.give_form(), access_tokens)

0 commit comments

Comments
 (0)