use crate::{
api::endpoints::PathPart,
domain::{
additional_resource::AdditionalResource, asset::UserOrMe, circle::CircleId,
csv_encode_uuids, from_csv, image::ImageId, to_csv, user::UserId,
},
};
use macros::make_path_parts;
use serde::{Deserialize, Serialize};
use strum_macros::Display;
use super::UserBadge;
make_path_parts!(PublicUserGetPath => "/v1/user/{}/public" => UserId);
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct PublicUser {
pub id: UserId,
pub username: String,
pub given_name: String,
pub family_name: String,
pub profile_image: Option<ImageId>,
pub following: bool,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub bio: Option<String>, #[serde(default)]
pub badge: Option<UserBadge>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub languages_spoken: Option<Vec<String>>, #[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub organization: Option<String>, #[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub persona: Option<Vec<String>>, #[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub country_short: Option<String>, #[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub country_long: Option<String>, #[serde(default)]
pub circles: Vec<CircleId>,
#[serde(default)]
pub jig_count: u64,
#[serde(default)]
pub resource_count: u64,
#[serde(default)]
pub course_count: u64,
#[serde(default)]
pub playlist_count: u64,
#[serde(default)]
pub total_asset_count: u64,
}
make_path_parts!(PublicUserBrowsePath => "/v1/user/public/browse");
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct UserBrowseQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
pub page_limit: Option<u32>,
#[serde(default)]
#[serde(serialize_with = "csv_encode_uuids")]
#[serde(deserialize_with = "from_csv")]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub circles: Vec<CircleId>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub order_by: Option<OrderBy>,
#[serde(default)]
#[serde(serialize_with = "to_csv")]
#[serde(deserialize_with = "from_csv")]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub badge: Vec<UserBadge>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserResponse {
pub users: Vec<PublicUser>,
pub pages: u32,
pub total_user_count: u64,
}
make_path_parts!(PublicUserSearchPath => "/v1/user/public");
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct SearchPublicUserQuery {
#[serde(default)]
#[serde(skip_serializing_if = "String::is_empty")]
pub q: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<UserOrMe>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub languages_spoken: Option<Vec<String>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub organization: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub persona: Option<Vec<String>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub bio: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SearchPublicUserResponse {
pub users: Vec<PublicUser>,
pub pages: u32,
pub total_user_count: u64,
}
make_path_parts!(BrowsePublicUserJigsPath => "/v1/user/{}/public/jig/browse" => UserId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserJigsQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
make_path_parts!(BrowsePublicUserResourcesPath => "/v1/user/{}/public/resource/browse" => UserId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserResourcesQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserResourcesResponse {
pub resources: Vec<AdditionalResource>,
pub pages: u32,
pub total_resource_count: u64,
}
make_path_parts!(BrowsePublicUserPlaylistsPath => "/v1/user/{}/public/playlist/browse" => UserId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserPlaylistsQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
make_path_parts!(BrowsePublicUserFollowersPath => "/v1/user/{}/public/follower/browse" => UserId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserFollowersQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserFollowersResponse {
pub followers: Vec<PublicUser>,
pub pages: u32,
pub total_follower_count: u64,
}
make_path_parts!(BrowsePublicUserFollowingPath => "/v1/user/{}/public/following/browse" => UserId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserFollowingsQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct BrowsePublicUserFollowingResponse {
pub followings: Vec<PublicUser>,
pub pages: u32,
pub total_following_count: u64,
}
make_path_parts!(PublicUserFollowPath => "/v1/user/{}/follow" => UserId);
make_path_parts!(PublicUserUnfollowPath => "/v1/user/{}/unfollow" => UserId);
#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Debug, Display)]
#[cfg_attr(feature = "backend", derive(sqlx::Type))]
#[serde(rename_all = "camelCase")]
#[repr(i16)]
pub enum OrderBy {
#[strum(serialize = "AssetCount")]
AssetCount = 0,
}