roblox_api/api/develop/
v1.rs

1use 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}