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