shared/domain/course/
unit.rsuse crate::{
api::endpoints::PathPart,
domain::{
audio::AudioId, image::ImageId, module::body::_groups::design::YoutubeEmbed, pdf::PdfId,
},
};
use macros::make_path_parts;
use serde::{Deserialize, Serialize};
use super::CourseId;
wrap_uuid! {
pub struct CourseUnitId
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CourseUnit {
pub id: CourseUnitId,
pub display_name: String,
pub description: String,
#[serde(flatten)]
pub value: CourseUnitValue,
}
make_path_parts!(CreateCourseUnitPath => "/v1/course/{}/unit" => CourseId);
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CourseUnitCreateRequest {
pub display_name: String,
pub description: String,
#[serde(flatten)]
pub value: CourseUnitValue,
}
make_path_parts!(UpdateCourseUnitPath => "/v1/course/{}/unit/{}" => CourseId, CourseUnitId);
#[derive(Serialize, Deserialize, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct CourseUnitUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
#[serde(flatten)]
pub value: Option<CourseUnitValue>,
#[serde(default)]
pub index: Option<u16>,
}
make_path_parts!(GetCourseUnitDraftPath => "/v1/course/{}/unit/{}/draft" => CourseId, CourseUnitId);
make_path_parts!(GetCourseUnitLivePath => "/v1/course/{}/unit/{}/live" => CourseId, CourseUnitId);
make_path_parts!(DeleteCourseUnitPath => "/v1/course/{}/unit/{}/draft" => CourseId, CourseUnitId);
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub enum CourseUnitValue {
ImageId(ImageId),
AudioId(AudioId),
Link(url::Url),
PdfId(PdfId),
Video(YoutubeEmbed),
}