use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::serde_utils;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicAuthor {
#[serde(default)]
pub member_id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub avatar: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicImage {
#[serde(default)]
pub url: String,
#[serde(default)]
pub sm: String,
#[serde(default)]
pub lg: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OwnedTopic {
pub id: String,
#[serde(default)]
pub title: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub body: String,
pub author: TopicAuthor,
#[serde(default)]
pub tickers: Vec<String>,
#[serde(default)]
pub hashtags: Vec<String>,
#[serde(default)]
pub images: Vec<TopicImage>,
#[serde(default)]
pub likes_count: i32,
#[serde(default)]
pub comments_count: i32,
#[serde(default)]
pub views_count: i32,
#[serde(default)]
pub shares_count: i32,
#[serde(default)]
pub topic_type: String,
#[serde(default)]
pub detail_url: String,
#[serde(
serialize_with = "time::serde::rfc3339::serialize",
deserialize_with = "serde_utils::timestamp::deserialize"
)]
pub created_at: OffsetDateTime,
#[serde(
serialize_with = "time::serde::rfc3339::serialize",
deserialize_with = "serde_utils::timestamp::deserialize"
)]
pub updated_at: OffsetDateTime,
}
#[derive(Debug, Default, Clone, Serialize)]
pub struct MyTopicsOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub topic_type: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateTopicOptions {
pub title: String,
pub body: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub topic_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tickers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hashtags: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicItem {
pub id: String,
#[serde(default)]
pub title: String,
#[serde(default)]
pub description: String,
pub url: String,
#[serde(
serialize_with = "time::serde::rfc3339::serialize",
deserialize_with = "serde_utils::timestamp::deserialize"
)]
pub published_at: OffsetDateTime,
pub comments_count: i32,
pub likes_count: i32,
pub shares_count: i32,
}
#[derive(Debug, Default, Clone, Serialize)]
pub struct ListTopicRepliesOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i32>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateReplyOptions {
pub body: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopicReply {
pub id: String,
pub topic_id: String,
#[serde(default)]
pub body: String,
#[serde(default)]
pub reply_to_id: String,
pub author: TopicAuthor,
#[serde(default)]
pub images: Vec<TopicImage>,
#[serde(default)]
pub likes_count: i32,
#[serde(default)]
pub comments_count: i32,
#[serde(
serialize_with = "time::serde::rfc3339::serialize",
deserialize_with = "serde_utils::timestamp::deserialize"
)]
pub created_at: OffsetDateTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewsItem {
pub id: String,
#[serde(default)]
pub title: String,
#[serde(default)]
pub description: String,
pub url: String,
#[serde(
serialize_with = "time::serde::rfc3339::serialize",
deserialize_with = "serde_utils::timestamp::deserialize"
)]
pub published_at: OffsetDateTime,
pub comments_count: i32,
pub likes_count: i32,
pub shares_count: i32,
}