Как создать вложенные поля 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!
}
Другие вопросы по тегам