Newer
Older
support / server / src / main / scala / mdr / pdb / server / Main.scala
package mdr.pdb.server

import zio.*
import mdr.pdb.users.query.repo.*
import zio.config.ReadError
import zio.logging.*
import zio.logging.backend.SLF4J

object Main extends ZIOAppDefault:

  override def hook = SLF4J.slf4j(LogLevel.Debug)

  lazy val runtimeLayer: URLayer[AppEnv, Runtime[AppEnv]] =
    ZLayer.fromZIO(ZIO.runtime[AppEnv])

  lazy val securityLayer: ZLayer[AppEnv, ReadError[String], HttpSecurity] =
    security.Pac4jSecurityConfig.fromEnv ++ runtimeLayer >>> security.Pac4jHttpSecurity.layer

  lazy val httpAppLayer: ZLayer[AppEnv, ReadError[String], HttpApplication] =
    AppConfig.fromEnv ++ securityLayer >>> HttpApplicationLive.layer

  lazy val appEnvLayer: TaskLayer[UsersRepository] =
    MockUsersRepository.layer

  lazy val serverLayer: ZLayer[ZEnv, Throwable, HttpServer] =
    appEnvLayer >+> blaze.BlazeServerConfig.fromEnv >+> httpAppLayer >>> blaze.BlazeHttpServer.layer

  override def run =
    for {
      server <- ZIO
        .service[HttpServer]
        .provideCustom(serverLayer)
      _ <- server.serve().provideCustom(appEnvLayer)
    } yield ()