use chrono::{DateTime, Utc};
use derive_builder::Builder;
use serde::Serialize;
use uuid::Uuid;
use crate::schema::{chapter::*, LanguageCode, NoData};
use crate::Result;
#[derive(Debug, Serialize, Clone, Builder, Default)]
#[serde(rename_all = "camelCase")]
#[builder(setter(strip_option), default)]
pub struct ListChapters<'a> {
pub limit: Option<i32>,
pub offset: Option<i32>,
#[serde(rename = "ids")]
#[builder(setter(each = "add_chapter"))]
pub chapter_ids: Vec<&'a Uuid>,
pub title: Option<&'a str>,
#[builder(setter(each = "add_group"))]
pub groups: Vec<&'a Uuid>,
pub uploader: Option<&'a Uuid>,
pub manga: Option<&'a Uuid>,
pub volume: Option<&'a str>,
pub chapter: Option<&'a str>,
pub translated_language: Option<LanguageCode>,
pub created_at_since: Option<DateTime<Utc>>,
pub updated_at_since: Option<DateTime<Utc>>,
pub publish_at_since: Option<DateTime<Utc>>,
pub order: Option<ChapterOrder>,
}
impl_endpoint! {
GET "/chapter",
#[query] ListChapters<'_>,
ChapterList
}
#[derive(Debug, Clone)]
pub struct GetChapter<'a> {
pub chapter_id: &'a Uuid,
}
impl_endpoint! {
GET ("/chapter/{:x}", chapter_id),
#[no_data] GetChapter<'_>,
#[flatten_result] ChapterResponse
}
#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct UpdateChapter<'a> {
#[serde(skip)]
pub chapter_id: &'a Uuid,
pub title: &'a str,
pub volume: Option<&'a str>,
pub chapter: Option<&'a str>,
pub translated_language: LanguageCode,
pub data: Vec<&'a str>,
pub data_saver: Vec<&'a str>,
pub version: i32,
}
impl_endpoint! {
PUT ("/chapter/{:x}", chapter_id),
#[body auth] UpdateChapter<'_>,
#[flatten_result] ChapterResponse
}
#[derive(Debug, Clone)]
pub struct DeleteChapter<'a> {
chapter_id: &'a Uuid,
}
impl_endpoint! {
DELETE ("/chapter/{:x}", chapter_id),
#[no_data auth] DeleteChapter<'_>,
#[discard_result] Result<NoData>
}
#[derive(Debug, Clone)]
pub struct MarkChapterRead<'a> {
chapter_id: &'a Uuid,
}
impl_endpoint! {
POST ("/chapter/{:x}/read", chapter_id),
#[no_data auth] MarkChapterRead<'_>,
#[discard_result] Result<NoData>
}
#[derive(Debug, Clone)]
pub struct MarkChapterUnread<'a> {
chapter_id: &'a Uuid,
}
impl_endpoint! {
DELETE ("/chapter/{:x}/read", chapter_id),
#[no_data auth] MarkChapterUnread<'_>,
#[discard_result] Result<NoData>
}