package shop.http.routes import cats._ import cats.implicits._ import org.http4s._ import org.http4s.circe.JsonDecoder import org.http4s.dsl.Http4sDsl import org.http4s.server.Router import shop.algebras.Auth import shop.domain.auth._ import shop.effects._ import shop.http.decoder._ import shop.http.json._ final class UserRoutes[F[_]: Defer: JsonDecoder: MonadThrow]( auth: Auth[F] ) extends Http4sDsl[F] { private[routes] val prefixPath = "/auth" private val httpRoutes: HttpRoutes[F] = HttpRoutes.of[F] { case req @ POST -> Root / "users" => req .decodeR[CreateUser] { user => auth .newUser(user.username.toDomain, user.password.toDomain) .flatMap(Created(_)) .recoverWith { case UserNameInUse(u) => Conflict(u.value) } } } val routes: HttpRoutes[F] = Router( prefixPath -> httpRoutes ) }