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> { 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::(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()), ) } }