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, pub is_activate: bool, pub created_at: Option>, pub updated_at: Option>, } #[derive(Debug, Serialize, Deserialize)] pub struct CreateUserInput { pub username: String, pub email: String, pub password: String, pub invite_code: String, pub role: Option, } #[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 for Users { type Error = async_graphql::Error; fn try_from(value: String) -> Result { 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, pub updated_at: DateTime, }