roblox_api/api/develop/
v1.rs1use 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}