1use crate::{formatting::Formatting, timestamps::Timestamp};
2use base64uuid::Base64Uuid;
3#[cfg(feature = "fp-bindgen")]
4use fp_bindgen::prelude::Serializable;
5use serde::{Deserialize, Serialize};
6use time::OffsetDateTime;
7use typed_builder::TypedBuilder;
8
9#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
10#[cfg_attr(
11 feature = "fp-bindgen",
12 derive(Serializable),
13 fp(rust_module = "fiberplane_models::comments")
14)]
15#[non_exhaustive]
16#[serde(rename_all = "camelCase")]
17pub struct Thread {
18 #[builder(setter(into))]
19 pub id: Base64Uuid,
20
21 #[builder(default)]
22 pub items: Vec<ThreadItem>,
23 pub status: ThreadStatus,
24 pub created_by: UserSummary,
25
26 #[builder(setter(into))]
27 pub created_at: Timestamp,
28
29 #[builder(setter(into))]
30 pub updated_at: Timestamp,
31}
32
33#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, Serialize)]
34#[cfg_attr(
35 feature = "fp-bindgen",
36 derive(Serializable),
37 fp(rust_module = "fiberplane_models::comments")
38)]
39#[non_exhaustive]
40#[serde(rename_all = "snake_case")]
41pub enum ThreadStatus {
42 Open,
43 Resolved,
44}
45
46#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
47#[cfg_attr(
48 feature = "fp-bindgen",
49 derive(Serializable),
50 fp(rust_module = "fiberplane_models::comments")
51)]
52#[non_exhaustive]
53#[serde(rename_all = "camelCase")]
54pub struct ThreadSummary {
55 #[builder(setter(into))]
56 pub id: Base64Uuid,
57
58 pub item_count: u32,
59
60 #[builder(default, setter(strip_option))]
61 pub first_item: Option<ThreadItem>,
62
63 #[builder(default)]
65 #[serde(default)]
66 pub recent_items: Vec<ThreadItem>,
67
68 pub status: ThreadStatus,
69
70 pub created_by: UserSummary,
71
72 #[builder(setter(into))]
73 pub created_at: Timestamp,
74
75 #[builder(setter(into))]
76 pub updated_at: Timestamp,
77}
78
79#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
80#[cfg_attr(
81 feature = "fp-bindgen",
82 derive(Serializable),
83 fp(rust_module = "fiberplane_models::comments")
84)]
85#[non_exhaustive]
86#[serde(tag = "type", rename_all = "snake_case")]
87pub enum ThreadItem {
88 Comment(Comment),
89 StatusChange(ThreadStatusChange),
90 CommentDelete(CommentDelete),
91}
92
93impl ThreadItem {
94 pub fn id(&self) -> Base64Uuid {
95 match self {
96 ThreadItem::Comment(item) => item.id,
97 ThreadItem::StatusChange(item) => item.id,
98 ThreadItem::CommentDelete(item) => item.id,
99 }
100 }
101
102 pub fn created_at(&self) -> &OffsetDateTime {
103 match self {
104 ThreadItem::Comment(item) => &item.created_at,
105 ThreadItem::StatusChange(item) => &item.created_at,
106 ThreadItem::CommentDelete(item) => &item.created_at,
107 }
108 }
109}
110
111#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
112#[cfg_attr(
113 feature = "fp-bindgen",
114 derive(Serializable),
115 fp(rust_module = "fiberplane_models::comments")
116)]
117#[non_exhaustive]
118#[serde(rename_all = "camelCase")]
119pub struct ThreadStatusChange {
120 #[builder(setter(into))]
121 pub id: Base64Uuid,
122
123 pub status: ThreadStatus,
124
125 pub created_by: UserSummary,
126
127 #[builder(setter(into))]
128 pub created_at: Timestamp,
129}
130
131#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
132#[cfg_attr(
133 feature = "fp-bindgen",
134 derive(Serializable),
135 fp(rust_module = "fiberplane_models::comments")
136)]
137#[non_exhaustive]
138#[serde(rename_all = "camelCase")]
139pub struct CommentDelete {
140 #[builder(setter(into))]
141 pub id: Base64Uuid,
142
143 pub created_by: UserSummary,
144
145 #[builder(setter(into))]
147 pub created_at: Timestamp,
148
149 #[builder(setter(into))]
150 pub deleted_at: Timestamp,
151}
152
153#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
154#[cfg_attr(
155 feature = "fp-bindgen",
156 derive(Serializable),
157 fp(rust_module = "fiberplane_models::comments")
158)]
159#[non_exhaustive]
160#[serde(rename_all = "camelCase")]
161pub struct Comment {
162 #[builder(setter(into))]
163 pub id: Base64Uuid,
164
165 pub created_by: UserSummary,
166
167 #[builder(setter(into))]
168 pub content: String, #[builder(default)]
171 pub formatting: Formatting,
172
173 #[builder(setter(into))]
174 pub created_at: Timestamp,
175
176 #[builder(setter(into))]
177 pub updated_at: Timestamp,
178}
179
180#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
181#[cfg_attr(
182 feature = "fp-bindgen",
183 derive(Serializable),
184 fp(rust_module = "fiberplane_models::comments")
185)]
186#[non_exhaustive]
187#[serde(rename_all = "camelCase")]
188pub struct UserSummary {
189 #[builder(setter(into))]
190 pub id: String,
191
192 #[builder(setter(into))]
193 pub name: String,
194}
195
196#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
197#[cfg_attr(
198 feature = "fp-bindgen",
199 derive(Serializable),
200 fp(rust_module = "fiberplane_models::comments")
201)]
202#[non_exhaustive]
203#[serde(rename_all = "camelCase")]
204pub struct NewComment {
205 #[builder(default, setter(into, strip_option))]
206 pub id: Option<Base64Uuid>,
207
208 #[builder(setter(into))]
209 pub content: String,
210
211 #[builder(default)]
212 #[serde(default)]
213 pub formatting: Formatting,
214}
215
216#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
217#[cfg_attr(
218 feature = "fp-bindgen",
219 derive(Serializable),
220 fp(rust_module = "fiberplane_models::comments")
221)]
222#[non_exhaustive]
223#[serde(rename_all = "camelCase")]
224pub struct UpdateComment {
225 #[builder(setter(into))]
226 pub content: String,
227
228 #[builder(default)]
229 #[serde(default)]
230 pub formatting: Formatting,
231}
232
233#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
234#[cfg_attr(
235 feature = "fp-bindgen",
236 derive(Serializable),
237 fp(rust_module = "fiberplane_models::comments")
238)]
239#[non_exhaustive]
240#[serde(rename_all = "camelCase")]
241pub struct NewThread {
242 #[builder(default, setter(into, strip_option))]
243 pub id: Option<Base64Uuid>,
244
245 #[builder(default, setter(into, strip_option))]
246 pub referenced_cell_id: Option<Base64Uuid>,
247
248 #[builder(default, setter(strip_option))]
249 pub comment: Option<NewComment>,
250}