use chrono::{DateTime, Utc};
use macros::make_path_parts;
use serde::{Deserialize, Serialize};
use crate::api::endpoints::PathPart;
use strum_macros::Display;
use super::{asset::UserOrMe, image::ImageId, user::UserId};
wrap_uuid! {
#[serde(rename_all = "camelCase")]
pub struct CircleId
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Circle {
pub id: CircleId,
pub display_name: String,
pub created_by: UserId,
pub description: String,
pub member_count: u32,
pub image: ImageId,
pub created_at: DateTime<Utc>,
pub last_edited: Option<DateTime<Utc>>,
pub joined: bool,
}
make_path_parts!(CircleCreatePath => "/v1/circle");
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CircleCreateRequest {
pub display_name: String,
pub description: String,
pub image: ImageId,
}
make_path_parts!(UpdateCirclePath => "/v1/circle/{}" => CircleId);
#[derive(Serialize, Deserialize, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct CircleUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub image: Option<ImageId>,
}
make_path_parts!(CircleBrowsePath => "/v1/circle/browse");
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct CircleBrowseQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub creator_id: Option<UserOrMe>,
#[serde(default)]
#[serde(serialize_with = "super::csv_encode_uuids")]
#[serde(deserialize_with = "super::from_csv")]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub users: Vec<UserId>,
#[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>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub order_by: Option<OrderBy>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CircleBrowseResponse {
pub circles: Vec<Circle>,
pub pages: u32,
pub total_circle_count: u64,
}
make_path_parts!(CircleSearchPath => "/v1/circle");
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct CircleSearchQuery {
#[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 creator_id: Option<UserOrMe>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub creator_name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_limit: Option<u32>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CircleSearchResponse {
pub circles: Vec<Circle>,
pub pages: u32,
pub total_circle_count: u64,
}
make_path_parts!(CircleDeletePath => "/v1/circle/{}" => CircleId);
make_path_parts!(CircleGetPath => "/v1/circle/{}" => CircleId);
make_path_parts!(JoinCirclePath => "/v1/circle/{}/join" => CircleId);
make_path_parts!(LeaveCirclePath => "/v1/circle/{}/leave" => CircleId);
make_path_parts!(CircleRemoveMemberPath => "/v1/circle/{}/members/{}" => CircleId, UserId);
make_path_parts!(CircleBrowseMembersPath => "/v1/circle/{}/members" => CircleId);
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct BrowseMembersQuery {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub admin: Option<bool>,
}
#[derive(Serialize, Deserialize)]
pub struct BrowseMembersResponse {
pub members: Vec<UserId>,
pub count: u32,
}
#[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 = "MemberCount")]
MemberCount = 0,
}