Skip to content

Commit 55b73f2

Browse files
committed
integrate tapir-http-session, add SwaggerEndpoint
1 parent 31394f4 commit 55b73f2

25 files changed

+100
-2056
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ ThisBuild / organization := "app.softnetwork"
99

1010
name := "generic-persistence-api"
1111

12-
ThisBuild / version := "0.3.6"
12+
ThisBuild / version := "0.4.0"
1313

1414
ThisBuild / scalaVersion := "2.12.18"
1515

project/Versions.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ object Versions {
66

77
val akkaHttpJson4s = "1.39.2" //1.37.0 -> 1.39.2
88

9-
val akkaHttpSession = "0.7.0" // 0.5.11 -> 0.7.0
9+
val akkaHttpSession = "0.7.0"
1010

11-
val tapir = "1.3.0"
11+
val tapir = "1.7.0"
12+
13+
val tapirHttpSession = "0.1.0"
1214

1315
val akkaPersistenceJdbc = "5.0.4"
1416

server/src/main/scala/app/softnetwork/api/server/ApiEndpoint.scala

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,17 @@ package app.softnetwork.api.server
33
import akka.http.scaladsl.server.Route
44
import app.softnetwork.serialization.commonFormats
55
import org.json4s.Formats
6-
import sttp.capabilities.WebSockets
7-
import sttp.capabilities.akka.AkkaStreams
8-
import sttp.tapir.server.ServerEndpoint
9-
import sttp.tapir.server.akkahttp.AkkaHttpServerInterpreter
106

11-
import scala.concurrent.{ExecutionContext, Future}
127
import scala.language.implicitConversions
138

14-
trait ApiEndpoint extends ApiRoute with SwaggerApiEndpoint {
9+
trait ApiEndpoint extends Endpoint {
1510

16-
import ApiEndpoint._
11+
import Endpoint._
1712

18-
implicit def ec: ExecutionContext
13+
final def apiRoute: Route = endpoints
1914

20-
def endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
21-
22-
def swaggerEndpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]] =
23-
endpointsToSwaggerEndpoints(endpoints)
24-
25-
def swaggerRoute: Route = swaggerEndpoints
26-
27-
def apiRoute: Route = endpoints
28-
29-
override def route: Route = apiRoute ~ swaggerRoute
15+
override def route: Route = apiRoute
3016

3117
implicit def formats: Formats = commonFormats
3218

3319
}
34-
35-
object ApiEndpoint {
36-
37-
implicit def endpointsToRoute(
38-
endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
39-
)(implicit
40-
ec: ExecutionContext
41-
): Route = AkkaHttpServerInterpreter().toRoute(endpoints)
42-
43-
}

server/src/main/scala/app/softnetwork/api/server/ApiEndpoints.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import akka.actor.typed.ActorSystem
44

55
trait ApiEndpoints extends ApiRoutes {
66

7-
def endpoints: ActorSystem[_] => List[ApiEndpoint]
7+
def endpoints: ActorSystem[_] => List[Endpoint]
88

99
final override def apiRoutes: ActorSystem[_] => List[ApiRoute] = endpoints
1010
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package app.softnetwork.api.server
2+
3+
import akka.http.scaladsl.server.Route
4+
import sttp.capabilities.WebSockets
5+
import sttp.capabilities.akka.AkkaStreams
6+
import sttp.tapir.server.ServerEndpoint
7+
import sttp.tapir.server.akkahttp.AkkaHttpServerInterpreter
8+
9+
import scala.concurrent.{ExecutionContext, Future}
10+
11+
trait Endpoint extends ApiRoute {
12+
13+
implicit def ec: ExecutionContext
14+
15+
def endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
16+
17+
}
18+
19+
object Endpoint {
20+
21+
implicit def endpointsToRoute(
22+
endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
23+
)(implicit
24+
ec: ExecutionContext
25+
): Route = AkkaHttpServerInterpreter().toRoute(endpoints)
26+
27+
}
Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,8 @@
11
package app.softnetwork.api.server
22

3-
import app.softnetwork.api.server.config.ServerSettings
4-
import sttp.capabilities.WebSockets
5-
import sttp.capabilities.akka.AkkaStreams
6-
import sttp.tapir.server.ServerEndpoint
7-
import sttp.tapir.swagger.SwaggerUIOptions
8-
import sttp.tapir.swagger.bundle.SwaggerInterpreter
3+
import akka.http.scaladsl.server.Route
94

10-
import scala.concurrent.Future
11-
12-
trait SwaggerApiEndpoint {
13-
14-
val applicationName: String = ServerSettings.ApplicationName
15-
16-
val applicationVersion: String = ServerSettings.ApplicationVersion
17-
18-
val swaggerPathPrefix: List[String] = config.ServerSettings.SwaggerPathPrefix
19-
20-
val swaggerUIOptions: SwaggerUIOptions = SwaggerUIOptions.default.pathPrefix(swaggerPathPrefix)
21-
22-
def endpointsToSwaggerEndpoints(
23-
endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
24-
): List[ServerEndpoint[AkkaStreams with WebSockets, Future]] =
25-
SwaggerInterpreter(swaggerUIOptions = swaggerUIOptions).fromEndpoints[Future](
26-
endpoints.map(_.endpoint.prependIn(config.ServerSettings.RootPath)),
27-
applicationName,
28-
applicationVersion
29-
)
5+
trait SwaggerApiEndpoint extends ApiEndpoint with SwaggerEndpoint {
306

7+
override def route: Route = apiRoute ~ swaggerRoute
318
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package app.softnetwork.api.server
2+
3+
import akka.http.scaladsl.server.Route
4+
import app.softnetwork.api.server.config.ServerSettings
5+
import sttp.capabilities.WebSockets
6+
import sttp.capabilities.akka.AkkaStreams
7+
import sttp.tapir.server.ServerEndpoint
8+
import sttp.tapir.swagger.SwaggerUIOptions
9+
import sttp.tapir.swagger.bundle.SwaggerInterpreter
10+
11+
import scala.concurrent.Future
12+
import scala.language.reflectiveCalls
13+
14+
trait SwaggerEndpoint extends Endpoint {
15+
16+
import Endpoint._
17+
18+
val applicationName: String = ServerSettings.ApplicationName
19+
20+
val applicationVersion: String = ServerSettings.ApplicationVersion
21+
22+
val swaggerPathPrefix: List[String] = config.ServerSettings.SwaggerPathPrefix
23+
24+
val swaggerUIOptions: SwaggerUIOptions = SwaggerUIOptions.default.pathPrefix(swaggerPathPrefix)
25+
26+
final def swaggerRoute: Route = endpointsToSwaggerEndpoints(endpoints)
27+
28+
override def route: Route = swaggerRoute
29+
30+
def endpointsToSwaggerEndpoints(
31+
endpoints: List[ServerEndpoint[AkkaStreams with WebSockets, Future]]
32+
): List[ServerEndpoint[AkkaStreams with WebSockets, Future]] =
33+
SwaggerInterpreter(swaggerUIOptions = swaggerUIOptions).fromEndpoints[Future](
34+
endpoints.map(_.endpoint.prependIn(config.ServerSettings.RootPath)),
35+
applicationName,
36+
applicationVersion
37+
)
38+
39+
}

session/common/build.sbt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ organization := "app.softnetwork.session"
22

33
name := "session-common"
44

5+
val tapirHttpSession: Seq[ModuleID] = Seq(
6+
"app.softnetwork.tapir-http-session" %% "core" % Versions.tapirHttpSession excludeAll
7+
ExclusionRule(organization = "com.softwaremill")
8+
)
9+
510
val akkaHttpSession: Seq[ModuleID] = Seq(
611
"com.softwaremill.akka-http-session" %% "core" % Versions.akkaHttpSession,
712
"com.softwaremill.akka-http-session" %% "jwt" % Versions.akkaHttpSession
813
)
914

1015
libraryDependencies ++= Seq(
1116
"app.softnetwork.protobuf" %% "scalapb-extensions" % "0.1.7"
12-
) ++ akkaHttpSession
17+
) ++ akkaHttpSession ++ tapirHttpSession
1318

1419
Compile / unmanagedResourceDirectories += baseDirectory.value / "src/main/protobuf"

session/core/src/main/scala/app/softnetwork/session/service/ServiceWithSessionEndpoints.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,8 @@ package app.softnetwork.session.service
33
import app.softnetwork.api.server.ServiceEndpoints
44
import app.softnetwork.persistence.message.{Command, CommandResult}
55
import app.softnetwork.persistence.typed.scaladsl.EntityPattern
6-
import com.softwaremill.session.{
7-
GetSessionTransport,
8-
SetSessionTransport,
9-
TapirCsrfCheckMode,
10-
TapirEndpoints,
11-
TapirSessionContinuity
12-
}
6+
import app.softnetwork.session.{TapirCsrfCheckMode, TapirEndpoints, TapirSessionContinuity}
7+
import com.softwaremill.session.{GetSessionTransport, SetSessionTransport}
138
import org.softnetwork.session.model.Session
149

1510
trait ServiceWithSessionEndpoints[C <: Command, R <: CommandResult]

session/core/src/main/scala/app/softnetwork/session/service/SessionEndpoints.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package app.softnetwork.session.service
22

33
import akka.actor.typed.ActorSystem
4+
import app.softnetwork.session.{TapirCsrfCheckMode, TapirEndpoints, TapirSessionContinuity}
45
import app.softnetwork.session.config.Settings.Session.CookieSecret
56
import app.softnetwork.session.handlers.SessionRefreshTokenDao
67
import com.softwaremill.session._
@@ -22,13 +23,13 @@ trait SessionEndpoints extends TapirEndpoints {
2223
system
2324
)
2425

25-
import TapirSessionOptions._
26+
import app.softnetwork.session.TapirSessionOptions._
2627

2728
lazy val oneOffSession: TapirSessionContinuity[Session] = oneOff
2829

2930
lazy val refreshableSession: TapirSessionContinuity[Session] = refreshable
3031

31-
import TapirCsrfOptions._
32+
import app.softnetwork.session.TapirCsrfOptions._
3233

3334
lazy val checkHeaderMode: TapirCsrfCheckMode[Session] = checkHeader
3435

0 commit comments

Comments
 (0)