fiberplane_models/
comments.rs

1use crate::formatting::Formatting;
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    pub id: Base64Uuid,
19    #[builder(default)]
20    pub items: Vec<ThreadItem>,
21    pub status: ThreadStatus,
22    pub created_by: UserSummary,
23    #[serde(with = "time::serde::rfc3339")]
24    pub created_at: OffsetDateTime,
25    #[serde(with = "time::serde::rfc3339")]
26    pub updated_at: OffsetDateTime,
27}
28
29#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, Serialize)]
30#[cfg_attr(
31    feature = "fp-bindgen",
32    derive(Serializable),
33    fp(rust_module = "fiberplane_models::comments")
34)]
35#[non_exhaustive]
36#[serde(rename_all = "snake_case")]
37pub enum ThreadStatus {
38    Open,
39    Resolved,
40}
41
42#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
43#[cfg_attr(
44    feature = "fp-bindgen",
45    derive(Serializable),
46    fp(rust_module = "fiberplane_models::comments")
47)]
48#[non_exhaustive]
49#[serde(rename_all = "camelCase")]
50pub struct ThreadSummary {
51    pub id: Base64Uuid,
52    pub item_count: u32,
53    pub first_item: Option<ThreadItem>,
54    /// These are sorted in chronological order so the last one is the most recent.
55    #[serde(default)]
56    pub recent_items: Vec<ThreadItem>,
57    pub status: ThreadStatus,
58    pub created_by: UserSummary,
59    #[serde(with = "time::serde::rfc3339")]
60    pub created_at: OffsetDateTime,
61    #[serde(with = "time::serde::rfc3339")]
62    pub updated_at: OffsetDateTime,
63}
64
65#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
66#[cfg_attr(
67    feature = "fp-bindgen",
68    derive(Serializable),
69    fp(rust_module = "fiberplane_models::comments")
70)]
71#[non_exhaustive]
72#[serde(tag = "type", rename_all = "snake_case")]
73pub enum ThreadItem {
74    Comment(Comment),
75    StatusChange(ThreadStatusChange),
76    CommentDelete(CommentDelete),
77}
78
79impl ThreadItem {
80    pub fn id(&self) -> Base64Uuid {
81        match self {
82            ThreadItem::Comment(item) => item.id,
83            ThreadItem::StatusChange(item) => item.id,
84            ThreadItem::CommentDelete(item) => item.id,
85        }
86    }
87
88    pub fn created_at(&self) -> &OffsetDateTime {
89        match self {
90            ThreadItem::Comment(item) => &item.created_at,
91            ThreadItem::StatusChange(item) => &item.created_at,
92            ThreadItem::CommentDelete(item) => &item.created_at,
93        }
94    }
95}
96
97#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
98#[cfg_attr(
99    feature = "fp-bindgen",
100    derive(Serializable),
101    fp(rust_module = "fiberplane_models::comments")
102)]
103#[non_exhaustive]
104#[serde(rename_all = "camelCase")]
105pub struct ThreadStatusChange {
106    pub id: Base64Uuid,
107    pub status: ThreadStatus,
108    pub created_by: UserSummary,
109    #[serde(with = "time::serde::rfc3339")]
110    pub created_at: OffsetDateTime,
111}
112
113#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
114#[cfg_attr(
115    feature = "fp-bindgen",
116    derive(Serializable),
117    fp(rust_module = "fiberplane_models::comments")
118)]
119#[non_exhaustive]
120#[serde(rename_all = "camelCase")]
121pub struct CommentDelete {
122    pub id: Base64Uuid,
123    pub created_by: UserSummary,
124    /// Timestamp when the original comment was created
125    #[serde(with = "time::serde::rfc3339")]
126    pub created_at: OffsetDateTime,
127    #[serde(with = "time::serde::rfc3339")]
128    pub deleted_at: OffsetDateTime,
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 Comment {
140    pub id: Base64Uuid,
141    pub created_by: UserSummary,
142    #[builder(setter(into))]
143    pub content: String, // limit of 2048 characters
144    #[builder(default)]
145    pub formatting: Formatting,
146    #[builder(setter(into))]
147    #[serde(with = "time::serde::rfc3339")]
148    pub created_at: OffsetDateTime,
149    #[builder(setter(into))]
150    #[serde(with = "time::serde::rfc3339")]
151    pub updated_at: OffsetDateTime,
152}
153
154#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
155#[cfg_attr(
156    feature = "fp-bindgen",
157    derive(Serializable),
158    fp(rust_module = "fiberplane_models::comments")
159)]
160#[non_exhaustive]
161#[serde(rename_all = "camelCase")]
162pub struct UserSummary {
163    #[builder(setter(into))]
164    pub id: String,
165    #[builder(setter(into))]
166    pub name: String,
167}
168
169#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
170#[cfg_attr(
171    feature = "fp-bindgen",
172    derive(Serializable),
173    fp(rust_module = "fiberplane_models::comments")
174)]
175#[non_exhaustive]
176#[serde(rename_all = "camelCase")]
177pub struct NewComment {
178    #[builder(default, setter(into, strip_option))]
179    pub id: Option<Base64Uuid>,
180    #[builder(setter(into))]
181    pub content: String,
182    #[builder(default)]
183    #[serde(default)]
184    pub formatting: Formatting,
185}
186
187#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
188#[cfg_attr(
189    feature = "fp-bindgen",
190    derive(Serializable),
191    fp(rust_module = "fiberplane_models::comments")
192)]
193#[non_exhaustive]
194#[serde(rename_all = "camelCase")]
195pub struct UpdateComment {
196    #[builder(setter(into))]
197    pub content: String,
198    #[builder(default)]
199    #[serde(default)]
200    pub formatting: Formatting,
201}
202
203#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
204#[cfg_attr(
205    feature = "fp-bindgen",
206    derive(Serializable),
207    fp(rust_module = "fiberplane_models::comments")
208)]
209#[non_exhaustive]
210#[serde(rename_all = "camelCase")]
211pub struct NewThread {
212    #[builder(default, setter(strip_option))]
213    pub id: Option<Base64Uuid>,
214    #[builder(default, setter(strip_option))]
215    pub referenced_cell_id: Option<Base64Uuid>,
216    #[builder(default, setter(strip_option))]
217    pub comment: Option<NewComment>,
218}