use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use derive_builder::Builder;
use crate::api::metadata::{PinMetadata, PinListMetadata, MetadataKeyValues, MetadataValue};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum Region {
FRA1,
NYC1,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RegionPolicy {
pub id: Region,
pub desired_replication_count: u8,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct PinPolicy {
pub regions: Vec<RegionPolicy>,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct HashPinPolicy {
ipfs_pin_hash: String,
new_pin_policy: PinPolicy,
}
impl HashPinPolicy {
pub fn new<S>(ipfs_pin_hash: S, regions: Vec<RegionPolicy>) -> HashPinPolicy
where S: Into<String>
{
HashPinPolicy {
ipfs_pin_hash: ipfs_pin_hash.into(),
new_pin_policy: PinPolicy { regions },
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum JobStatus {
Prechecking,
Searching,
Retrieving,
Expired,
OverFreeLimit,
OverMaxSize,
InvalidObject,
BadHostNode,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct PinByHashResult {
pub id: String,
pub ipfs_hash: String,
pub status: JobStatus,
pub name: Option<String>,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PinOptions {
pub host_nodes: Option<Vec<String>>,
pub custom_pin_policy: Option<PinPolicy>,
pub cid_version: Option<u8>,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PinByHash {
hash_to_pin: String,
pinata_metadata: Option<PinMetadata>,
pinata_option: Option<PinOptions>,
}
impl PinByHash {
pub fn new<S>(hash: S) -> PinByHash
where S: Into<String>
{
PinByHash {
hash_to_pin: hash.into(),
pinata_metadata: None,
pinata_option: None,
}
}
pub fn set_metadata(self, keyvalues: MetadataKeyValues) -> PinByHash {
PinByHash {
hash_to_pin: self.hash_to_pin,
pinata_metadata: Some(PinMetadata {
keyvalues,
name: None,
}),
pinata_option: self.pinata_option,
}
}
pub fn set_metadata_with_name<S>(self, name: S, keyvalues: HashMap<String, MetadataValue>) -> PinByHash
where S: Into<String>
{
PinByHash {
hash_to_pin: self.hash_to_pin,
pinata_metadata: Some(PinMetadata {
keyvalues,
name: Some(name.into()),
}),
pinata_option: self.pinata_option,
}
}
pub fn set_options(self, options: PinOptions) -> PinByHash {
PinByHash {
hash_to_pin: self.hash_to_pin,
pinata_metadata: self.pinata_metadata,
pinata_option: Some(options),
}
}
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PinByJson<S: Serialize> {
pinata_content: S,
pinata_metadata: Option<PinMetadata>,
pinata_option: Option<PinOptions>,
}
impl <S> PinByJson<S>
where S: Serialize
{
pub fn new(json_data: S) -> PinByJson<S> {
PinByJson {
pinata_content: json_data,
pinata_metadata: None,
pinata_option: None,
}
}
pub fn set_metadata(mut self, keyvalues: MetadataKeyValues) -> PinByJson<S> {
self.pinata_metadata = Some(PinMetadata {
name: None,
keyvalues,
});
self
}
pub fn set_metadata_with_name<IntoStr>(
mut self, name: IntoStr,
keyvalues: MetadataKeyValues
) -> PinByJson<S>
where IntoStr: Into<String>
{
self.pinata_metadata = Some(PinMetadata {
name: Some(name.into()),
keyvalues,
});
self
}
pub fn set_options(mut self, options: PinOptions) -> PinByJson<S> {
self.pinata_option = Some(options);
self
}
}
#[derive(Clone)]
pub(crate) struct FileData {
pub(crate) file_path: String,
}
pub struct PinByFile {
pub(crate) files: Vec<FileData>,
pub(crate) pinata_metadata: Option<PinMetadata>,
pub(crate) pinata_option: Option<PinOptions>,
}
impl PinByFile {
pub fn new<S: Into<String>>(file_or_dir_path: S) -> PinByFile {
let owned_file_path = file_or_dir_path.into();
PinByFile {
files: [
FileData { file_path: owned_file_path }
].to_vec(),
pinata_metadata: None,
pinata_option: None,
}
}
pub fn set_metadata(mut self, keyvalues: MetadataKeyValues) -> PinByFile {
self.pinata_metadata = Some(PinMetadata {
name: None,
keyvalues,
});
self
}
pub fn set_metadata_with_name<IntoStr>(
mut self, name: IntoStr,
keyvalues: MetadataKeyValues
) -> PinByFile
where IntoStr: Into<String>
{
self.pinata_metadata = Some(PinMetadata {
name: Some(name.into()),
keyvalues,
});
self
}
pub fn set_options(mut self, options: PinOptions) -> PinByFile {
self.pinata_option = Some(options);
self
}
}
#[derive(Clone, Serialize)]
pub enum SortDirection {
ASC,
DESC,
}
#[derive(Builder, Clone, Default, Serialize)]
#[builder(setter(into, strip_option, prefix = "set"), default)]
pub struct PinJobsFilter {
sort: Option<SortDirection>,
status: Option<JobStatus>,
ipfs_pin_hash: Option<String>,
limit: Option<u16>,
offset: Option<u64>,
}
#[derive(Debug, Deserialize)]
pub struct PinJob {
pub id: String,
pub ipfs_pin_hash: String,
pub date_queued: String,
pub status: JobStatus,
pub name: Option<String>,
pub keyvalues: Option<HashMap<String, String>>,
pub host_nodes: Option<Vec<String>>,
pub pin_policy: Option<PinPolicy>,
}
#[derive(Debug, Deserialize)]
pub struct PinJobs {
pub count: u64,
pub rows: Vec<PinJob>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct PinnedObject {
pub ipfs_hash: String,
pub pin_size: u64,
pub timestamp: String
}
#[derive(Debug, Deserialize)]
pub struct TotalPinnedData {
pub pin_count: u128,
pub pin_size_total: String,
pub pin_size_with_replications_total: String,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum PinListFilterStatus {
All,
Pinned,
Unpinned,
}
#[derive(Builder, Default, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(setter(strip_option, prefix = "set"), default)]
pub struct PinListFilter {
#[serde(skip_serializing_if = "Option::is_none")]
hash_contains: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pin_start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pin_end: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
unpin_start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
unpin_end: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pin_size_min: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pin_size_max: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
status: Option<PinListFilterStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
metadata: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
page_limit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
page_offset: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PinListItemRegionPolicy {
pub region_id: Region,
pub desired_replication_count: u8,
pub current_replication_count: u8,
}
#[derive(Debug, Deserialize)]
pub struct PinListItem {
pub id: String,
pub ipfs_pin_hash: String,
pub size: usize,
pub user_id: String,
pub date_pinned: String,
pub data_unpinned: Option<String>,
pub metadata: PinListMetadata,
pub regions: Vec<PinListItemRegionPolicy>,
}
#[derive(Debug, Deserialize)]
pub struct PinList {
pub count: u128,
pub rows: Vec<PinListItem>,
}