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 = "canHaveThumbnails")]
68 pub thumbnails_allowed: bool,
69 #[serde(rename = "isVersioningEnabled")]
70 pub is_versioning_enabled: bool,
71
72 #[serde(rename = "moderationStatus")]
73 pub moderation_status: 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 assets: Vec<Asset>,
104 }
105
106 let response = client.validate_response(result).await?;
107 Ok(client
108 .requestor
109 .parse_json::<Response>(response)
110 .await?
111 .assets)
112}
113
114pub async fn published_asset_versions(
115 client: &mut Client,
116 id: u64,
117 paging: Paging<'_>,
118) -> Result<PublishedAssetVersions, Error> {
119 let result = client
120 .requestor
121 .client
122 .get(format!("{URL}/assets/{id}/published-versions"))
123 .headers(client.requestor.default_headers.clone())
124 .send()
125 .await;
126
127 let response = client.validate_response(result).await?;
128 client
129 .requestor
130 .parse_json::<PublishedAssetVersions>(response)
131 .await
132}
133
134pub async fn revert_asset_version(
135 client: &mut Client,
136 id: u64,
137 asset_version: u64,
138) -> Result<(), Error> {
139 let result = client
140 .requestor
141 .client
142 .post(format!(
143 "{URL}/assets/{id}/revert-version?assetVersionNumber={asset_version}"
144 ))
145 .headers(client.requestor.default_headers.clone())
146 .send()
147 .await;
148
149 client.validate_response(result).await?;
150 Ok(())
151}