Как создать вложенные поля GraphQL с помощью аннотации Sangria `@GraphQLField`
У меня простой case class MyContext(queries: Query)
который я предоставляю схеме: sangria.schema.Schema(deriveContextObjectType[MyContext, Query, Unit](_.queries)
MyQuery
это черта Query
trait MyQuery {
@GraphQLField
def item(ctx: Context[MyContext, Unit])(id: String) ...
}
Это прекрасно работает. Но что, если я хочу вложить резольверы?
query {
item {
status # status is resolved from source B
price # price is resolved from source C
}
}
Это возможно достичь? Вернул бы я ObjectType[Item]
это имеет свойства status
а также price
с пометкой @GraphQLField
?
2 ответа
Я думаю, что вы можете использовать deriveObjectType
для Item
, Он также может обрабатывать @GraphQLField
аннотация (в качестве альтернативы вы также можете использовать IncludeMethods
настройка макроса). Вот пример:
implicit val ItemType = deriveObjectType[MyContext, Item]()
Действительно ценю ответ @tenhi! Я пытался использовать deriveObjectType
но получаю ошибку типа:
type mismatch;
found : sangria.schema.Context[MyContext,Item]
required: sangria.schema.Context[MyContext,Unit]
Но используя deriveContextObjectType
в сочетании с AddFields
работает:
def schema = sangria.schema.Schema(
deriveContextObjectType[MyContext, Query, Unit](_.queries,
AddFields(
Field(
name = "item",
fieldType = deriveContextObjectType[MyContext, Item, Unit](_ => new Item),
resolve = _ => ()
)
))
)
И схема выглядит хорошо, уступая:
type Query {
item: Item!
}