1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
5#[serde(rename_all = "lowercase")]
6pub enum TeamVisibilityType {
7 Public,
8 Private,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
12#[serde(rename_all = "lowercase")]
13pub enum NotePublishType {
14 Edit,
15 View,
16 Slide,
17 Book,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
21#[serde(rename_all = "snake_case")]
22pub enum CommentPermissionType {
23 Disabled,
24 Forbidden,
25 Owners,
26 SignedInUsers,
27 Everyone,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
31#[serde(rename_all = "snake_case")]
32pub enum SuggestEditPermissionType {
33 Disabled,
34 Forbidden,
35 Owners,
36 SignedInUsers,
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
40#[serde(rename_all = "snake_case")]
41pub enum NotePermissionRole {
42 Owner,
43 SignedIn,
44 Guest,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
48#[serde(rename_all = "camelCase")]
49pub struct FolderPath {
50 pub id: String,
51 pub name: String,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub icon: Option<String>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub color: Option<String>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub parent_id: Option<String>,
58 pub client_id: String,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, Serialize, Default)]
62#[serde(rename_all = "camelCase")]
63pub struct CreateNoteOptions {
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub title: Option<String>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub content: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub description: Option<String>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub tags: Option<Vec<String>>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub read_permission: Option<NotePermissionRole>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub write_permission: Option<NotePermissionRole>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub comment_permission: Option<CommentPermissionType>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub suggest_edit_permission: Option<SuggestEditPermissionType>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub permalink: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub parent_folder_id: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub origin: Option<String>,
86}
87
88#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
89pub struct NoteImageUploadData {
90 pub link: String,
91}
92
93#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
94pub struct NoteImageUploadResponse {
95 pub data: NoteImageUploadData,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
99#[serde(rename_all = "camelCase")]
100pub struct Team {
101 pub id: String,
102 pub owner_id: String,
103 pub name: String,
104 pub logo: String,
105 pub path: String,
106 pub description: Option<String>,
107 pub visibility: TeamVisibilityType,
108 #[serde(with = "chrono::serde::ts_milliseconds")]
109 pub created_at: DateTime<Utc>,
110 pub upgraded: bool,
111}
112
113#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
114#[serde(rename_all = "camelCase")]
115pub struct User {
116 pub id: String,
117 pub email: Option<String>,
118 pub name: String,
119 pub user_path: String,
120 pub photo: String,
121 pub teams: Vec<Team>,
122 pub upgraded: bool,
123}
124
125#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
126#[serde(rename_all = "camelCase")]
127pub struct SimpleUserProfile {
128 pub name: String,
129 pub user_path: String,
130 pub photo: String,
131 pub biography: Option<String>,
132}
133
134#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
135#[serde(rename_all = "camelCase")]
136pub struct Note {
137 pub id: String,
138 pub title: String,
139 #[serde(default)]
140 pub description: String,
141 pub tags: Vec<String>,
142 #[serde(with = "chrono::serde::ts_milliseconds")]
143 pub last_changed_at: DateTime<Utc>,
144 #[serde(with = "chrono::serde::ts_milliseconds")]
145 pub created_at: DateTime<Utc>,
146 #[serde(with = "chrono::serde::ts_milliseconds_option")]
147 pub title_updated_at: Option<DateTime<Utc>>,
148 #[serde(with = "chrono::serde::ts_milliseconds_option")]
149 pub tags_updated_at: Option<DateTime<Utc>>,
150 pub last_change_user: Option<SimpleUserProfile>,
151 pub publish_type: NotePublishType,
152 #[serde(with = "chrono::serde::ts_milliseconds_option")]
153 pub published_at: Option<DateTime<Utc>>,
154 pub user_path: Option<String>,
155 pub team_path: Option<String>,
156 pub permalink: Option<String>,
157 pub short_id: String,
158 pub publish_link: String,
159 #[serde(default)]
160 pub folder_paths: Vec<FolderPath>,
161 pub read_permission: NotePermissionRole,
162 pub write_permission: NotePermissionRole,
163}
164
165#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
166#[serde(rename_all = "camelCase")]
167pub struct SingleNote {
168 pub content: String,
169 #[serde(flatten)]
170 pub note: Note,
171}
172
173#[derive(Debug, Clone, PartialEq, Eq, Serialize, Default)]
174#[serde(rename_all = "camelCase")]
175pub struct UpdateNoteOptions {
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub title: Option<String>,
178 #[serde(skip_serializing_if = "Option::is_none")]
179 pub content: Option<String>,
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub description: Option<String>,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub tags: Option<Vec<String>>,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub read_permission: Option<NotePermissionRole>,
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub write_permission: Option<NotePermissionRole>,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub permalink: Option<String>,
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub parent_folder_id: Option<String>,
192}