shared/domain/jig/
curation.rs1use chrono::{DateTime, Utc};
3use macros::make_path_parts;
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7use crate::api::endpoints::PathPart;
8
9use super::{report::JigReport, JigId};
10
11wrap_uuid! {
12 pub struct CommentId
14}
15
16make_path_parts!(JigCurationPath => "/v1/jig/{}/curation" => JigId);
17
18#[derive(Serialize, Deserialize, Clone, Debug)]
20#[serde(rename_all = "camelCase")]
21pub struct JigCurationData {
22 pub jig_id: JigId,
24
25 pub fields_done: JigCurationFieldsDone,
27
28 pub curation_status: JigCurationStatus,
30
31 pub comments: Vec<JigCurationComment>,
33
34 pub reports: Vec<JigReport>,
36}
37
38#[derive(Serialize, Deserialize, Clone, Debug)]
43#[serde(rename_all = "camelCase")]
44pub struct JigCurationFieldsDone {
45 pub display_name: bool,
47
48 pub language: bool,
50
51 pub categories: bool,
53
54 pub description: bool,
56
57 pub age_ranges: bool,
59
60 pub affiliations: bool,
62
63 pub additional_resources: bool,
65}
66
67impl Default for JigCurationFieldsDone {
68 fn default() -> Self {
69 Self {
70 display_name: false,
71 language: false,
72 categories: false,
73 description: false,
74 age_ranges: false,
75 affiliations: false,
76 additional_resources: false,
77 }
78 }
79}
80
81#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Debug)]
83#[cfg_attr(feature = "backend", derive(sqlx::Type))]
84#[serde(rename_all = "camelCase")]
85#[repr(i16)]
86pub enum JigCurationStatus {
87 New = 0,
89
90 NewVersion = 1,
92
93 InProgress = 2,
95
96 Done = 3,
98}
99
100impl Default for JigCurationStatus {
101 fn default() -> Self {
102 Self::New
103 }
104}
105
106make_path_parts!(JigCurationUpdatePath => "/v1/jig/{}/curation" => JigId);
107
108#[derive(Serialize, Deserialize, Clone, Debug, Default)]
110#[serde(rename_all = "camelCase")]
111pub struct JigCurationUpdateRequest {
112 #[serde(default)]
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub display_name: Option<bool>,
116
117 #[serde(default)]
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub language: Option<bool>,
121
122 #[serde(default)]
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub goals: Option<bool>,
126
127 #[serde(default)]
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub categories: Option<bool>,
131
132 #[serde(default)]
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub description: Option<bool>,
136
137 #[serde(default)]
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub age_ranges: Option<bool>,
141
142 #[serde(default)]
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub affiliations: Option<bool>,
146
147 #[serde(default)]
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub additional_resources: Option<bool>,
151
152 #[serde(default)]
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub curation_status: Option<JigCurationStatus>,
156}
157
158make_path_parts!(JigCurationCommentCreatePath => "/v1/jig/{}/curation/comment" => JigId);
159
160#[derive(Serialize, Deserialize, Clone, Debug)]
162#[serde(rename_all = "camelCase")]
163pub struct JigCurationComment {
164 pub id: CommentId,
166
167 pub jig_id: JigId,
169
170 pub value: String,
172
173 pub created_at: DateTime<Utc>,
175
176 pub author_id: Uuid,
178}
179
180#[derive(Serialize, Deserialize, Debug)]
182#[serde(rename_all = "camelCase")]
183pub struct JigCurationCommentRequest {
184 pub value: String,
186}
187
188make_path_parts!(JigCurationCommentGetPath => "/v1/jig/{}/curation/comment/{}" => JigId, CommentId);
189
190#[derive(Serialize, Deserialize, Debug)]
192#[serde(rename_all = "camelCase")]
193pub struct JigCurationCommentResponse {
194 pub id: CommentId,
196
197 pub jig_id: JigId,
199
200 pub value: String,
202
203 pub created_at: Option<DateTime<Utc>>,
205
206 pub author_id: Uuid,
208
209 pub author_name: String,
211}