use std::collections::HashMap;
use serde::{Deserialize, Serialize, Serializer};
use crate::model::{
shared::{Debt, Image},
users::User,
};
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub(crate) struct GroupsWrapper {
pub groups: Vec<Group>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub(crate) struct GroupWrapper {
pub group: Group,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Group {
pub id: Option<i64>,
pub name: Option<String>,
pub group_type: Option<String>,
pub updated_at: Option<chrono::DateTime<chrono::Utc>>,
pub simplify_by_default: Option<bool>,
pub members: Option<Vec<User>>,
pub original_debts: Option<Vec<Debt>>,
pub simplified_debts: Option<Vec<Debt>>,
pub avatar: Option<Image>,
pub custom_avatar: Option<bool>,
pub cover_photo: Option<Image>,
pub invite_link: Option<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupCreateRequest {
pub name: String,
pub group_type: Option<String>,
pub simplify_by_default: Option<bool>,
#[serde(flatten)]
#[serde(serialize_with = "serialize_option_vec_create_group_user")]
#[serde(skip_serializing_if = "Option::is_none")]
pub users: Option<Vec<GroupUser>>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupUser {
pub user_id: Option<i64>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub email: Option<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupDeleteResponse {
pub success: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupRestoreResponse {
pub success: bool,
pub errors: Option<Vec<String>>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub(crate) struct GroupAddUserRequest {
pub group_id: i64,
pub user_id: Option<i64>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub email: Option<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupAddUserResponse {
pub success: bool,
pub user: Option<User>,
pub errors: Option<HashMap<String, Vec<String>>>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub(crate) struct GroupRemoveUserRequest {
pub group_id: i64,
pub user_id: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GroupRemoveUserResponse {
pub success: bool,
pub errors: Option<Vec<String>>,
}
fn serialize_option_vec_create_group_user<S: Serializer>(
vec: &Option<Vec<GroupUser>>,
serializer: S,
) -> Result<S::Ok, S::Error> {
let mut map = HashMap::new();
if let Some(v) = vec {
for (i, user) in v.iter().enumerate() {
if let Some(ref user_id) = user.user_id {
map.insert(format!("users__{}__user_id", i), user_id.to_string());
}
if let Some(ref first_name) = user.first_name {
map.insert(format!("users__{}__first_name", i), first_name.to_string());
}
if let Some(ref last_name) = user.last_name {
map.insert(format!("users__{}__last_name", i), last_name.to_string());
}
if let Some(ref email) = user.email {
map.insert(format!("users__{}__email", i), email.to_string());
}
}
}
map.serialize(serializer)
}