Skip to content

Routes Plugin

To add your own routes you have to implement the trait dev.mongocamp.server.plugin.RoutesPlugin.

Routes are implemented with Tapir Endpoints and activated by Reflection.

Sample

scala
package dev.mongocamp.sample.plugin

import com.typesafe.scalalogging.LazyLogging
import dev.mongocamp.server.exception.ErrorDescription
import dev.mongocamp.server.model.auth.UserInformation
import dev.mongocamp.server.plugin.RoutesPlugin
import sttp.capabilities
import sttp.capabilities.akka.AkkaStreams
import sttp.model.{ Method, StatusCode }
import sttp.tapir.server.ServerEndpoint
import sttp.tapir.stringBody

import scala.concurrent.Future

class SampleRoutes extends RoutesPlugin with LazyLogging {

  override def endpoints: List[ServerEndpoint[AkkaStreams with capabilities.WebSockets, Future]] =
    List(adminTestEndpoint, securedTestEndpoint, unsecuredTestEndpoint)

  lazy val adminTestEndpoint = adminEndpoint
    .in("plugin")
    .in("admin")
    .out(stringBody)
    .tag("Sample Plugin")
    .method(Method.GET)
    .serverLogic(user => parameter => adminOutput(user))

  def adminOutput(userProfile: UserInformation): Future[Either[(StatusCode, ErrorDescription, ErrorDescription), String]] = {
    Future.successful {
      Right {
        s"Hello ${userProfile.userId} you are admin"
      }
    }
  }

  lazy val securedTestEndpoint = securedEndpoint
    .in("plugin")
    .in("secured")
    .out(stringBody)
    .tag("Sample Plugin")
    .method(Method.GET)
    .serverLogic(user => parameter => securedOutput(user))

  def securedOutput(userProfile: UserInformation): Future[Either[(StatusCode, ErrorDescription, ErrorDescription), String]] = {
    Future.successful {
      Right {
        s"Hello ${userProfile.userId} you are secured"
      }
    }
  }

  val unsecuredTestEndpoint = baseEndpoint
    .in("plugin")
    .in("unsecured")
    .out(stringBody)
    .method(Method.GET)
    .tag("Sample Plugin")
    .serverLogic(_ => unsecureRoute())

  def unsecureRoute(): Future[Either[(StatusCode, ErrorDescription, ErrorDescription), String]] = {
    Future.successful(Right("unsecure route"))
  }

}

Released under the Apache License 2.0.