redact-client 1.5.9

Receives request for private data and decrypts it to display securely in browser
use warp::{Filter, Rejection, Reply};

use crate::{render::Renderer, routes::validated_query_params, token::TokenGenerator};

pub mod get;

pub fn get<T: TokenGenerator, R: Renderer + Clone + Send + Sync>(
    token_generator: T,
    render_engine: R,
) -> impl Filter<Extract = (impl Reply, String, String), Error = Rejection> + Clone {
    warp::get()
        .and(warp::path!(String))
        .and(warp::any().map(move || token_generator.clone().generate_token().unwrap()))
        .and(validated_query_params::<get::QueryParams>())
        .and(warp::any().map(move || render_engine.clone()))
        .and_then(
            |path: String, token: String, query: get::QueryParams, render_engine: R| async move {
                let secure_path = format!("/secure/data/{}/{}", &path, &token);
                Ok::<_, Rejection>((
                    get::reply(&secure_path, query, &render_engine)?,
                    secure_path,
                    token,
                ))
            },
        )
        .untuple_one()
}