shared/domain/
additional_resource.rs

1//! Types for additional resources for JIG or Playlists.
2
3use crate::{
4    api::endpoints::PathPart,
5    domain::{asset::AssetId, audio::AudioId, image::ImageId, meta::ResourceTypeId, pdf::PdfId},
6};
7use macros::make_path_parts;
8use serde::{Deserialize, Serialize};
9
10wrap_uuid! {
11    /// Wrapper type around [`Uuid`](Uuid), represents the ID of an additional resource.
12    pub struct AdditionalResourceId
13}
14
15#[derive(Serialize, Deserialize, Debug, Clone)]
16#[serde(rename_all = "camelCase")]
17/// Over-the-wire representation of a JIG or Playlist additional resource.
18pub struct AdditionalResource {
19    /// The additional resources's ID.
20    pub id: AdditionalResourceId,
21
22    /// Name for additional resource
23    pub display_name: String,
24
25    /// Type of additional resource
26    pub resource_type_id: ResourceTypeId,
27
28    /// Content of additional resource
29    #[serde(flatten)]
30    pub resource_content: ResourceContent,
31}
32
33make_path_parts!(CreateAssetResourcePath => "/v1/additional-resource/draft");
34
35/// Request to create a new `AdditionalResource`.
36///
37/// [`additional_resource::Create`](crate::api::endpoints::additional_resource::Create)
38#[derive(Serialize, Deserialize, Debug)]
39#[serde(rename_all = "camelCase")]
40pub struct AdditionalResourceCreateRequest {
41    /// Asset Id (JIG or Playlist) for additional resource
42    #[serde(flatten)]
43    pub asset_id: AssetId,
44
45    /// Display name for additional resource
46    pub display_name: String,
47
48    /// Type of additional resource
49    pub resource_type_id: ResourceTypeId,
50
51    /// Value of additional resource
52    #[serde(flatten)]
53    pub resource_content: ResourceContent,
54}
55
56make_path_parts!(UpdateAssetResourcePath => "/v1/additional-resource/{}" => AdditionalResourceId);
57
58/// Request to update an `AdditionalResource`.
59///
60/// [`additional_resource::Update`](crate::api::endpoints::additional_resource::Update)
61#[derive(Serialize, Deserialize, Debug, Default)]
62#[serde(rename_all = "camelCase")]
63pub struct AdditionalResourceUpdateRequest {
64    /// Asset Id (JIG or Playlist) for additional resource
65    #[serde(flatten)]
66    #[serde(default)]
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub asset_id: Option<AssetId>,
69
70    /// resource display name
71    #[serde(skip_serializing_if = "Option::is_none")]
72    #[serde(default)]
73    pub display_name: Option<String>,
74
75    /// Type of additional  resource
76    #[serde(skip_serializing_if = "Option::is_none")]
77    #[serde(default)]
78    pub resource_type_id: Option<ResourceTypeId>,
79
80    /// Kind of additional resource
81    #[serde(skip_serializing_if = "Option::is_none")]
82    #[serde(default)]
83    #[serde(flatten)]
84    pub resource_content: Option<ResourceContent>,
85}
86
87make_path_parts!(GetAssetResourceDraftPath => "/v1/additional-resource/{}/draft" => AdditionalResourceId);
88
89make_path_parts!(GetAssetResourceLivePath => "/v1/additional-resource/{}/live" => AdditionalResourceId);
90
91make_path_parts!(DeleteAssetResourcePath => "/v1/additional-resource/{}/draft" => AdditionalResourceId);
92
93/// Delete an `AdditionalResource` by Asset Id.
94///
95/// [`additional_resource::GetLive`](crate::api::endpoints::additional_resource::GetLive)
96#[derive(Serialize, Deserialize, Debug, Default)]
97#[serde(rename_all = "camelCase")]
98pub struct AssetIdResource {
99    /// Asset Id (JIG or Playlist) for additional resource
100    #[serde(flatten)]
101    #[serde(default)]
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub asset_id: Option<AssetId>,
104}
105
106/// Value of additional resource
107#[derive(Deserialize, Serialize, Debug, Clone)]
108#[serde(rename_all = "camelCase")]
109pub enum ResourceContent {
110    /// Additional resource kind: image
111    ImageId(ImageId),
112    /// Additional resource kind: audioFile
113    AudioId(AudioId),
114    /// Additional resource kind: link
115    Link(url::Url),
116    /// Additional resource kind: pdf
117    PdfId(PdfId),
118}