This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sttp.tapir.examples | |
import org.http4s._ | |
import org.http4s.server.Router | |
import org.http4s.server.blaze.BlazeServerBuilder | |
import org.http4s.syntax.kleisli._ | |
import zio.interop.catz._ | |
import zio.{Has, RIO, Runtime, ZIO, ZLayer} | |
import org.http4s.dsl.Http4sDsl | |
import zio.clock.Clock |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.softwaremill.test; | |
import akka.actor.ActorSystem; | |
import akka.kafka.CommitterSettings; | |
import akka.kafka.ConsumerMessage; | |
import akka.kafka.ConsumerSettings; | |
import akka.kafka.Subscriptions; | |
import akka.kafka.javadsl.Committer; | |
import akka.kafka.javadsl.Consumer; | |
import akka.stream.OverflowStrategy; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object Server { | |
import Endpoints._ | |
import scala.concurrent.Future | |
import scala.concurrent.ExecutionContext.Implicits.global | |
// should fail with Error if user not found | |
def authorize(authToken: AuthToken): Future[Either[Error, User]] = ??? | |
def findPetForUser(user: User, id: UUID): Future[Either[Error, Option[Pet]]] = ??? | |
def addPetToUser(user: User, pet: Pet): Future[Either[Error, Unit]] = ??? |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.UUID | |
import io.circe.generic.auto._ | |
import sttp.model.StatusCode | |
import sttp.tapir._ | |
import sttp.tapir.json.circe._ | |
object Endpoints { | |
case class AuthToken(token: String) | |
case class Error(msg: String, statusCode: StatusCode) extends Exception | |
case class User(id: UUID, name: String) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// the endpoints are interpreted as an http4s.HttpRoutes[IO] | |
import sttp.tapir.server.http4s._ | |
import org.http4s.HttpRoutes | |
implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global | |
implicit val contextShift: ContextShift[IO] = IO.contextShift(ec) | |
implicit val timer: Timer[IO] = IO.timer(ec) | |
val routes: HttpRoutes[IO] = List(getPetWithLogic, addPetWithLogic).toRoutes | |
// expose routes using http4s |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
val getPetWithLogic = | |
secureEndpoint | |
.get | |
.in(query[UUID]("id").description("The id of the pet to find")) | |
.out(jsonBody[Pet]) | |
.description("Finds a pet by id") | |
.serverLogic { | |
case (user, id) => | |
findPetForUser(user, id).map { | |
case Right(Some(pet)) => Right(pet) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sttp.tapir.json.circe._ | |
import io.circe.generic.auto._ | |
import sttp.tapir.server.PartialServerEndpoint | |
val error: EndpointOutput[Error] = stringBody.and(statusCode).mapTo(Error) | |
val secureEndpoint: PartialServerEndpoint[User, Unit, Error, Unit, Nothing, IO] = | |
endpoint | |
.in(auth.bearer[String].mapTo(AuthToken)) | |
.in("api" / "1.0") | |
.errorOut(error) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.UUID | |
import cats.effect.{ContextShift, IO, Timer} | |
import sttp.tapir._ | |
import sttp.model.StatusCode | |
case class AuthToken(token: String) | |
case class Error(msg: String, statusCode: StatusCode) | |
case class User(id: UUID, name: String) | |
case class Pet(id: UUID, kind: String, name: String) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// the endpoints are now interpreted as an akka.http.scaladsl.Route | |
import akka.http.scaladsl.server.Route | |
import sttp.tapir.server.akkahttp._ | |
val routes: Route = List(getPetWithLogic, addPetWithLogic).toRoute | |
// expose routes using akka-http |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import scala.concurrent.Future | |
import scala.concurrent.ExecutionContext.Implicits.global | |
// should fail with Error if user not found | |
def authorize(authToken: AuthToken): Future[User] = ??? | |
def findPetForUser(user: User, id: UUID): Future[Option[Pet]] = ??? | |
def addPetToUser(user: User, pet: Pet): Future[Unit] = ??? | |
val getPetWithLogic = getPet.serverLogicRecoverErrors { | |
case (authToken, id) => |