gitea_pages/backend/src/api/models/user.rs

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