mmap/src/models/user.rs
2025-07-30 21:32:14 +08:00

89 lines
2.0 KiB
Rust

use async_graphql::{Enum, SimpleObject};
use chrono::{DateTime, Utc};
use sea_query::Iden;
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, Enum, Copy, PartialEq, Eq, sqlx::Type)]
#[sqlx(type_name = "VARCHAR", rename_all = "PascalCase")]
pub enum Role {
User,
Admin,
}
impl Default for Role {
fn default() -> Self {
Role::User
}
}
#[derive(Debug, Clone, FromRow, SimpleObject)]
pub struct User {
pub id: Uuid,
pub username: String,
pub email: String,
#[graphql(skip)]
pub password_hash: String,
pub role: Role,
pub invite_code_id: Option<Uuid>,
pub is_activate: bool,
pub created_at: Option<DateTime<Utc>>,
pub updated_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateUserInput {
pub username: String,
pub email: String,
pub password: String,
pub invite_code: String,
pub role: Option<Role>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LoginInput {
pub username: String,
pub password: String,
}
#[derive(Iden, PartialEq, Eq)]
pub enum Users {
Table,
Id,
Username,
Email,
Role,
IsActivate,
CreatedAt,
UpdatedAt,
}
impl TryFrom<String> for Users {
type Error = async_graphql::Error;
fn try_from(value: String) -> Result<Self, Self::Error> {
match value.as_str() {
"id" => Ok(Users::Id),
"username" => Ok(Users::Username),
"email" => Ok(Users::Email),
"role" => Ok(Users::Role),
"is_activate" => Ok(Users::IsActivate),
"created_at" => Ok(Users::CreatedAt),
"updated_at" => Ok(Users::UpdatedAt),
_ => Err(async_graphql::Error::new("Invalid column name")),
}
}
}
#[derive(sqlx::FromRow, Debug, SimpleObject)]
pub struct UserInfoRow {
pub id: Uuid,
pub username: String,
pub email: String,
pub role: Role,
pub is_activate: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}