zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
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))
}