Como criar um esquema graphql que podem ser pesquisados ​​em diferentes campos?

votos
2

Eu estou testando sangria para construir um servidor graphql / relé. Eu tenho uma classe de usuário muito simples:

case class User(
  id: Int,
  username: String,
  gender: Gender.Value)

Eu quero permitir consultas por qualquer ID ou nome de usuário. Eu criei um esquema que permite isso, mas os campos têm nomes diferentes:

val Query = ObjectType(
  Query, fields[UserRepo, Unit](
    Field(user, OptionType(User),
      arguments = ID :: Nil,
      resolve = ctx => ctx.ctx.getUser(ctx arg ID)),
    Field(userByUsername, OptionType(User),
      arguments = Username :: Nil,
      resolve = ctx => ctx.ctx.getUserByUsername(ctx arg Username))
  ))

Infelizmente, eu preciso consultar esses com nomes diferentes campos, usere userByUsername, por exemplo:

curl -G localhost:8080/graphql     
  --data-urlencode 'query={userByUsername(username: Leia Skywalker) {id, username, gender}}'

ou

curl -G localhost:8080/graph    
  --data-urlencode query={user(id: 1025) {id, username, gender}}

Como posso criar um esquema que permite que um único campo chamado usera ser consultado em qualquer ID ou nome de usuário? Por exemplo, ambos do seguinte deve retornar o mesmo objeto de usuário:

curl -G localhost:8080/graphql     
  --data-urlencode 'query={user(username: Leia Skywalker) {id, username, gender}}'

ou

curl -G localhost:8080/graph    
  --data-urlencode query={user(id: 1025) {id, username, gender}}
Publicado 23/08/2015 em 20:37
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Eu finalmente trabalhou com isso:

val ID = Argument("id", OptionInputType(IntType), description = "id of the user")
val Username = Argument("username", OptionInputType(StringType), description = "username of the user")

val Query = ObjectType(
  "Query", fields[UserRepo, Unit](
    Field("user", OptionType(User),
      arguments = List(ID, Username),
      resolve = ctx => ctx.ctx.getUser(ctx.argOpt(ID), ctx.argOpt(Username)))
  ))

E getUserse parece com:

def getUser(id: Option[Int], username: Option[String]): Option[User] = {

  if (id.isEmpty && username.isEmpty) {
    None
  }
  else {
    id.flatMap(i => users.find(_.id == i))
      .orElse(username.flatMap(u => users.find(_.username == u)))
  }
}
Respondeu 23/08/2015 em 21:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more