use super::super::QueryType;
use crate::{
graphql::ParsedQuery,
schema::CompiledSchema,
security::{AuthzOperation, OperationKind},
};
pub(in crate::runtime::executor) fn root_target<'a>(
schema: &'a CompiledSchema,
kind: OperationKind,
name: &str,
) -> Option<&'a str> {
match kind {
OperationKind::Query => schema.find_query(name).map(|q| q.return_type.as_str()),
OperationKind::Mutation => schema.find_mutation(name).map(|m| m.return_type.as_str()),
OperationKind::Subscription => {
schema.find_subscription(name).map(|s| s.return_type.as_str())
},
}
}
pub(in crate::runtime::executor) fn root_operation(
schema: &CompiledSchema,
kind: OperationKind,
name: &str,
) -> AuthzOperation {
AuthzOperation::root(kind, name, root_target(schema, kind, name))
}
pub(in crate::runtime::executor) fn collect_authz_ops(
query_type: &QueryType,
parsed_for_regular: Option<&ParsedQuery>,
schema: &CompiledSchema,
) -> Vec<AuthzOperation> {
let query = |name: &str| root_operation(schema, OperationKind::Query, name);
match query_type {
QueryType::Regular => parsed_for_regular.map_or_else(Vec::new, |parsed| {
parsed.selections.iter().map(|sel| query(&sel.name)).collect()
}),
QueryType::Aggregate(name) | QueryType::Window(name) | QueryType::Federation(name) => {
vec![query(name)]
},
QueryType::IntrospectionSchema => vec![query("__schema")],
QueryType::IntrospectionType(_) => vec![query("__type")],
QueryType::NodeQuery { .. } => vec![query("node")],
QueryType::Mutation { .. } | QueryType::TypeName { .. } => Vec::new(),
}
}