1use serde::{Deserialize, Serialize};
2use time::OffsetDateTime;
3
4use crate::serde_utils;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct TopicAuthor {
9 #[serde(default)]
11 pub member_id: String,
12 #[serde(default)]
14 pub name: String,
15 #[serde(default)]
17 pub avatar: String,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct TopicImage {
23 #[serde(default)]
25 pub url: String,
26 #[serde(default)]
28 pub sm: String,
29 #[serde(default)]
31 pub lg: String,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct OwnedTopic {
37 pub id: String,
39 #[serde(default)]
41 pub title: String,
42 #[serde(default)]
44 pub description: String,
45 #[serde(default)]
47 pub body: String,
48 pub author: TopicAuthor,
50 #[serde(default)]
52 pub tickers: Vec<String>,
53 #[serde(default)]
55 pub hashtags: Vec<String>,
56 #[serde(default)]
58 pub images: Vec<TopicImage>,
59 #[serde(default)]
61 pub likes_count: i32,
62 #[serde(default)]
64 pub comments_count: i32,
65 #[serde(default)]
67 pub views_count: i32,
68 #[serde(default)]
70 pub shares_count: i32,
71 #[serde(default)]
73 pub topic_type: String,
74 #[serde(default)]
76 pub detail_url: String,
77 #[serde(
79 serialize_with = "time::serde::rfc3339::serialize",
80 deserialize_with = "serde_utils::timestamp::deserialize"
81 )]
82 pub created_at: OffsetDateTime,
83 #[serde(
85 serialize_with = "time::serde::rfc3339::serialize",
86 deserialize_with = "serde_utils::timestamp::deserialize"
87 )]
88 pub updated_at: OffsetDateTime,
89}
90
91#[derive(Debug, Default, Clone, Serialize)]
93pub struct MyTopicsOptions {
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub page: Option<i32>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub size: Option<i32>,
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub topic_type: Option<String>,
103}
104
105#[derive(Debug, Clone, Serialize)]
107pub struct CreateTopicOptions {
108 pub title: String,
110 pub body: String,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub topic_type: Option<String>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub tickers: Option<Vec<String>>,
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub hashtags: Option<Vec<String>>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct TopicItem {
126 pub id: String,
128 #[serde(default)]
130 pub title: String,
131 #[serde(default)]
133 pub description: String,
134 pub url: String,
136 #[serde(
138 serialize_with = "time::serde::rfc3339::serialize",
139 deserialize_with = "serde_utils::timestamp::deserialize"
140 )]
141 pub published_at: OffsetDateTime,
142 pub comments_count: i32,
144 pub likes_count: i32,
146 pub shares_count: i32,
148}
149
150#[derive(Debug, Default, Clone, Serialize)]
152pub struct ListTopicRepliesOptions {
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub page: Option<i32>,
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub size: Option<i32>,
159}
160
161#[derive(Debug, Clone, Serialize)]
163pub struct CreateReplyOptions {
164 pub body: String,
171 #[serde(skip_serializing_if = "Option::is_none")]
173 pub reply_to_id: Option<String>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize)]
178pub struct TopicReply {
179 pub id: String,
181 pub topic_id: String,
183 #[serde(default)]
185 pub body: String,
186 #[serde(default)]
188 pub reply_to_id: String,
189 pub author: TopicAuthor,
191 #[serde(default)]
193 pub images: Vec<TopicImage>,
194 #[serde(default)]
196 pub likes_count: i32,
197 #[serde(default)]
199 pub comments_count: i32,
200 #[serde(
202 serialize_with = "time::serde::rfc3339::serialize",
203 deserialize_with = "serde_utils::timestamp::deserialize"
204 )]
205 pub created_at: OffsetDateTime,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct NewsItem {
211 pub id: String,
213 #[serde(default)]
215 pub title: String,
216 #[serde(default)]
218 pub description: String,
219 pub url: String,
221 #[serde(
223 serialize_with = "time::serde::rfc3339::serialize",
224 deserialize_with = "serde_utils::timestamp::deserialize"
225 )]
226 pub published_at: OffsetDateTime,
227 pub comments_count: i32,
229 pub likes_count: i32,
231 pub shares_count: i32,
233}