roblox_api/api/develop/
v1.rs

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