1use crate::labels::Label;
2use crate::names::Name;
3use crate::paging::Pagination;
4use crate::sorting::{NotebookSortFields, SortDirection, Sorting, ViewSortFields};
5use crate::timestamps::Timestamp;
6use base64uuid::Base64Uuid;
7#[cfg(feature = "fp-bindgen")]
8use fp_bindgen::prelude::Serializable;
9use serde::{Deserialize, Serialize};
10use typed_builder::TypedBuilder;
11
12#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
13#[cfg_attr(
14 feature = "fp-bindgen",
15 derive(Serializable),
16 fp(rust_module = "fiberplane_models::views")
17)]
18#[non_exhaustive]
19#[serde(rename_all = "camelCase")]
20pub struct View {
21 #[builder(setter(into))]
22 pub id: Base64Uuid,
23
24 pub name: Name,
25
26 #[builder(default, setter(into))]
27 pub display_name: String,
28
29 #[builder(default, setter(into))]
30 pub description: String,
31
32 #[builder(default)]
33 pub color: i16,
34
35 #[builder(default)]
36 pub labels: Vec<Label>,
37
38 #[builder(default, setter(into, strip_option))]
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub relative_time: Option<RelativeTime>,
41
42 #[builder(default, setter(into, strip_option))]
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub sort_by: Option<NotebookSortFields>,
45
46 #[builder(default, setter(into, strip_option))]
47 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub sort_direction: Option<SortDirection>,
49
50 #[builder(setter(into))]
51 pub created_at: Timestamp,
52
53 #[builder(setter(into))]
54 pub updated_at: Timestamp,
55}
56
57#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
58#[non_exhaustive]
59#[serde(rename_all = "camelCase")]
60pub struct ViewQuery {
61 #[serde(flatten)]
62 pub sort: Sorting<ViewSortFields>,
63 #[serde(flatten)]
64 pub pagination: Pagination,
65}
66
67#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
68#[cfg_attr(
69 feature = "fp-bindgen",
70 derive(Serializable),
71 fp(rust_module = "fiberplane_models::views")
72)]
73#[non_exhaustive]
74#[serde(rename_all = "camelCase")]
75pub struct NewView {
76 pub name: Name,
77
78 #[builder(default, setter(into, strip_option))]
79 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub display_name: Option<String>,
81
82 #[builder(default, setter(into))]
83 pub description: String,
84
85 #[builder(default)]
86 pub color: i16,
87
88 #[builder(default)]
89 pub labels: Vec<Label>,
90
91 #[builder(default, setter(strip_option))]
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub relative_time: Option<RelativeTime>,
94
95 #[builder(default, setter(strip_option))]
96 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub sort_by: Option<NotebookSortFields>,
98
99 #[builder(default, setter(strip_option))]
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub sort_direction: Option<SortDirection>,
102}
103
104#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
105#[cfg_attr(
106 feature = "fp-bindgen",
107 derive(Serializable),
108 fp(rust_module = "fiberplane_models::views")
109)]
110#[non_exhaustive]
111#[serde(rename_all = "camelCase")]
112pub struct UpdateView {
113 #[builder(default, setter(into, strip_option))]
114 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub display_name: Option<String>,
116
117 #[builder(default, setter(strip_option))]
118 #[serde(
119 default,
120 deserialize_with = "crate::deserialize_some",
121 skip_serializing_if = "Option::is_none"
122 )]
123 pub description: Option<Option<String>>,
124
125 #[builder(default, setter(strip_option))]
126 #[serde(default, skip_serializing_if = "Option::is_none")]
127 pub color: Option<i16>,
128
129 #[builder(default, setter(strip_option))]
130 #[serde(default, skip_serializing_if = "Option::is_none")]
131 pub labels: Option<Vec<Label>>,
132
133 #[builder(default, setter(strip_option))]
134 #[serde(
135 default,
136 deserialize_with = "crate::deserialize_some",
137 skip_serializing_if = "Option::is_none"
138 )]
139 pub relative_time: Option<Option<RelativeTime>>,
140
141 #[builder(default, setter(strip_option))]
142 #[serde(
143 default,
144 deserialize_with = "crate::deserialize_some",
145 skip_serializing_if = "Option::is_none"
146 )]
147 pub sort_by: Option<Option<NotebookSortFields>>,
148
149 #[builder(default, setter(strip_option))]
150 #[serde(
151 default,
152 deserialize_with = "crate::deserialize_some",
153 skip_serializing_if = "Option::is_none"
154 )]
155 pub sort_direction: Option<Option<SortDirection>>,
156}
157
158#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
159#[cfg_attr(
160 feature = "fp-bindgen",
161 derive(Serializable),
162 fp(rust_module = "fiberplane_models::views")
163)]
164#[non_exhaustive]
165#[serde(rename_all = "camelCase")]
166pub struct PinnedView {
167 pub name: Name,
168}
169
170#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Copy, Clone)]
171#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
172#[cfg_attr(
173 feature = "fp-bindgen",
174 derive(Serializable),
175 fp(rust_module = "fiberplane_models::views")
176)]
177#[cfg_attr(feature = "sqlx", derive(sqlx::Type), sqlx(type_name = "time_unit"))]
178#[non_exhaustive]
179#[serde(rename_all = "camelCase")]
180pub enum TimeUnit {
181 Seconds,
182 Minutes,
183 Hours,
184 Days,
185}
186
187#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Copy, Clone)]
188#[cfg_attr(
189 feature = "fp-bindgen",
190 derive(Serializable),
191 fp(rust_module = "fiberplane_models::views")
192)]
193#[cfg_attr(
194 feature = "sqlx",
195 derive(sqlx::Type),
196 sqlx(type_name = "relative_time")
197)]
198#[non_exhaustive]
199#[serde(rename_all = "camelCase")]
200pub struct RelativeTime {
201 pub unit: TimeUnit,
202 pub value: i64,
203}
204
205impl RelativeTime {
206 pub fn new(value: i64, unit: TimeUnit) -> Self {
208 Self { unit, value }
209 }
210}