Compare commits

...
Author SHA1 Message Date
François-X. T b910a85262 Merge branch 'main' into fetch/download-signed-compliance-form 2025-10-04 22:14:15 +02:00
François-X. T da97e742e2 Implement request 2025-10-04 01:15:12 +02:00
2 changed files with 74 additions and 0 deletions
+57
View File
@@ -10,6 +10,8 @@ use crate::queue::payouts::PayoutsQueue;
use crate::queue::session::AuthQueue;
use crate::routes::ApiError;
use crate::util::avalara1099;
use crate::util::error::Context;
use actix_web::body::BodyStream;
use actix_web::{HttpRequest, HttpResponse, delete, get, post, web};
use chrono::{DateTime, Duration, Utc};
use hex::ToHex;
@@ -37,10 +39,65 @@ pub fn config(cfg: &mut web::ServiceConfig) {
.service(payment_methods)
.service(get_balance)
.service(platform_revenue)
.service(get_compliance_signed_pdf)
.service(post_compliance_form),
);
}
#[get("compliance/download")]
pub async fn get_compliance_signed_pdf(
req: HttpRequest,
pool: web::Data<PgPool>,
redis: web::Data<RedisPool>,
session_queue: web::Data<AuthQueue>,
) -> Result<HttpResponse, ApiError> {
let user = get_user_from_headers(
&req,
&**pool,
&redis,
&session_queue,
Scopes::PAYOUTS_READ,
)
.await?
.1;
let user_id = DBUserId(user.id.0 as i64);
let mut txn = pool.begin().await?;
users_compliance::UserCompliance::get_by_user_id(&mut *txn, user_id)
.await?
.filter(|c| c.signed.is_some())
.map(|c| async move {
avalara1099::get_form_request(&c.external_request_id).await
})
.ok_or_else(|| {
ApiError::Conflict(
"Compliance form hasn't been signed yet!".to_owned(),
)
})?
.await?
.inspect_err(|v| {
error!(
"Error getting form request from track1099: error response: {v}"
)
})
.map_err(|_| ApiError::TaxComplianceApi)?
.data
.links
.wrap_internal_err("missing `links` in track1099 response")?
.remove("signed_pdf")
.map(reqwest::get)
.wrap_internal_err("missing `signed_pdf` in track1099 response links")?
.await
.map(|resp| {
HttpResponse::Ok()
.content_type("application/pdf")
.body(BodyStream::new(resp.bytes_stream()))
})
.wrap_internal_err("failed to initiate compliance form download")
}
#[derive(Deserialize)]
pub struct RequestForm {
form_type: users_compliance::FormType,
+17
View File
@@ -92,6 +92,23 @@ pub async fn request_form(
})
}
pub async fn get_form_request(
form_request_id: &str,
) -> Result<Result<DataWrapper<FormResponse>, serde_json::Value>, ApiError> {
let (request_builder, _company_id) = team_request(
reqwest::Method::GET,
&format!("/form_requests/{form_request_id}"),
)?;
let response = request_builder.send().await?;
Ok(if response.status().is_success() {
Ok(response.json::<DataWrapper<FormResponse>>().await?)
} else {
Err(response.json().await?)
})
}
pub async fn check_form(
reference_id: &str,
) -> Result<