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),
|
|
})
|
|
}
|