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 limit = paging.limit.unwrap_or(10).to_string();
121 let sort_order = paging.order.unwrap_or_default().to_string();
122 let cursor = match paging.cursor {
123 Some(cursor) => cursor.to_string(),
124 None => String::new(),
125 };
126
127 let result = client
128 .requestor
129 .client
130 .get(format!("{URL}/assets/{id}/published-versions"))
131 .query(&[
132 ("limit", limit),
133 ("sortOrder", sort_order),
134 ("cursor", cursor),
135 ])
136 .headers(client.requestor.default_headers.clone())
137 .send()
138 .await;
139
140 let response = client.validate_response(result).await?;
141 client
142 .requestor
143 .parse_json::<PublishedAssetVersions>(response)
144 .await
145}
146
147pub async fn revert_asset_version(client: &mut Client, id: u64, version: u64) -> Result<(), Error> {
148 let result = client
149 .requestor
150 .client
151 .post(format!(
152 "{URL}/assets/{id}/revert-version?assetVersionNumber={version}"
153 ))
154 .headers(client.requestor.default_headers.clone())
155 .send()
156 .await;
157
158 client.validate_response(result).await?;
159 Ok(())
160}