48 lines
1.1 KiB
Rust
48 lines
1.1 KiB
Rust
use diesel::prelude::*;
|
|
use juniper::{graphql_object, FieldResult, IntoFieldError};
|
|
use uuidv7::Uuid;
|
|
|
|
use crate::{
|
|
api::{models, scalars, Context, Error, QueryResultIntoFieldResult},
|
|
db,
|
|
};
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub struct User {
|
|
pub id: Uuid,
|
|
pub name: String,
|
|
}
|
|
|
|
#[graphql_object(context = Context)]
|
|
impl User {
|
|
fn id(&self) -> scalars::Uuid {
|
|
scalars::Uuid(self.id)
|
|
}
|
|
|
|
fn name(&self) -> &str {
|
|
&self.name
|
|
}
|
|
|
|
async fn repositories(
|
|
&self,
|
|
context: &Context,
|
|
) -> FieldResult<Vec<models::repository::Repository>> {
|
|
let db_conn = &mut context.get_db_conn()?;
|
|
let ids = db::schema::repositories::table
|
|
.select(db::schema::repositories::id)
|
|
.filter(db::schema::repositories::user_id.eq(self.id))
|
|
.load::<Uuid>(db_conn)
|
|
.into_field_result()?;
|
|
|
|
context
|
|
.loaders
|
|
.repository
|
|
.try_load_many(ids)
|
|
.await
|
|
.map_or_else(
|
|
|_| Err(Error::Internal.into_field_error()),
|
|
|x| Ok(x.into_values().collect()),
|
|
)
|
|
}
|
|
}
|