pub mod mutation;
pub mod query;
pub mod types;
use async_graphql::{http::GraphiQLSource, EmptySubscription, Schema};
use async_graphql_axum::{GraphQLRequest, GraphQLResponse};
use axum::{extract::State, response::{Html, IntoResponse}, Extension};
use llm_registry_service::ServiceRegistry;
use std::sync::Arc;
use crate::auth::AuthUser;
pub use mutation::Mutation;
pub use query::Query;
pub type AppSchema = Schema<Query, Mutation, EmptySubscription>;
pub fn build_schema(services: Arc<ServiceRegistry>) -> AppSchema {
Schema::build(Query, Mutation, EmptySubscription)
.data(services)
.finish()
}
pub async fn graphql_handler(
State(schema): State<AppSchema>,
auth_user: Option<Extension<AuthUser>>,
req: GraphQLRequest,
) -> GraphQLResponse {
let mut request = req.into_inner();
if let Some(Extension(user)) = auth_user {
request = request.data(user);
}
schema.execute(request).await.into()
}
pub async fn graphql_playground() -> impl IntoResponse {
Html(
GraphiQLSource::build()
.endpoint("/graphql")
.title("LLM Registry GraphQL Playground")
.finish(),
)
}
#[cfg(all(test, feature = "incomplete_tests"))]
mod tests {
use super::*;
#[test]
fn test_schema_creation() {
use llm_registry_db::DatabaseConfig;
use llm_registry_service::ServiceRegistry;
let db_config = DatabaseConfig::default();
let services = ServiceRegistry::new(db_config);
let schema = build_schema(Arc::new(services));
assert!(schema.sdl().contains("type Query"));
assert!(schema.sdl().contains("type Mutation"));
}
}