hyaenidae/server/src/submissions/middleware.rs

34 lines
914 B
Rust

use crate::{submissions::Submission, State};
use actix_web::{
dev::Payload,
web::{Data, Path},
FromRequest, HttpRequest,
};
use futures::future::LocalBoxFuture;
use uuid::Uuid;
#[derive(Clone, Debug, serde::Deserialize)]
struct SubmissionPath {
submission_id: Uuid,
}
impl FromRequest for Submission {
type Config = ();
type Error = actix_web::Error;
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
let state_fut = Data::<State>::extract(&req);
let submission_id_fut = Path::<SubmissionPath>::extract(&req);
Box::pin(async move {
let submission_id = submission_id_fut.await?.submission_id;
let state = state_fut.await?;
let submission = Submission::from_id(submission_id, &state)?;
Ok(submission)
})
}
}