89 lines
2.0 KiB
Rust
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>,
|
|
}
|