1
0
mirror of https://github.com/actix/examples synced 2024-11-28 00:12:57 +01:00
examples/simple-auth-server/src/invitation_handler.rs

54 lines
1.5 KiB
Rust
Raw Normal View History

use actix_web::{error::BlockingError, web, HttpResponse};
use diesel::{prelude::*, PgConnection};
use futures::Future;
use crate::email_service::send_invitation;
2019-03-29 21:43:03 +01:00
use crate::errors::ServiceError;
use crate::models::{Invitation, Pool};
2019-03-29 21:43:03 +01:00
#[derive(Deserialize)]
pub struct InvitationData {
pub email: String,
}
pub fn post_invitation(
invitation_data: web::Json<InvitationData>,
pool: web::Data<Pool>,
) -> impl Future<Item = HttpResponse, Error = ServiceError> {
// run diesel blocking code
2019-07-18 14:03:19 +02:00
web::block(move || create_invitation(invitation_data.into_inner().email, pool)).then(
|res| match res {
Ok(_) => Ok(HttpResponse::Ok().finish()),
Err(err) => match err {
BlockingError::Error(service_error) => Err(service_error),
BlockingError::Canceled => Err(ServiceError::InternalServerError),
},
2019-07-18 14:03:19 +02:00
},
)
}
fn create_invitation(
eml: String,
pool: web::Data<Pool>,
) -> Result<(), crate::errors::ServiceError> {
let invitation = dbg!(query(eml, pool)?);
send_invitation(&invitation)
}
/// Diesel query
2019-07-18 14:03:19 +02:00
fn query(
eml: String,
pool: web::Data<Pool>,
) -> Result<Invitation, crate::errors::ServiceError> {
use crate::schema::invitations::dsl::invitations;
2019-07-18 14:03:19 +02:00
let new_invitation: Invitation = eml.into();
let conn: &PgConnection = &pool.get().unwrap();
let inserted_invitation = diesel::insert_into(invitations)
.values(&new_invitation)
.get_result(conn)?;
Ok(inserted_invitation)
}