shared/domain/course/
unit.rs1use crate::{
4 api::endpoints::PathPart,
5 domain::{
6 audio::AudioId, image::ImageId, module::body::_groups::design::YoutubeEmbed, pdf::PdfId,
7 },
8};
9use macros::make_path_parts;
10use serde::{Deserialize, Serialize};
11
12use super::CourseId;
13
14wrap_uuid! {
15 pub struct CourseUnitId
17}
18
19#[derive(Serialize, Deserialize, Debug, Clone)]
20#[serde(rename_all = "camelCase")]
21pub struct CourseUnit {
23 pub id: CourseUnitId,
25 pub display_name: String,
27
28 pub description: String,
30
31 #[serde(flatten)]
33 pub value: CourseUnitValue,
34}
35
36make_path_parts!(CreateCourseUnitPath => "/v1/course/{}/unit" => CourseId);
37
38#[derive(Serialize, Deserialize, Debug)]
42#[serde(rename_all = "camelCase")]
43pub struct CourseUnitCreateRequest {
44 pub display_name: String,
46
47 pub description: String,
49
50 #[serde(flatten)]
52 pub value: CourseUnitValue,
53}
54
55make_path_parts!(UpdateCourseUnitPath => "/v1/course/{}/unit/{}" => CourseId, CourseUnitId);
56
57#[derive(Serialize, Deserialize, Debug, Default)]
61#[serde(rename_all = "camelCase")]
62pub struct CourseUnitUpdateRequest {
63 #[serde(skip_serializing_if = "Option::is_none")]
65 #[serde(default)]
66 pub display_name: Option<String>,
67
68 #[serde(skip_serializing_if = "Option::is_none")]
70 #[serde(default)]
71 pub description: Option<String>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 #[serde(default)]
76 #[serde(flatten)]
77 pub value: Option<CourseUnitValue>,
78
79 #[serde(default)]
81 pub index: Option<u16>,
82}
83
84make_path_parts!(GetCourseUnitDraftPath => "/v1/course/{}/unit/{}/draft" => CourseId, CourseUnitId);
85
86make_path_parts!(GetCourseUnitLivePath => "/v1/course/{}/unit/{}/live" => CourseId, CourseUnitId);
87
88make_path_parts!(DeleteCourseUnitPath => "/v1/course/{}/unit/{}/draft" => CourseId, CourseUnitId);
89
90#[derive(Deserialize, Serialize, Debug, Clone)]
92#[serde(rename_all = "camelCase")]
93pub enum CourseUnitValue {
94 ImageId(ImageId),
96 AudioId(AudioId),
98 Link(url::Url),
100 PdfId(PdfId),
102 Video(YoutubeEmbed),
104}