use std::borrow::Cow;
use derive_builder::Builder;
use reqwest::multipart::Form;
use reqwest::multipart::Part;
use reqwest::Method;
use serde::Serialize;
use uuid::Uuid;
use crate::common::Endpoint;
use crate::schema::{cover::*, NoData};
use crate::Client;
use crate::Result;
#[derive(Debug, Serialize, Clone, Builder, Default)]
#[builder(default, setter(strip_option))]
pub struct ListCovers<'a> {
pub limit: Option<i32>,
pub offset: Option<i32>,
#[builder(setter(each = "add_manga"))]
pub manga: Vec<&'a Uuid>,
#[serde(rename = "ids")]
#[builder(setter(each = "add_cover"))]
pub covers: Vec<&'a Uuid>,
#[builder(setter(each = "add_uploader"))]
pub uploaders: Vec<&'a Uuid>,
pub order: Option<CoverOrder>,
}
impl_endpoint! {
GET "/cover",
#[query] ListCovers<'_>,
CoverList
}
#[derive(Debug, Clone)]
pub struct GetCover<'a> {
pub cover_id: &'a Uuid,
}
impl_endpoint! {
GET ("/cover/{:x}", cover_id),
#[no_data] GetCover<'_>,
#[flatten_result] CoverResponse
}
#[derive(Debug, Serialize, Clone)]
pub struct EditCover<'a> {
#[serde(skip)]
pub cover_id: &'a Uuid,
pub volume: Option<&'a str>,
pub description: Option<&'a str>,
pub version: i32,
}
impl_endpoint! {
PUT ("/cover/{:x}", cover_id),
#[body auth] EditCover<'_>,
#[flatten_result] CoverResponse
}
pub struct DeleteCover<'a> {
pub cover_id: &'a Uuid,
}
impl_endpoint! {
DELETE ("/cover/{:x}", cover_id),
#[no_data auth] DeleteCover<'_>,
#[discard_result] Result<NoData>
}
pub struct UploadCover<'a> {
pub manga_id: &'a Uuid,
pub image_bytes: Cow<'static, [u8]>,
}
impl Endpoint for UploadCover<'_> {
type Query = ();
type Body = ();
type Response = CoverResponse;
fn path(&self) -> Cow<str> {
Cow::Owned(format!("/cover/{:x}", self.manga_id))
}
fn method(&self) -> Method {
Method::POST
}
fn require_auth(&self) -> bool {
true
}
fn multipart(&self) -> Option<Form> {
let part = Part::bytes(self.image_bytes.clone());
Some(Form::new().part("file", part))
}
}
impl UploadCover<'_> {
pub async fn send(&self, client: &Client) -> CoverResponse {
client.send_request(self).await?
}
}