Skip to main content

zlicenser_server/http/
transfer.rs

1use std::sync::Arc;
2
3use axum::{
4    Json,
5    extract::{Path, State},
6    http::StatusCode,
7    response::{IntoResponse, Response},
8};
9use serde::Deserialize;
10use uuid::Uuid;
11
12use crate::issuance::handlers::HandlerContext;
13use crate::storage::Storage;
14
15#[derive(Deserialize)]
16pub struct TransferRequestBody {
17    pub old_fingerprint_commitment: Vec<u8>,
18    pub new_fingerprint_commitment: Vec<u8>,
19}
20
21pub async fn request_handler<S: Storage + Clone + Send + Sync + 'static>(
22    State(ctx): State<Arc<HandlerContext<S>>>,
23    Path(license_id): Path<Uuid>,
24    Json(body): Json<TransferRequestBody>,
25) -> Response {
26    match crate::issuance::transfer::request_transfer(
27        &ctx.storage,
28        license_id,
29        body.old_fingerprint_commitment,
30        body.new_fingerprint_commitment,
31    )
32    .await
33    {
34        Ok(req) => (StatusCode::CREATED, Json(req.id.to_string())).into_response(),
35        Err(e) => e.into_response(),
36    }
37}
38
39#[derive(Deserialize)]
40pub struct ResolveBody {
41    pub vendor_note: Option<String>,
42}
43
44pub async fn approve_handler<S: Storage + Clone + Send + Sync + 'static>(
45    State(ctx): State<Arc<HandlerContext<S>>>,
46    Path(transfer_id): Path<Uuid>,
47    Json(body): Json<ResolveBody>,
48) -> Response {
49    match crate::issuance::transfer::approve_transfer(&ctx.storage, transfer_id, body.vendor_note)
50        .await
51    {
52        Ok(()) => StatusCode::NO_CONTENT.into_response(),
53        Err(e) => e.into_response(),
54    }
55}
56
57pub async fn reject_handler<S: Storage + Clone + Send + Sync + 'static>(
58    State(ctx): State<Arc<HandlerContext<S>>>,
59    Path(transfer_id): Path<Uuid>,
60    Json(body): Json<ResolveBody>,
61) -> Response {
62    match crate::issuance::transfer::reject_transfer(&ctx.storage, transfer_id, body.vendor_note)
63        .await
64    {
65        Ok(()) => StatusCode::NO_CONTENT.into_response(),
66        Err(e) => e.into_response(),
67    }
68}