use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum InvitationMode {
Approval,
Direct,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum InvitationStatus {
Pending,
Opened,
Accepted,
Expired,
Revoked,
Exhausted,
}
impl InvitationStatus {
pub fn as_str(self) -> &'static str {
match self {
Self::Pending => "pending",
Self::Opened => "opened",
Self::Accepted => "accepted",
Self::Expired => "expired",
Self::Revoked => "revoked",
Self::Exhausted => "exhausted",
}
}
}
impl std::fmt::Display for InvitationStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Invitation {
pub id: Uuid,
pub token: String,
pub group_id: Uuid,
pub invited_by: Uuid,
pub mode: InvitationMode,
pub invitee_email: Option<String>,
pub role: String,
pub max_uses: u16,
pub use_count: u16,
pub allow_multi_ip: bool,
pub status: InvitationStatus,
pub opened_at: Option<DateTime<Utc>>,
pub opened_ip: Option<String>,
pub opened_ua: Option<String>,
pub expires_at: DateTime<Utc>,
pub accepted_at: Option<DateTime<Utc>>,
pub accepted_by: Option<Uuid>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateInvitationParams {
pub group_id: Uuid,
pub mode: InvitationMode,
pub invitee_email: Option<String>,
pub role: Option<String>,
pub max_uses: Option<u16>,
pub allow_multi_ip: Option<bool>,
pub ttl_secs: Option<u64>,
pub open_window_secs: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcceptInvitationParams {
pub token: String,
pub username: String,
pub password: String,
pub email: Option<String>,
pub client_ip: Option<String>,
pub client_ua: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenInvitationResult {
pub token: String,
pub group_id: Uuid,
pub group_name: Option<String>,
pub invited_by_name: Option<String>,
pub window_remaining_secs: i64,
}