use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use uuid::Uuid;
pub const JOIN_REQUEST_SUBMIT_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/submit/1.0";
pub const JOIN_REQUEST_SUBMIT_RESPONSE_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/submit/1.0#response";
pub const JOIN_REQUEST_SUBMIT_RECEIPT_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/submit-receipt/1.0";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestSubmitReceiptBody {
pub request_id: Uuid,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestSubmitBody {
pub vp: JsonValue,
#[serde(default)]
pub registry_consent: bool,
#[serde(default)]
pub extensions: JsonValue,
}
pub const JOIN_REQUEST_ACCEPT_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/accept/1.0";
pub const JOIN_REQUEST_ACCEPT_RESPONSE_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/accept/1.0#response";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestAcceptBody {
pub request_id: Uuid,
pub vmc_id: String,
pub vc: JsonValue,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestAcceptReceiptBody {
pub request_id: Uuid,
pub status: String,
pub reciprocal_vc_id: String,
}
pub const JOIN_REQUEST_MANIFEST_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/manifest/1.0";
pub const JOIN_REQUEST_MANIFEST_RESPONSE_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/manifest/1.0#response";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct ManifestCriterion {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub presentation_definition: JsonValue,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestManifestResponseBody {
pub community_did: String,
pub criteria: Vec<ManifestCriterion>,
}
pub const JOIN_REQUEST_STATUS_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/status/1.0";
pub const JOIN_REQUEST_STATUS_RESPONSE_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/spec/join-requests/status/1.0#response";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestStatusBody {
pub request_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct JoinRequestStatusResponseBody {
pub request_id: Uuid,
pub status: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub needs: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub presentation_definition: Option<JsonValue>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub enum VerdictEffect {
Allow,
Deny,
Refer,
RequestMore,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct VerdictWith {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub obligations: Option<JsonValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vmc: Option<JsonValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub role_vec: Option<JsonValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bundle_ref: Option<JsonValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub queue: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub needs: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub presentation_definition: Option<JsonValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct Verdict {
pub effect: VerdictEffect,
pub with: VerdictWith,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct VerdictResponse {
pub request_id: Uuid,
pub verdict: Verdict,
}
impl VerdictResponse {
pub fn allow(
request_id: Uuid,
role: Option<String>,
vmc: Option<JsonValue>,
role_vec: Option<JsonValue>,
) -> Self {
Self {
request_id,
verdict: Verdict {
effect: VerdictEffect::Allow,
with: VerdictWith {
role,
vmc,
role_vec,
..Default::default()
},
},
}
}
pub fn refer(request_id: Uuid, queue: impl Into<String>, reason: impl Into<String>) -> Self {
Self {
request_id,
verdict: Verdict {
effect: VerdictEffect::Refer,
with: VerdictWith {
queue: Some(queue.into()),
reason: Some(reason.into()),
..Default::default()
},
},
}
}
}
pub const MEMBER_SELF_REMOVE_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/members/self-remove/1.0";
pub const MEMBER_SELF_REMOVE_RECEIPT_TYPE: &str =
"https://trusttasks.org/openvtc/vtc/members/self-remove-receipt/1.0";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct SelfRemoveBody {
#[serde(default)]
pub disposition: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct SelfRemoveReceiptBody {
pub did: String,
pub disposition: String,
pub removed: bool,
}