/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.12.8 * User agent: apibuilder app.apibuilder.io/apicollective/apibuilder-generator/0.12.8/http4s_0_20 */ package io.apibuilder.generator.v0.server import org.http4s.circe.decodeUri import org.http4s.circe.encodeUri import org.http4s.dsl.{io => _, _} import org.http4s.implicits._ import cats.effect._ import cats.implicits._ import io.apibuilder.common.v0.models.json._ import io.apibuilder.generator.v0.models.json._ import io.apibuilder.spec.v0.models.json._ private[server] trait Matchers[F[_]] extends Http4sDsl[F] { implicit lazy val queryParamDecodeBigDecimal: org.http4s.QueryParamDecoder[BigDecimal] = org.http4s.QueryParamDecoder.fromUnsafeCast[BigDecimal](p => BigDecimal(p.value))("BigDecimal") implicit lazy val queryParamDecodeInstant: org.http4s.QueryParamDecoder[_root_.java.time.Instant] = org.http4s.QueryParamDecoder.fromUnsafeCast[_root_.java.time.Instant](p => _root_.java.time.OffsetDateTime.parse(p.value).toInstant)("_root_.java.time.Instant") implicit lazy val queryParamDecodeLocalDate: org.http4s.QueryParamDecoder[_root_.java.time.LocalDate] = org.http4s.QueryParamDecoder.fromUnsafeCast[_root_.java.time.LocalDate](p => _root_.java.time.LocalDate.parse(p.value))("_root_.java.time.LocalDate") implicit lazy val queryParamDecodeUUID: org.http4s.QueryParamDecoder[_root_.java.util.UUID] = org.http4s.QueryParamDecoder.fromUnsafeCast[_root_.java.util.UUID](p => _root_.java.util.UUID.fromString(p.value))("_root_.java.util.UUID") object ApiVersion { val ApiVersionMajor = { "X-Apidoc-Version-Major".ci } def apply(req: org.http4s.Message[F]): Boolean = req.headers.get(ApiVersionMajor) match { case Some(v) if v.value == "0" => true case _ => false } } object KeyOptStringMatcher extends OptionalQueryParamDecoderMatcher[String]("key") object LimitInt0Def100Matcher extends QueryParamDecoderMatcher[Int]("limit") { override def unapply(params: Map[String, Seq[String]]) = super.unapply(params).orElse(Some(100)).filter(_ >= 0) } object OffsetInt0Def0Matcher extends QueryParamDecoderMatcher[Int]("offset") { override def unapply(params: Map[String, Seq[String]]) = super.unapply(params).orElse(Some(0)).filter(_ >= 0) } } trait GeneratorRoutes[F[_]] extends Matchers[F] { implicit def circeJsonDecoder[A](implicit decoder: _root_.io.circe.Decoder[A], sync: Sync[F]) = org.http4s.circe.jsonOf[F, A] implicit def circeJsonEncoder[A](implicit encoder: _root_.io.circe.Encoder[A], sync: Sync[F]) = org.http4s.circe.jsonEncoderOf[F, A] sealed trait GetResponse object GetResponse { case class HTTP200(value: Seq[io.apibuilder.generator.v0.models.Generator], headers: Seq[org.http4s.Header] = Nil) extends GetResponse case class UndocumentedResponse(response: F[org.http4s.Response[F]]) extends GetResponse } def get( _req: org.http4s.Request[F], key: _root_.scala.Option[String], limit: Int, offset: Int ): F[GetResponse] sealed trait GetByKeyResponse object GetByKeyResponse { case class HTTP200(value: io.apibuilder.generator.v0.models.Generator, headers: Seq[org.http4s.Header] = Nil) extends GetByKeyResponse case class HTTP404(headers: Seq[org.http4s.Header] = Nil) extends GetByKeyResponse case class UndocumentedResponse(response: F[org.http4s.Response[F]]) extends GetByKeyResponse } def getByKey( _req: org.http4s.Request[F], key: String ): F[GetByKeyResponse] def apiVersionMatch(req: org.http4s.Message[F]): Boolean = ApiVersion(req) def service()(implicit sync: Sync[F]) = org.http4s.HttpRoutes.of[F] { case _req @ GET -> Root / "generators" :? KeyOptStringMatcher(key) +& LimitInt0Def100Matcher(limit) +& OffsetInt0Def0Matcher(offset) if apiVersionMatch(_req) => get(_req, key, limit, offset).flatMap { case GetResponse.HTTP200(value, headers) => Ok(value, headers: _*) case GetResponse.UndocumentedResponse(response) => response } case _req @ GET -> Root / "generators" :? KeyOptStringMatcher(key) +& LimitInt0Def100Matcher(limit) +& OffsetInt0Def0Matcher(offset) if !_req.headers.get(ApiVersion.ApiVersionMajor).isDefined => BadRequest(s"Missing required request header: ${ApiVersion.ApiVersionMajor}.") case _req @ GET -> Root / "generators" / key if apiVersionMatch(_req) => getByKey(_req, key).flatMap { case GetByKeyResponse.HTTP200(value, headers) => Ok(value, headers: _*) case GetByKeyResponse.HTTP404(headers) => NotFound(headers: _*) case GetByKeyResponse.UndocumentedResponse(response) => response } case _req @ GET -> Root / "generators" / key if !_req.headers.get(ApiVersion.ApiVersionMajor).isDefined => BadRequest(s"Missing required request header: ${ApiVersion.ApiVersionMajor}.") } } trait HealthcheckRoutes[F[_]] extends Matchers[F] { implicit def circeJsonDecoder[A](implicit decoder: _root_.io.circe.Decoder[A], sync: Sync[F]) = org.http4s.circe.jsonOf[F, A] implicit def circeJsonEncoder[A](implicit encoder: _root_.io.circe.Encoder[A], sync: Sync[F]) = org.http4s.circe.jsonEncoderOf[F, A] sealed trait GetResponse object GetResponse { case class HTTP200(value: io.apibuilder.generator.v0.models.Healthcheck, headers: Seq[org.http4s.Header] = Nil) extends GetResponse case class UndocumentedResponse(response: F[org.http4s.Response[F]]) extends GetResponse } def get( _req: org.http4s.Request[F] ): F[GetResponse] def apiVersionMatch(req: org.http4s.Message[F]): Boolean = ApiVersion(req) def service()(implicit sync: Sync[F]) = org.http4s.HttpRoutes.of[F] { case _req @ GET -> Root / "_internal_" / "healthcheck" if apiVersionMatch(_req) => get(_req).flatMap { case GetResponse.HTTP200(value, headers) => Ok(value, headers: _*) case GetResponse.UndocumentedResponse(response) => response } case _req @ GET -> Root / "_internal_" / "healthcheck" if !_req.headers.get(ApiVersion.ApiVersionMajor).isDefined => BadRequest(s"Missing required request header: ${ApiVersion.ApiVersionMajor}.") } } trait InvocationRoutes[F[_]] extends Matchers[F] { implicit def circeJsonDecoder[A](implicit decoder: _root_.io.circe.Decoder[A], sync: Sync[F]) = org.http4s.circe.jsonOf[F, A] implicit def circeJsonEncoder[A](implicit encoder: _root_.io.circe.Encoder[A], sync: Sync[F]) = org.http4s.circe.jsonEncoderOf[F, A] sealed trait PostByKeyResponse object PostByKeyResponse { case class HTTP200(value: io.apibuilder.generator.v0.models.Invocation, headers: Seq[org.http4s.Header] = Nil) extends PostByKeyResponse case class HTTP409(value: Seq[io.apibuilder.generator.v0.models.Error], headers: Seq[org.http4s.Header] = Nil) extends PostByKeyResponse case class UndocumentedResponse(response: F[org.http4s.Response[F]]) extends PostByKeyResponse } def postByKey( _req: org.http4s.Request[F], key: String, body: => org.http4s.DecodeResult[F, io.apibuilder.generator.v0.models.InvocationForm] ): F[PostByKeyResponse] def apiVersionMatch(req: org.http4s.Message[F]): Boolean = ApiVersion(req) def service()(implicit sync: Sync[F]) = org.http4s.HttpRoutes.of[F] { case _req @ POST -> Root / "invocations" / key if apiVersionMatch(_req) => postByKey(_req, key, _req.attemptAs[io.apibuilder.generator.v0.models.InvocationForm]).flatMap { case PostByKeyResponse.HTTP200(value, headers) => Ok(value, headers: _*) case PostByKeyResponse.HTTP409(value, headers) => Conflict(value, headers: _*) case PostByKeyResponse.UndocumentedResponse(response) => response } case _req @ POST -> Root / "invocations" / key if !_req.headers.get(ApiVersion.ApiVersionMajor).isDefined => BadRequest(s"Missing required request header: ${ApiVersion.ApiVersionMajor}.") } }