📜  graphql 标量 - Scala (1)

📅  最后修改于: 2023-12-03 14:41:37.934000             🧑  作者: Mango

GraphQL 标量 - Scala

GraphQL 标量是 GraphQL 中的一种数据类型,它表示一个单值(即不可拆分的值),比如整数、字符串等。在 Scala 中,我们可以通过自定义 GraphQL 标量来扩展 GraphQL 的默认数据类型。

创建 GraphQL 标量

在 Scala 中,我们可以通过定义一个类继承 ScalarType 类来创建自定义的 GraphQL 标量。下面是一个创建自定义标量 DateTime 的示例代码:

import sangria.schema.ScalarType
import sangria.ast._
import sangria.validation.{ValueCoercionViolation, IntCoercionViolation}

import scala.util.{Try, Success, Failure}
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

case object DateTimeType extends ScalarType[LocalDateTime]("DateTime") {
  override def coerceOutput(dateTime: LocalDateTime, typeTag: ScalarType[Any]): Any = 
    dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)

  override def coerceInput(input: Any): Try[LocalDateTime] = input match {
    case s: String => Try(LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME))
    case _ => Failure(DateTimeCoercionViolation)
  }

  override def coerceUserInput(input: Any): Try[LocalDateTime] = input match {
    case s: String => Try(LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME))
    case _ => Failure(DateTimeCoercionViolation)
  }
}

case object DateTimeCoercionViolation extends ValueCoercionViolation("DateTime value expected")

上面代码中,我们创建了一个名为 DateTime 的标量类型,并重写了三个方法:

  • coerceOutput:用于将 LocalDateTime 类型转换为 GraphQL 输出值。
  • coerceInput:用于将输入的值转换为 LocalDateTime 类型。
  • coerceUserInput:用于将用户输入的值转换为 LocalDateTime 类型。
注册 GraphQL 标量

我们可以将上面创建的标量类型注册到 GraphQL Schema 中,从而在 GraphQL 查询中使用它。下面是一个示例代码:

import sangria.schema._

val MySchema = Schema(
  query = QueryType,
  mutation = None,
  subscription = None,
  additionalTypes = Seq(DateTimeType)
)

上面代码中,我们将 DateTimeType 添加到了 additionalTypes 中,使其成为了 Schema 的一部分。

使用 GraphQL 标量

创建和注册标量类型之后,我们可以在 GraphQL 查询中使用它。下面是一个查询示例:

query {
  search(start: "2022-01-01T00:00:00", end: "2022-01-31T23:59:59") {
    id
    title
    createdAt(type: DateTime)
  }
}

上面的查询中,我们使用了自定义的 DateTime 标量类型来表示 createdAt 字段的值。在执行查询时,GraphQL 引擎会自动调用 coerceOutput 方法将 LocalDateTime 类型转换为字符串类型。

总结

通过创建自定义的 GraphQL 标量类型,我们可以扩展 GraphQL 的默认数据类型,并在 GraphQL 查询中使用它。在 Scala 中,我们可以通过继承 ScalarType 类来创建自定义标量类型,并在 Schema 中注册它。