Home > OS >  Pattern type is incompatible with expected type?
Pattern type is incompatible with expected type?

Time:01-11

I am trying to create a post endpoint for a particular route but am getting the error message

Pattern type is incompatible with expected type found ContextRequest[F,A], required: Request[F]

    case _ @ POST -> Root / "batch-notify" as _ =>
      handler.handle("create.notifications.batchNotify") {
        for {
          _ <- log.info("Running batch notification job") *> Sync[F].pure(())
          r <- batchingService.createNotifications.flatMap(_ => Ok())
        } yield r
      }.fireAndForget.flatMap(_ => Accepted())

I'm quite new to Scala and have tried fixing it but getting nowhere, would anyone be able to help?

CodePudding user response:

_ @ POST -> Root / "batch-notify" as _

aka

POST -> Root / "batch-notify" as _ 

aka

POST -> Root / "batch-notify" as user

is an AuthedRequest used for AuthedRoutes

https://http4s.org/v1/docs/auth.html

If you put it into a pattern matching where Request is expected for HttpRoutes (i.e. without authentication)

https://http4s.org/v1/docs/service.html

then you'll have a compile error

pattern type is incompatible with expected type;
 found   : org.http4s.AuthedRequest[F,A]
    (which expands to)  org.http4s.ContextRequest[F,A]
 required: org.http4s.Request[F]

You can find example how to combine AuthedRoutes with HttpRoutes at https://http4s.org/v1/docs/auth.html#composing-authenticated-routes

val spanishRoutes: AuthedRoutes[User, IO] =
    AuthedRoutes.of {
        case GET -> Root / "hola" as user => Ok(s"Hola, ${user.name}")
    }

val frenchRoutes: HttpRoutes[IO] =
    HttpRoutes.of {
        case GET -> Root / "bonjour" => Ok(s"Bonjour")
    }

val serviceSpanish: HttpRoutes[IO] =
  middleware(spanishRoutes) < > frenchRoutes
  • Related