use crate::prelude2::*;
use crate::services::newsletter_service::ConfirmParameters;
use crate::services::newsletter_service::confirm_subscriber;
use crate::services::newsletter_service::get_confirmed_subscribers;
use crate::services::newsletter_service::get_subscriber_id_from_token;
pub async fn confirm_subscription(
_parameters: web::Query<ConfirmParameters>,
app_state: web::Data<AppContext>,
) -> impl Responder {
let id = match get_subscriber_id_from_token(app_state.mysql(), &_parameters.subscription_token)
.await
{
Ok(id) => id,
Err(e) => {
return format!("Failed to execute query: {:?}", e);
}
};
match id {
None => "401".to_string(),
Some(subscriber_id) => {
let confirm_result = confirm_subscriber(app_state.mysql(), subscriber_id).await;
if confirm_result.is_err() {
return format!("Failed to execute query: {:?}", confirm_result.unwrap_err());
}
"Ok".to_string()
}
}
}
pub async fn list_confirmed_subscribers(app_state: web::Data<AppContext>) -> Result<HttpResponse> {
let _subscribers = get_confirmed_subscribers(app_state.mysql())
.await
.context("Failed to acquire a Postgres connection from the pool")?;
let list: Vec<String> = _subscribers
.into_iter()
.filter_map(|subscriber| {
if let Ok(subscriber) = subscriber {
Some(subscriber.email.as_ref().to_string())
} else {
None
}
})
.collect();
Ok(HttpResponse::Ok().json(list))
}