Skip to main content

fiberplane_models/
comments.rs

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    /// These are sorted in chronological order so the last one is the most recent.
64    #[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    /// Timestamp when the original comment was created.
146    #[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, // limit of 2048 characters
169
170    #[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}