use serde::{Deserialize, Serialize};
use crate::{RecordStatus, Visibility};
pub const ROOMS_CREATE_TYPE: &str = "https://trusttasks.org/spec/rooms/create/0.1";
pub const ROOMS_RECORDS_PUT_TYPE: &str = "https://trusttasks.org/spec/rooms/records/put/0.1";
pub const ROOMS_RECORDS_GET_TYPE: &str = "https://trusttasks.org/spec/rooms/records/get/0.1";
pub const ROOMS_RECORDS_LIST_TYPE: &str = "https://trusttasks.org/spec/rooms/records/list/0.1";
pub const ROOMS_EPOCH_MINT_TYPE: &str = "https://trusttasks.org/spec/rooms/epoch/mint/0.1";
pub const ROOMS_OWNER_TRANSFER_TYPE: &str = "https://trusttasks.org/spec/rooms/owner/transfer/0.1";
pub const ROOMS_OWNER_CLAIM_TYPE: &str = "https://trusttasks.org/spec/rooms/owner/claim/0.1";
pub const ROOMS_RECORDS_CURATE_TYPE: &str = "https://trusttasks.org/spec/rooms/records/curate/0.1";
pub const ROOMS_DISPATCHED_URIS: &[&str] = &[
ROOMS_CREATE_TYPE,
ROOMS_RECORDS_PUT_TYPE,
ROOMS_RECORDS_GET_TYPE,
ROOMS_RECORDS_LIST_TYPE,
ROOMS_EPOCH_MINT_TYPE,
ROOMS_RECORDS_CURATE_TYPE,
ROOMS_OWNER_TRANSFER_TYPE,
ROOMS_OWNER_CLAIM_TYPE,
];
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct AuthorityPresentation {
pub membership: String,
pub authority: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject_binding: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct SealedContent {
pub ciphertext: String,
pub nonce: String,
pub epoch: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct EpochLink {
pub epoch: u32,
pub wrapped: String,
pub nonce: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CleartextContent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub body: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CreateRoomBody {
pub room_id: String,
pub visibility: Visibility,
pub owner_did: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub retention_days: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateRoomResponse {
pub room_id: String,
pub epoch: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct PutRecordBody {
pub room_id: String,
pub key: String,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expected_version: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sealed: Option<SealedContent>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cleartext: Option<CleartextContent>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PutRecordResponse {
pub key: String,
pub version: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub epoch: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetRecordBody {
pub room_id: String,
pub key: String,
pub presentation: AuthorityPresentation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ListRecordsBody {
pub room_id: String,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub since_version: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListRecordsResponse {
pub records: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CurateRecordBody {
pub room_id: String,
pub key: String,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<RecordStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pinned: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expected_version: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CurateRecordResponse {
pub key: String,
pub version: u64,
pub status: RecordStatus,
pub pinned: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct TransferOwnerBody {
pub room_id: String,
pub new_owner_did: String,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ClaimOwnerBody {
pub room_id: String,
pub nomination: String,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OwnerResponse {
pub room_id: String,
pub owner_did: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct MintEpochBody {
pub room_id: String,
pub epoch: u32,
pub presentation: AuthorityPresentation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MintEpochResponse {
pub room_id: String,
pub epoch: u32,
}