diff --git a/configuration/base.yaml b/configuration/base.yaml index e42d958..885fa69 100644 --- a/configuration/base.yaml +++ b/configuration/base.yaml @@ -7,4 +7,6 @@ database: username: "postgres" password: "password" database_name: "newsletter" - require_ssl: false \ No newline at end of file + require_ssl: false +email_client: + base_url: "localhost" \ No newline at end of file diff --git a/configuration/production.yaml b/configuration/production.yaml index f3ac210..f84ecb4 100644 --- a/configuration/production.yaml +++ b/configuration/production.yaml @@ -1,4 +1,6 @@ application: host: 0.0.0.0 database: - require_ssl: true \ No newline at end of file + require_ssl: true +email_client: + base_url: "https://api.postmarkapp.com" diff --git a/src/configuration.rs b/src/configuration.rs index 8281ca0..ad89e28 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -6,6 +6,7 @@ use std::convert::{TryFrom, TryInto}; pub struct Settings { pub database: DatabaseSettings, pub application: ApplicationSettings, + pub email_client: EmailClientSettings, } #[derive(serde::Deserialize)] @@ -46,6 +47,11 @@ impl DatabaseSettings { } } +#[derive(serde::Deserialize)] +pub struct EmailClientSettings { + pub base_url: String, +} + pub fn get_configuration() -> Result { let mut settings = config::Config::default(); let base_path = std::env::current_dir().expect("Failed to determine the current directory"); diff --git a/src/email_client.rs b/src/email_client.rs index aba4b07..52ba6a8 100644 --- a/src/email_client.rs +++ b/src/email_client.rs @@ -3,12 +3,14 @@ use reqwest::Client; pub struct EmailClient { http_client: Client, + base_url: String, } impl EmailClient { - pub fn new() -> Self { + pub fn new(base_url: String) -> Self { Self { http_client: Client::new(), + base_url, } } diff --git a/src/main.rs b/src/main.rs index b89442a..f68a351 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use sqlx::postgres::PgPoolOptions; use std::net::TcpListener; use zero2prod::configuration::get_configuration; +use zero2prod::email_client::EmailClient; use zero2prod::startup::run; use zero2prod::telemetry::{get_subscriber, init_subscriber}; @@ -15,12 +16,13 @@ async fn main() -> std::io::Result<()> { .connect_with(configuration.database.with_db()) .await .expect("Failed to connect to Postgres."); + let email_client = EmailClient::new(configuration.email_client.base_url); let address = format!( "{}:{}", configuration.application.host, configuration.application.port ); let listener = TcpListener::bind(address)?; - run(listener, connection_pool)?.await?; + run(listener, connection_pool, email_client)?.await?; Ok(()) } diff --git a/tests/health_check.rs b/tests/health_check.rs index b72efb1..97af0c5 100644 --- a/tests/health_check.rs +++ b/tests/health_check.rs @@ -2,6 +2,7 @@ use sqlx::{Connection, Executor, PgConnection, PgPool}; use std::net::TcpListener; use uuid::Uuid; use zero2prod::configuration::{get_configuration, DatabaseSettings}; +use zero2prod::email_client::EmailClient; use zero2prod::startup::run; use zero2prod::telemetry::{get_subscriber, init_subscriber}; @@ -32,8 +33,10 @@ async fn spawn_app() -> TestApp { let mut configuration = get_configuration().expect("Failed to read configuration."); configuration.database.database_name = Uuid::new_v4().to_string(); let connection_pool = configure_database(&configuration.database).await; + let email_client = EmailClient::new(configuration.email_client.base_url); - let server = run(listener, connection_pool.clone()).expect("Failed to bind address"); + let server = + run(listener, connection_pool.clone(), email_client).expect("Failed to bind address"); let _ = tokio::spawn(server); TestApp { address,