use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct User {
pub id: Uuid,
pub email: String,
#[serde(skip_serializing)]
pub password_hash: String,
pub email_verified_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
pub gdpr_consent_at: Option<DateTime<Utc>>,
pub gdpr_consent_version: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateUser {
pub email: String,
pub password_hash: String,
pub gdpr_consent_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Session {
pub id: Uuid,
pub user_id: Uuid,
#[serde(skip_serializing)]
pub refresh_token_hash: String,
pub device_fingerprint: Option<String>,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
pub revoked_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone)]
pub struct CreateSession {
pub user_id: Uuid,
pub refresh_token_hash: String,
pub device_fingerprint: Option<String>,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Profile {
pub user_id: Uuid,
pub display_name: Option<String>,
pub avatar_url: Option<String>,
pub timezone: String,
pub locale: String,
pub preferences: serde_json::Value,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ApiKeyRecord {
pub id: Uuid,
pub user_id: Uuid,
pub name: String,
pub key_prefix: String,
#[serde(skip_serializing)]
pub key_hash: String,
pub scopes: Vec<String>,
pub rate_limit_rpm: Option<i32>,
pub last_used_at: Option<DateTime<Utc>>,
pub expires_at: Option<DateTime<Utc>>,
pub revoked_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone)]
pub struct CreateApiKey {
pub user_id: Uuid,
pub name: String,
pub key_prefix: String,
pub key_hash: String,
pub scopes: Vec<String>,
pub rate_limit_rpm: Option<i32>,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Setting {
pub id: Uuid,
pub user_id: Uuid,
pub key: String,
pub value: serde_json::Value,
pub version: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, FromRow)]
pub struct EmailVerificationToken {
pub id: Uuid,
pub user_id: Uuid,
pub token_hash: String,
pub expires_at: DateTime<Utc>,
pub used_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, FromRow)]
pub struct PasswordResetToken {
pub id: Uuid,
pub user_id: Uuid,
pub token_hash: String,
pub expires_at: DateTime<Utc>,
pub used_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
}