dev
Override-6 2 years ago
parent bb14aef019
commit 26a090952c

@ -4,7 +4,7 @@ import org.apache.logging.log4j.LogManager
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.config.{FileServerConfig, ServerConfig} import org.tbasket.config.{FileServerConfig, ServerConfig}
import org.tbasket.data.Database import org.tbasket.data.Database
import org.tbasket.dispatch.WebService import org.tbasket.dispatch.StaticWebServicImpl
import org.tbasket.endpoint.Endpoint import org.tbasket.endpoint.Endpoint
import pdi.jwt.algorithms.JwtAsymmetricAlgorithm import pdi.jwt.algorithms.JwtAsymmetricAlgorithm
import zio.* import zio.*
@ -25,15 +25,15 @@ object Main extends ZIOAppDefault:
override def run = ZIO.serviceWithZIO[ZIOAppArgs] { args => override def run = ZIO.serviceWithZIO[ZIOAppArgs] { args =>
retrieveConfig(args) retrieveConfig(args)
.flatMap(config => setupAuth(config) <&> setupDatabase(config) <&> setupEndpoint(config) <&> setupPageDispatcher(config)) .flatMap(config => setupAuth(config) <&> setupDatabase(config) <&> setupEndpoint(config) <&> setupStaticWebService(config))
.flatMap { .flatMap {
case (auth, db, ep, disp) => case (auth, db, ep, disp) =>
ep.run.provide(db.datasourceLayer, db.contextLayer, auth, disp) ep.run.provide(db.datasourceLayer, db.contextLayer, auth, disp)
} }
} }
private def setupPageDispatcher(config: ServerConfig) = ZIO.attempt { private def setupStaticWebService(config: ServerConfig) = ZIO.attempt {
val dispatcher = new WebService(config.pagesLocation) val dispatcher = new StaticWebServicImpl(config.pagesLocation.get)
ZLayer.succeed(dispatcher) ZLayer.succeed(dispatcher)
} }

@ -0,0 +1,8 @@
package org.tbasket.dispatch
import zio.*
import zio.http.{Request, Response}
trait StaticWebService {
def get(r: Request): IO[Object, Response]
}

@ -9,12 +9,11 @@ import zio.stream.ZStream
import java.nio.file.{Files, Path} import java.nio.file.{Files, Path}
import scala.collection.mutable import scala.collection.mutable
class WebService(pagesLocation: Option[Path]) { class StaticWebServicImpl(pagesLocation: Path) extends StaticWebService {
private val resources = resolveResources private val resources = resolveResources
override def get(r: Request) =
def send(r: Request) =
ZIO.attempt(pagesLocation.toString + r.url.path.toString) ZIO.attempt(pagesLocation.toString + r.url.path.toString)
.filterOrFail(!_.startsWith("/"))(Forbidden) .filterOrFail(!_.startsWith("/"))(Forbidden)
.map(resources.get) .map(resources.get)
@ -52,7 +51,7 @@ class WebService(pagesLocation: Option[Path]) {
} }
} }
} }
pagesLocation.foreach(resolveAll) resolveAll(pagesLocation)
map.toMap map.toMap
} }
} }

@ -8,7 +8,7 @@ import io.netty.handler.codec.http.HttpMethod
import org.apache.logging.log4j.{LogManager, Logger} import org.apache.logging.log4j.{LogManager, Logger}
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.data.DatabaseContext import org.tbasket.data.DatabaseContext
import org.tbasket.dispatch.WebService import org.tbasket.dispatch.StaticWebService
import org.tbasket.endpoint.Endpoint.{Log, app} import org.tbasket.endpoint.Endpoint.{Log, app}
import org.tbasket.error.* import org.tbasket.error.*
import org.tbasket.handler.HandlerUtils.errorBody import org.tbasket.handler.HandlerUtils.errorBody
@ -37,7 +37,7 @@ class Endpoint(port: Int):
Server.install(app).flatMap { port => Server.install(app).flatMap { port =>
Log.info(s"Listening API entries on $port") Log.info(s"Listening API entries on $port")
ZIO.never ZIO.never
}.provideSome[DatabaseContext & Authenticator & DataSource & WebService]( }.provideSome[DatabaseContext & Authenticator & DataSource & StaticWebService](
Scope.default, Scope.default,
serverConfigLayer, serverConfigLayer,
ConnectionPool.fixed(4), ConnectionPool.fixed(4),
@ -57,7 +57,8 @@ object Endpoint:
RegisterPageHandler.post(r) RegisterPageHandler.post(r)
case r@GET -> _ => case r@GET -> _ =>
ZIO.serviceWithZIO[WebService](_.send(r))
ZIO.serviceWithZIO[StaticWebService](_.get(r))
case r@method -> path => case r@method -> path =>
val ipInsights = r.remoteAddress val ipInsights = r.remoteAddress

@ -3,7 +3,6 @@ package org.tbasket.test
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.config.ServerConfig import org.tbasket.config.ServerConfig
import org.tbasket.data.Database import org.tbasket.data.Database
import org.tbasket.dispatch.WebService
import zio.{Task, ZLayer} import zio.{Task, ZLayer}
import java.nio.file.{Files, Path} import java.nio.file.{Files, Path}
@ -22,7 +21,7 @@ object TestLayers {
ZLayer.succeed(auth) ZLayer.succeed(auth)
} }
val resp = ZLayer.succeed(new WebService(TestServerConfig.pagesLocation)) val resp = ZLayer.succeed(TestStaticWebService)
val db = { val db = {
//ensure that the test table is always new in order to make tests on the same dataset all the time. //ensure that the test table is always new in order to make tests on the same dataset all the time.

@ -0,0 +1,10 @@
package org.tbasket.test
import org.tbasket.dispatch.StaticWebService
import zio.ZIO
import zio.http.model.Status.NotFound
import zio.http.{Http, Request, Response}
object TestStaticWebService extends StaticWebService {
override def get(r: Request) = ZIO.attempt(Response.status(NotFound))
}

@ -5,13 +5,13 @@ import io.getquill.context.qzio.ZioJdbcContext
import io.getquill.context.sql.idiom.SqlIdiom import io.getquill.context.sql.idiom.SqlIdiom
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.data.DatabaseContext import org.tbasket.data.DatabaseContext
import org.tbasket.dispatch.WebService import org.tbasket.dispatch.StaticWebService
import zio.test.{Spec, TestEnvironment, ZIOSpecDefault}
import org.tbasket.handler.LoginPageHandler.post import org.tbasket.handler.LoginPageHandler.post
import zio.*
import org.tbasket.test.TestLayers.* import org.tbasket.test.TestLayers.*
import zio.http.{Client, ClientConfig, URL} import zio.*
import zio.http.netty.client.ConnectionPool import zio.http.netty.client.ConnectionPool
import zio.http.{Client, ClientConfig, URL}
import zio.test.{Spec, TestEnvironment, ZIOSpecDefault}
import javax.sql.DataSource import javax.sql.DataSource
@ -21,7 +21,7 @@ abstract class TBasketPageSpec(location: String) extends ZIOSpecDefault {
case Left(value) => throw value case Left(value) => throw value
case Right(url) => url case Right(url) => url
protected def tspec: Spec[DataSource & ClientConfig & Authenticator & ConnectionPool & Scope & DatabaseContext & Client & WebService, Any] protected def tspec: Spec[DataSource & ClientConfig & Authenticator & ConnectionPool & Scope & DatabaseContext & Client & StaticWebService, Any]
final override def spec = tspec.provide( final override def spec = tspec.provide(
db.datasourceLayer, db.datasourceLayer,