roblox_api/api/inventory/
v2.rs

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