shared/domain/resource/
curation.rs
use chrono::{DateTime, Utc};
use macros::make_path_parts;
use serde::{Deserialize, Serialize};
use crate::api::endpoints::PathPart;
use super::{report::ResourceReport, ResourceId, UserId};
wrap_uuid! {
pub struct CommentId
}
make_path_parts!(ResourceCurationPath => "/v1/resource/{}/curation" => ResourceId);
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationData {
pub resource_id: ResourceId,
pub fields_done: ResourceCurationFieldsDone,
pub curation_status: ResourceCurationStatus,
pub comments: Vec<ResourceCurationComment>,
pub reports: Vec<ResourceReport>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationFieldsDone {
pub display_name: bool,
pub language: bool,
pub categories: bool,
pub description: bool,
pub age_ranges: bool,
pub affiliations: bool,
pub additional_resources: bool,
}
impl Default for ResourceCurationFieldsDone {
fn default() -> Self {
Self {
display_name: false,
language: false,
categories: false,
description: false,
age_ranges: false,
affiliations: false,
additional_resources: false,
}
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Debug)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "camelCase")]
#[repr(i16)]
pub enum ResourceCurationStatus {
New = 0,
NewVersion = 1,
InProgress = 2,
Done = 3,
}
impl Default for ResourceCurationStatus {
fn default() -> Self {
Self::New
}
}
make_path_parts!(ResourceCurationUpdatePath => "/v1/resource/{}/curation" => ResourceId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationUpdateRequest {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub categories: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub age_ranges: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub affiliations: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_resources: Option<bool>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub curation_status: Option<ResourceCurationStatus>,
}
make_path_parts!(ResourceCurationCommentCreatePath => "/v1/resource/{}/curation/comment" => ResourceId);
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationComment {
pub id: CommentId,
pub resource_id: ResourceId,
pub value: String,
pub created_at: DateTime<Utc>,
pub author_id: UserId,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationCommentRequest {
pub value: String,
}
make_path_parts!(ResourceCurationCommentGetPath => "/v1/resource/{}/curation/comment/{}" => ResourceId, CommentId);
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ResourceCurationCommentResponse {
pub id: CommentId,
pub resource_id: ResourceId,
pub value: String,
pub created_at: Option<DateTime<Utc>>,
pub author_id: UserId,
pub author_name: String,
}