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