60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
|
use actix_web::{post, web::Json, HttpResponse};
|
||
|
use serde::{Deserialize, Serialize};
|
||
|
use std::time::{SystemTime, UNIX_EPOCH};
|
||
|
use uuid::Uuid;
|
||
|
|
||
|
#[derive(Deserialize, Debug)]
|
||
|
pub struct PostPdfRequest {
|
||
|
pub html: String,
|
||
|
}
|
||
|
|
||
|
#[derive(Serialize)]
|
||
|
pub struct PostPdfResponse {
|
||
|
pub error: Option<String>,
|
||
|
pub filename: Option<String>,
|
||
|
}
|
||
|
|
||
|
#[post("/v1/pdf")]
|
||
|
async fn post_pdf(data: Json<PostPdfRequest>) -> HttpResponse {
|
||
|
let pdf_app = match wkhtmltopdf::PdfApplication::new() {
|
||
|
Ok(x) => x,
|
||
|
Err(x) => {
|
||
|
return HttpResponse::InternalServerError().json(PostPdfResponse {
|
||
|
error: Some(x.to_string()),
|
||
|
filename: None,
|
||
|
})
|
||
|
}
|
||
|
};
|
||
|
let mut pdfout = match pdf_app
|
||
|
.builder()
|
||
|
.orientation(wkhtmltopdf::Orientation::Portrait)
|
||
|
.margin(wkhtmltopdf::Size::Millimeters(10))
|
||
|
.build_from_html(&data.html)
|
||
|
{
|
||
|
Ok(x) => x,
|
||
|
Err(x) => {
|
||
|
return HttpResponse::InternalServerError().json(PostPdfResponse {
|
||
|
error: Some(x.to_string()),
|
||
|
filename: None,
|
||
|
})
|
||
|
}
|
||
|
};
|
||
|
|
||
|
let start = SystemTime::now();
|
||
|
let since_epoch = start
|
||
|
.duration_since(UNIX_EPOCH)
|
||
|
.expect("Time went backwards");
|
||
|
let filename = format!("/static/{}_{}.pdf", since_epoch.as_secs(), Uuid::new_v4());
|
||
|
if let Err(x) = pdfout.save(&filename) {
|
||
|
return HttpResponse::InternalServerError().json(PostPdfResponse {
|
||
|
error: Some(x.to_string()),
|
||
|
filename: None,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
HttpResponse::Created().json(PostPdfResponse {
|
||
|
error: None,
|
||
|
filename: Some(filename),
|
||
|
})
|
||
|
}
|