diff --git a/src/domain/user/entities.rs b/src/domain/user/entities.rs index 1a98c2d..a6366ed 100644 --- a/src/domain/user/entities.rs +++ b/src/domain/user/entities.rs @@ -1,15 +1,15 @@ -use sqlx; +use sqlx::Row; use frunk::LabelledGeneric; use crate::{ relay::Base64Cursor, - scalar::{Id, Time}, + scalar::{self, Time, Ulid}, }; -#[derive(Debug, Clone, sqlx::FromRow, LabelledGeneric)] +#[derive(Debug, Clone, LabelledGeneric)] pub struct User { - pub id: Id, + pub id: Ulid, pub created_at: Time, pub updated_at: Time, pub name: String, @@ -17,6 +17,26 @@ pub struct User { pub full_name: Option, } +impl<'r> sqlx::FromRow<'r, sqlx::postgres::PgRow> for User { + fn from_row(row: &'r sqlx::postgres::PgRow) -> Result { + let id: String = row.try_get("id")?; + let created_at: Time = row.try_get("created_at")?; + let updated_at: Time = row.try_get("updated_at")?; + let name: String = row.try_get("name")?; + let email: String = row.try_get("email")?; + let full_name: Option = row.try_get("full_name")?; + + Ok(Self { + id: id.parse().expect("failed to parse Id"), + created_at, + updated_at, + name, + email, + full_name, + }) + } +} + #[derive(Debug, LabelledGeneric)] pub struct UserEdge { pub node: User, @@ -25,7 +45,7 @@ pub struct UserEdge { impl From for UserEdge { fn from(user: User) -> Self { - let cursor = Base64Cursor::new(user.id).encode(); + let cursor = Base64Cursor::new(scalar::uid::Ulid(*user.id)).encode(); Self { node: user, cursor } } }