带有EitherT结果的Sangria GraphQL Schema

时间:2018-03-01 11:49:36

标签: scala playframework graphql scala-cats sangria

我使用Sangria作为Play应用程序,目前正在努力实现模式定义。问题是,服务不直接返回所需的对象,它返回包含对象的EitherT。

以下是一些代码示例

案例类

case class User(name: String, age: Int)

UserService

def user(): EitherT[Future, AbstractError, User] = {...}

如果服务返回User而不是EitherT[Future, AbstractError, User],我会得到这样的架构:

模式

  val UserType = deriveObjectType[UserService, User]( 
      ObjectTypeName("User"),
      ObjectTypeDescription("A simple user."))

我是否必须实现一个额外的层来从User对象中提取EitherT,还是有其他方法来处理这种情况?

2 个答案:

答案 0 :(得分:1)

您仍然可以派生User对象类型,因为它只是一个简单的案例类。对于加载用户并返回EitherT的其他GraphQL字段,您需要将值转换为sangria可以使用的值(这意味着需要手动定义这些字段,但您仍然可以使用{{1} }其他字段的宏)。最简单的方法是将其折叠成简单的derive*Future[User]能够保存错误或成功结果。如果你在Future内有一个错误列表,那么你可以将它包装在一些自定义异常中,然后在Either中展开并正确呈现它。

答案 1 :(得分:0)

您还可以在架构中的某处使用从猫EitherT到桑格利亚FutureValue的隐式转换:

implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))