zlicenser_server/http/
transfer.rs1use 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}