use chrono::{DateTime, Utc};
use derive_more::Display;
use paperless_api_macros::Item;
use serde::{Deserialize, Serialize};
use crate::{
PaperlessClient,
dto::{CreateDto, UpdateDto},
id::{DocumentId, ShareLinkBundleId},
share_link::ShareLinkFileVersion,
};
#[derive(Debug, Clone, Deserialize, Serialize, Item)]
pub struct ShareLinkBundle {
pub id: crate::id::ShareLinkBundleId,
pub documents: Vec<DocumentId>,
pub file_version: ShareLinkFileVersion,
pub slug: String,
pub created: DateTime<Utc>,
pub built_at: DateTime<Utc>,
pub expiration: DateTime<Utc>,
pub size_bytes: u32,
pub document_count: u32,
pub status: ShareLinkBundleStatus,
}
#[derive(Debug, Clone, Serialize)]
pub struct ShareLinkBundleDto {
pub expiration_days: u16,
pub file_version: ShareLinkFileVersion,
pub document_ids: Vec<DocumentId>,
}
impl CreateDto for ShareLinkBundle {
type Id = ShareLinkBundleId;
type BaseType = ShareLinkBundle;
}
impl UpdateDto for ShareLinkBundle {
type Id = ShareLinkBundleId;
type BaseType = ShareLinkBundle;
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ShareLinkBundleStatus {
Pending,
Processing,
Ready,
Failed,
}
impl ShareLinkBundle {
#[must_use]
pub fn url(&self, client: &PaperlessClient) -> String {
format!("{}/share/{}", client.base_url, self.slug)
}
}