use super::{project::MemberPermission, workspace::WorkspaceReference};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct UserReference {
pub gid: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub resource_type: Option<String>,
#[serde(default)]
pub email: Option<String>,
}
impl UserReference {
#[must_use]
pub fn label(&self) -> String {
self.name
.clone()
.or_else(|| self.email.clone())
.unwrap_or_else(|| self.gid.clone())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct UserIdentity {
pub resource: String,
#[serde(default)]
pub role: Option<MemberPermission>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[allow(
clippy::struct_field_names,
reason = "field names mirror the Asana API JSON keys; renaming to satisfy the lint would break serde mapping"
)]
pub struct UserPhoto {
#[serde(rename = "image_21x21")]
#[serde(default)]
pub image_21x21: Option<String>,
#[serde(rename = "image_27x27")]
#[serde(default)]
pub image_27x27: Option<String>,
#[serde(rename = "image_36x36")]
#[serde(default)]
pub image_36x36: Option<String>,
#[serde(rename = "image_60x60")]
#[serde(default)]
pub image_60x60: Option<String>,
#[serde(rename = "image_128x128")]
#[serde(default)]
pub image_128x128: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct User {
pub gid: String,
pub name: String,
#[serde(default)]
pub email: Option<String>,
#[serde(default)]
pub resource_type: Option<String>,
#[serde(default)]
pub photo: Option<UserPhoto>,
#[serde(default)]
pub workspaces: Vec<WorkspaceReference>,
}
#[derive(Debug, Clone)]
pub struct UserListParams {
pub workspace_gid: String,
pub limit: Option<usize>,
}