roblox_api/api/develop/
v1.rs1use serde::Deserialize;
2
3use crate::{DateTime, Error, Paging, client::Client};
4
5pub const URL: &str = "https://develop.roblox.com/v1";
6
7#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
8pub struct PublishedAssetVersion {
9 #[serde(rename = "Id")]
10 pub id: u64,
11 #[serde(rename = "assetId")]
12 pub asset_id: u64,
13 #[serde(rename = "assetVersionNumber")]
14 pub asset_version: u64,
15 #[serde(rename = "creatorTargetId")]
16 pub creator_id: u64,
17 #[serde(rename = "creatorType")]
18 pub creator_type: String,
19 #[serde(rename = "created")]
20 pub created_at: DateTime,
21 #[serde(rename = "isPublished")]
22 pub is_published: bool,
23 #[serde(rename = "isEqualToCurrentPublishedVersion")]
24 pub is_current_published_version: bool,
25}
26
27#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
28pub struct PublishedAssetVersions {
29 #[serde(rename = "data")]
30 pub assets: Vec<PublishedAssetVersion>,
31 #[serde(rename = "nextPageCursor")]
32 pub next_cursor: Option<String>,
33 #[serde(rename = "previousPageCursor")]
34 pub previous_cursor: Option<String>,
35}
36
37#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
38pub struct AssetCreator {
39 #[serde(rename = "targetId")]
40 pub id: u64,
41 #[serde(rename = "type")]
42 pub kind: String,
43 #[serde(rename = "typeId")]
44 pub type_id: u32,
45}
46
47#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
48pub struct Asset {
49 pub id: u64,
50 pub name: String,
51 pub description: String,
52 #[serde(rename = "type")]
53 pub kind: String,
54 #[serde(rename = "typeId")]
55 pub type_id: u32,
56
57 #[serde(rename = "enableComments")]
58 pub comments_enabled: bool,
59 #[serde(rename = "isCopyingAllowed")]
60 pub is_copying_allowed: bool,
61 #[serde(rename = "isPublicDomainEnabled")]
62 pub is_public_domain: bool,
63 #[serde(rename = "isModerated")]
64 pub is_moderated: bool,
65 #[serde(rename = "isArchivable")]
66 pub is_archivable: bool,
67 #[serde(rename = "canHaveThumbnail")]
68 pub thumbnails_allowed: bool,
69 #[serde(rename = "isVersioningEnabled")]
70 pub is_versioning_enabled: bool,
71
72 #[serde(rename = "moderationStatus")]
73 pub moderation_status: Option<String>,
74 #[serde(rename = "reviewStatus")]
75 pub review_status: String,
76
77 #[serde(rename = "created")]
78 pub creation_date: DateTime,
79 #[serde(rename = "updated")]
80 pub last_updated_date: DateTime,
81
82 pub genres: Vec<String>,
83 pub creator: AssetCreator,
84}
85
86pub async fn assets(client: &mut Client, ids: &[u64]) -> Result<Vec<Asset>, Error> {
87 let ids = ids
88 .iter()
89 .map(|x| x.to_string())
90 .collect::<Vec<String>>()
91 .join(",");
92
93 let result = client
94 .requestor
95 .client
96 .get(format!("{URL}/assets?assetIds={ids}"))
97 .headers(client.requestor.default_headers.clone())
98 .send()
99 .await;
100
101 #[derive(Deserialize)]
102 struct Response {
103 #[serde(rename = "data")]
104 assets: Vec<Asset>,
105 }
106
107 let response = client.validate_response(result).await?;
108 Ok(client
109 .requestor
110 .parse_json::<Response>(response)
111 .await?
112 .assets)
113}
114
115pub async fn published_asset_versions(
116 client: &mut Client,
117 id: u64,
118 paging: Paging<'_>,
119) -> Result<PublishedAssetVersions, Error> {
120 let result = client
121 .requestor
122 .client
123 .get(format!("{URL}/assets/{id}/published-versions"))
124 .headers(client.requestor.default_headers.clone())
125 .send()
126 .await;
127
128 let response = client.validate_response(result).await?;
129 client
130 .requestor
131 .parse_json::<PublishedAssetVersions>(response)
132 .await
133}
134
135pub async fn revert_asset_version(client: &mut Client, id: u64, version: u64) -> Result<(), Error> {
136 let result = client
137 .requestor
138 .client
139 .post(format!(
140 "{URL}/assets/{id}/revert-version?assetVersionNumber={version}"
141 ))
142 .headers(client.requestor.default_headers.clone())
143 .send()
144 .await;
145
146 client.validate_response(result).await?;
147 Ok(())
148}