veza/veza-chat-server/src/models/mod.rs
2025-12-03 20:33:26 +01:00

115 lines
3 KiB
Rust

pub mod message;
// Ré-exporter les modèles existants
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use std::fmt;
use uuid::Uuid;
/// Utilisateur du système
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct User {
pub id: Uuid,
pub username: String,
pub email: String,
pub display_name: Option<String>,
pub avatar_url: Option<String>,
pub is_active: bool,
pub last_seen: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
/// Conversation (DM ou Room)
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Conversation {
pub id: Uuid,
pub name: Option<String>,
pub description: Option<String>,
pub conversation_type: ConversationType,
pub is_private: bool,
pub created_by: Uuid,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
/// Type de conversation
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type)]
#[sqlx(type_name = "conversation_type")]
pub enum ConversationType {
#[sqlx(rename = "dm")]
DirectMessage,
#[sqlx(rename = "room")]
Room,
}
impl fmt::Display for ConversationType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConversationType::DirectMessage => write!(f, "dm"),
ConversationType::Room => write!(f, "room"),
}
}
}
/// Membre d'une conversation
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ConversationMember {
pub conversation_id: Uuid,
pub user_id: Uuid,
pub role: MemberRole,
pub joined_at: DateTime<Utc>,
pub last_read_at: Option<DateTime<Utc>>,
}
/// Rôle d'un membre
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type)]
#[sqlx(type_name = "member_role")]
pub enum MemberRole {
#[sqlx(rename = "member")]
Member,
#[sqlx(rename = "moderator")]
Moderator,
#[sqlx(rename = "admin")]
Admin,
#[sqlx(rename = "owner")]
Owner,
}
impl fmt::Display for MemberRole {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MemberRole::Member => write!(f, "member"),
MemberRole::Moderator => write!(f, "moderator"),
MemberRole::Admin => write!(f, "admin"),
MemberRole::Owner => write!(f, "owner"),
}
}
}
/// Réaction à un message
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct MessageReaction {
pub id: Uuid,
pub message_id: Uuid,
pub user_id: Uuid,
pub emoji: String,
pub created_at: DateTime<Utc>,
}
/// Session utilisateur
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct UserSession {
pub id: Uuid,
pub user_id: Uuid,
pub token_hash: String,
pub expires_at: DateTime<Utc>,
pub created_at: DateTime<Utc>,
pub last_used_at: Option<DateTime<Utc>>,
pub user_agent: Option<String>,
pub ip_address: Option<String>,
}
// Ré-exporter le nouveau modèle Message
pub use message::{Message, MessageType};