roblox_api/api/inventory/
v2.rs1use crate::{AssetTypeId, DateTime, Error, Paging, client::Client};
2use serde::Deserialize;
3
4pub const URL: &str = "https://inventory.roblox.com/v2";
5
6#[derive(Clone, Debug, Deserialize)]
7pub struct FromOwnerAssetOwner {
8 pub id: u64,
9 #[serde(rename = "type")]
10 pub kind: u64,
11 pub name: String,
12}
13
14#[derive(Clone, Debug, Deserialize)]
15pub struct FromOwnerAssetInfo {
16 pub id: u64,
17 #[serde(rename = "serialNumber")]
18 pub serial: u64,
19 #[serde(rename = "collectibleItemInstanceId")]
20 pub collectible_instance_id: Option<String>,
21 pub owner: UserOwnedAssetOwner,
22 pub created: DateTime,
23 pub updated: DateTime,
24}
25
26#[derive(Clone, Debug, Deserialize)]
27pub struct UserOwnedAssetOwner {
28 #[serde(rename = "userId")]
29 pub id: u64,
30 #[serde(rename = "buildersClubMembershipType")]
31 pub premium_membership_type: String,
32 #[serde(rename = "username")]
33 pub name: String,
34}
35
36#[derive(Clone, Debug, Deserialize)]
37pub struct UserOwnedAssetInfo {
38 #[serde(rename = "assetId")]
39 pub id: u64,
40 #[serde(rename = "userAssetId")]
41 pub instance_id: u64,
42 #[serde(rename = "assetName")]
43 pub name: String,
44 pub owner: UserOwnedAssetOwner,
45 #[serde(rename = "collectibleItemId")]
46 pub collectible_id: Option<u64>,
47 #[serde(rename = "collectibleItemInstanceId")]
48 pub collectible_instance_id: Option<u64>,
49 #[serde(rename = "serialNumber")]
50 pub serial: Option<u64>,
51 pub created: DateTime,
52 pub updated: DateTime,
53}
54
55#[derive(Clone, Debug, Deserialize)]
56pub struct UserOwnedAssets {
57 #[serde(rename = "nextPageCursor")]
58 pub next_cursor: Option<String>,
59 #[serde(rename = "previousPageCursor")]
60 pub previous_cursor: Option<String>,
61 #[serde(rename = "data")]
62 pub assets: Vec<UserOwnedAssetInfo>,
63}
64
65#[derive(Clone, Debug, Deserialize)]
66pub struct AssetOwners {
67 #[serde(rename = "nextPageCursor")]
68 pub next_cursor: String,
69 #[serde(rename = "previousPageCursor")]
70 pub previous_cursor: String,
71 #[serde(rename = "data")]
72 pub assets: Vec<FromOwnerAssetInfo>,
73}
74
75pub async fn asset_owners(
76 client: &mut Client,
77 id: u64,
78 paging: Paging<'_>,
79) -> Result<AssetOwners, Error> {
80 let limit = paging.limit.unwrap_or(10);
81 let sort_order = paging.order.unwrap_or_default().to_string();
82 let cursor = match paging.cursor {
83 Some(cursor) => format!("&cursor={cursor}"),
84 None => String::new(),
85 };
86
87 let result = client
88 .requestor
89 .client
90 .get(format!(
91 "{URL}/assets/{id}/owners?limit={limit}&sortOrder={sort_order}{cursor}"
92 ))
93 .headers(client.requestor.default_headers.clone())
94 .send()
95 .await;
96
97 let response = client.validate_response(result).await?;
98 client.requestor.parse_json::<AssetOwners>(response).await
99}
100
101pub async fn user_owned_assets(
102 client: &mut Client,
103 user_id: u64,
104 asset_type_id: AssetTypeId,
105 paging: Paging<'_>,
106) -> Result<UserOwnedAssets, Error> {
107 let asset_type_id = asset_type_id as u8;
108
109 let limit = paging.limit.unwrap_or(10);
110 let sort_order = paging.order.unwrap_or_default().to_string();
111 let cursor = match paging.cursor {
112 Some(cursor) => format!("&cursor={cursor}"),
113 None => String::new(),
114 };
115
116 let result = client
117 .requestor
118 .client
119 .get(format!("{URL}/users/{user_id}/inventory/{asset_type_id}?limit={limit}&sortOrder={sort_order}{cursor}"))
120 .headers(client.requestor.default_headers.clone())
121 .send()
122 .await;
123
124 let response = client.validate_response(result).await?;
125 client
126 .requestor
127 .parse_json::<UserOwnedAssets>(response)
128 .await
129}