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 #[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 #[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, #[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}