1use serde::{Deserialize, Serialize};
2use url::Url;
3use utoipa::{ToResponse, ToSchema};
4
5#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
6pub struct XferProtocol {
7 pub target: Url,
14}
15
16const XFER_QUEUE_SUFFIX: &str = ".xfer.kumomta.internal";
17
18impl XferProtocol {
19 pub fn is_xfer_queue_name(name: &str) -> bool {
20 name.ends_with(XFER_QUEUE_SUFFIX)
21 }
22
23 pub fn to_queue_name(&self) -> String {
24 format!("{}{XFER_QUEUE_SUFFIX}", self.target)
25 }
26
27 pub fn from_queue_name(name: &str) -> Option<Self> {
28 let name = name.strip_suffix(XFER_QUEUE_SUFFIX)?;
29 let target: Url = name.parse().ok()?;
30 Some(Self { target })
31 }
32}
33
34#[derive(Serialize, Deserialize, Debug, ToSchema)]
39pub struct XferV1Request {
40 #[serde(default)]
42 pub campaign: Option<String>,
43
44 #[serde(default)]
46 pub tenant: Option<String>,
47
48 #[serde(default)]
50 #[schema(example = "example.com")]
51 pub domain: Option<String>,
52
53 #[serde(default)]
55 pub routing_domain: Option<String>,
56
57 #[schema(example = "Scaling down")]
61 pub reason: String,
62
63 #[serde(default, skip_serializing_if = "Vec::is_empty")]
67 pub queue_names: Vec<String>,
68
69 #[serde(flatten)]
70 pub protocol: XferProtocol,
71}
72
73#[derive(Serialize, Deserialize, Debug, ToSchema, ToResponse)]
74pub struct XferV1Response {}
75
76#[derive(Serialize, Deserialize, Debug, ToSchema)]
77pub struct XferCancelV1Request {
78 pub queue_name: String,
80
81 #[schema(example = "Scaling down")]
85 pub reason: String,
86}
87
88#[derive(Serialize, Deserialize, Debug, ToSchema, ToResponse)]
89pub struct XferCancelV1Response {}