Skip to content

Commit

Permalink
add GrpService, update GrpcClient and GrpcServices
Browse files Browse the repository at this point in the history
  • Loading branch information
fupelaqu committed Dec 6, 2023
1 parent 6c6086b commit adb5e26
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 17 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ ThisBuild / organization := "app.softnetwork"

name := "generic-persistence-api"

ThisBuild / version := "0.6.1"
ThisBuild / version := "0.6.2"

ThisBuild / scalaVersion := "2.12.18"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ trait GrpcServer extends PersistenceGuardian with Server {
}
}
case Failure(ex) =>
classicSystem.log.error("Failed to bind HTTP endpoint, terminating system", ex)
classicSystem.log.error(ex, "Failed to bind HTTP endpoint, terminating system")
classicSystem.terminate()
}
}
Expand Down
15 changes: 15 additions & 0 deletions server/src/main/scala/app/softnetwork/api/server/GrpcService.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package app.softnetwork.api.server

import akka.actor.typed.ActorSystem
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.http.scaladsl.server.Directives
import akka.http.scaladsl.server.Route

import scala.concurrent.Future

trait GrpcService extends Directives {

def grpcService: ActorSystem[_] => PartialFunction[HttpRequest, Future[HttpResponse]]

def route: ActorSystem[_] => Route = system => handle(grpcService(system))
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
package app.softnetwork.api.server

import akka.actor.typed.ActorSystem
import akka.grpc.scaladsl.ServiceHandler
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.http.scaladsl.server.Directives.handle
import akka.http.scaladsl.server.Route
import akka.http.scaladsl.server.{Route, RouteConcatenation}

import scala.concurrent.Future
trait GrpcServices extends RouteConcatenation {

trait GrpcServices {

def grpcServices: ActorSystem[_] => Seq[PartialFunction[HttpRequest, Future[HttpResponse]]] = _ =>
Seq.empty
def grpcServices: ActorSystem[_] => Seq[GrpcService] = _ => Seq.empty

final def grpcRoutes: ActorSystem[_] => Route = system =>
handle(
ServiceHandler.concatOrNotFound(
grpcServices(system): _*
)
)
concat(grpcServices(system).map(_.route(system)): _*)

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package app.softnetwork.api.server.client

import akka.actor.typed.ActorSystem
import akka.grpc.scaladsl.AkkaGrpcClient
import akka.grpc.scaladsl.{AkkaGrpcClient, SingleResponseRequestBuilder}

import java.net.PasswordAuthentication
import scala.concurrent.ExecutionContext

trait GrpcClient {
Expand All @@ -13,4 +14,85 @@ trait GrpcClient {
def name: String

def grpcClient: AkkaGrpcClient

/** add headers to grpc request
* @param request
* - grpc request
* @param headers
* - headers
* @tparam Req
* - Request
* @tparam Res
* - Response
* @return
* request with headers
*/
def withHeaders[Req, Res](
request: SingleResponseRequestBuilder[Req, Res],
headers: Seq[(String, String)]
): SingleResponseRequestBuilder[Req, Res] = {
headers.foldLeft(request) { case (acc, (k, v)) =>
acc.addHeader(k, v)
}
}

/** add authorization header to grpc request
* @param request
* - grpc request
* @param value
* - authorization value
* @tparam Req
* - Request
* @tparam Res
* - Response
* @return
* request with authorization header
*/
def withAuthorization[Req, Res](
request: SingleResponseRequestBuilder[Req, Res],
value: String
): SingleResponseRequestBuilder[Req, Res] = {
withHeaders(request, Seq("Authorization" -> value))
}

/** add oauth2 authorization header to grpc request
* @param request
* - grpc request
* @param token
* - oauth2 token
* @tparam Req
* - Request
* @tparam Res
* - Response
* @return
* request with oauth2 authorization
*/
def oauth2[Req, Res](
request: SingleResponseRequestBuilder[Req, Res],
token: String
): SingleResponseRequestBuilder[Req, Res] = {
withAuthorization(request, s"Bearer $token")
}

/** add basic authorization header to grpc request
* @param request
* - grpc request
* @param credentials
* - basic credentials
* @tparam Req
* - Request
* @tparam Res
* - Response
* @return
* request with basic authorization
*/
def basic[Req, Res](
request: SingleResponseRequestBuilder[Req, Res],
credentials: PasswordAuthentication
): SingleResponseRequestBuilder[Req, Res] = {
val token = java.util.Base64.getEncoder.encodeToString(
s"${credentials.getUserName}:${new String(credentials.getPassword)}".getBytes
)
withAuthorization(request, s"Basic $token")
}
}

0 comments on commit adb5e26

Please sign in to comment.