use crate::{AssetTypeId, DateTime, Error, Paging, client::Client};
use serde::Deserialize;
pub const URL: &str = "https://inventory.roblox.com/v2";
#[derive(Clone, Debug, Deserialize)]
pub struct FromOwnerAssetOwner {
pub id: u64,
#[serde(rename = "type")]
pub kind: u64,
pub name: String,
}
#[derive(Clone, Debug, Deserialize)]
pub struct FromOwnerAssetInfo {
pub id: u64,
#[serde(rename = "serialNumber")]
pub serial: u64,
#[serde(rename = "collectibleItemInstanceId")]
pub collectible_instance_id: Option<String>,
pub owner: UserOwnedAssetOwner,
pub created: DateTime,
pub updated: DateTime,
}
#[derive(Clone, Debug, Deserialize)]
pub struct UserOwnedAssetOwner {
#[serde(rename = "userId")]
pub id: u64,
#[serde(rename = "buildersClubMembershipType")]
pub premium_membership_type: String,
#[serde(rename = "username")]
pub name: String,
}
#[derive(Clone, Debug, Deserialize)]
pub struct UserOwnedAssetInfo {
#[serde(rename = "assetId")]
pub id: u64,
#[serde(rename = "userAssetId")]
pub instance_id: u64,
#[serde(rename = "assetName")]
pub name: String,
pub owner: UserOwnedAssetOwner,
#[serde(rename = "collectibleItemId")]
pub collectible_id: Option<u64>,
#[serde(rename = "collectibleItemInstanceId")]
pub collectible_instance_id: Option<u64>,
#[serde(rename = "serialNumber")]
pub serial: Option<u64>,
pub created: DateTime,
pub updated: DateTime,
}
#[derive(Clone, Debug, Deserialize)]
pub struct UserOwnedAssets {
#[serde(rename = "nextPageCursor")]
pub next_cursor: Option<String>,
#[serde(rename = "previousPageCursor")]
pub previous_cursor: Option<String>,
#[serde(rename = "data")]
pub assets: Vec<UserOwnedAssetInfo>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct AssetOwners {
#[serde(rename = "nextPageCursor")]
pub next_cursor: String,
#[serde(rename = "previousPageCursor")]
pub previous_cursor: String,
#[serde(rename = "data")]
pub assets: Vec<FromOwnerAssetInfo>,
}
pub async fn asset_owners(
client: &mut Client,
id: u64,
paging: Paging<'_>,
) -> Result<AssetOwners, Error> {
let limit = paging.limit.unwrap_or(10);
let sort_order = paging.order.unwrap_or_default().to_string();
let cursor = match paging.cursor {
Some(cursor) => format!("&cursor={cursor}"),
None => String::new(),
};
let result = client
.requestor
.client
.get(format!(
"{URL}/assets/{id}/owners?limit={limit}&sortOrder={sort_order}{cursor}"
))
.headers(client.requestor.default_headers.clone())
.send()
.await;
let response = client.validate_response(result).await?;
client.requestor.parse_json::<AssetOwners>(response).await
}
pub async fn user_owned_assets(
client: &mut Client,
user_id: u64,
asset_type_id: AssetTypeId,
paging: Paging<'_>,
) -> Result<UserOwnedAssets, Error> {
let asset_type_id = asset_type_id as u8;
let limit = paging.limit.unwrap_or(10);
let sort_order = paging.order.unwrap_or_default().to_string();
let cursor = match paging.cursor {
Some(cursor) => format!("&cursor={cursor}"),
None => String::new(),
};
let result = client
.requestor
.client
.get(format!("{URL}/users/{user_id}/inventory/{asset_type_id}?limit={limit}&sortOrder={sort_order}{cursor}"))
.headers(client.requestor.default_headers.clone())
.send()
.await;
let response = client.validate_response(result).await?;
client
.requestor
.parse_json::<UserOwnedAssets>(response)
.await
}