use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct TeamListResponse {
pub teams: Vec<TeamResponse>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct TeamResponse {
pub id: String,
pub name: String,
pub membership: TeamMembership,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct TeamMembersResponse {
pub members: Vec<TeamMembership>,
pub invites: Vec<TeamInvite>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct TeamMembership {
pub user_id: String,
pub role: TeamRole,
pub nickname: Option<String>,
pub picture: Option<String>,
pub email: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct TeamInvite {
pub id: String,
pub email: String,
pub role: TeamRole,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Display, EnumString)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub enum TeamRole {
Owner,
Admin,
Member,
#[cfg(feature = "unknown-variants")]
#[doc(hidden)]
#[typeshare(skip)]
#[serde(untagged, skip_serializing)]
#[strum(default, to_string = "Unknown: {0}")]
Unknown(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct AddTeamMemberRequest {
pub user_id: Option<String>,
pub email: Option<String>,
pub role: Option<TeamRole>,
}