base/src/sqwl/cms/Server.scala
author Tomas Zeman <tzeman@volny.cz>
Fri, 08 Mar 2019 16:08:08 +0100
changeset 28 a36f63b5960c
parent 14 7c4b05467630
child 32 2d14f02ba3bd
permissions -rw-r--r--
cms: 19.01-SNAPSHOT -> 19.03
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
package sqwl.cms
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
import akka.actor.ActorSystem
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
import akka.http.scaladsl.Http
13
216da61215db Implemented tags
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
     5
import akka.http.scaladsl.model.headers.ETag
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
     6
import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpHeader, HttpResponse}
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
import akka.http.scaladsl.server.Directives._
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
import akka.stream.{ActorMaterializer, Materializer}
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    10
import scala.collection.immutable
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
import scala.concurrent.ExecutionContextExecutor
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    12
import scala.io.StdIn
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    14
trait Server extends App with Service with config with UrlScheme {
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
  override implicit val system: ActorSystem = ActorSystem()
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
  override implicit val executor: ExecutionContextExecutor = system.dispatcher
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
  override implicit val materializer: Materializer = ActorMaterializer()
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    19
  protected def content: iContent
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    20
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    21
  val asArticle = Segment.flatMap(content.articleByPath(_))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    22
  val asCategory = Segment.flatMap(content.categoryByPath(_))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    23
  val asTag = Segment.flatMap(content.tagByPath(_))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    24
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    25
  private def asHtml(st: ViewState): HttpResponse = {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    26
    val s = Layout(content, st).render
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    27
    HttpResponse(
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    28
      headers = immutable.Seq[HttpHeader](ETag(MD5(s))),
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    29
      entity = HttpEntity(ContentTypes.`text/html(UTF-8)`,
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    30
      "<!DOCTYPE html>" + s))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    31
  }
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    32
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
  private val routes = get {
4
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    34
    pathPrefix(http.prefix) {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    35
      pathEnd {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    36
        complete(asHtml(Dashboard))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    37
      } ~ pathPrefix(asArticle) { article =>
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    38
        pathEnd {
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    39
          complete(asHtml(ViewArticle(article)))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    40
        } ~ getFromDirectory(article.assets.toString)
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    41
      } ~ path(asCategory) { category =>
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    42
        complete(asHtml(ViewCategory(category)))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    43
      } ~ path(TAG / asTag) { tag =>
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    44
        complete(asHtml(ViewTag(tag)))
1a1347e8c5be Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents: 3
diff changeset
    45
      }
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
    } ~ pathPrefix(http.prefix / ASSETS) {
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
      getFromResourceDirectory("META-INF/resources/webjars")
7
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    48
    } ~ pathPrefix(http.prefix / PUBLIC / content.icon._1) {
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    49
      getFromFile(content.icon._2.toFile)
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    50
    } ~ pathPrefix(http.prefix / PUBLIC / content.styleSheet._1) {
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    51
      getFromFile(content.styleSheet._2.toFile)
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
    } ~ pathPrefix(http.prefix / PUBLIC) {
7
50a354e5bda4 Content parametrizing
Tomas Zeman <tzeman@volny.cz>
parents: 4
diff changeset
    53
      getFromDirectory(content.publicAssets.toString)
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
    }
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
  }
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
  Http().bindAndHandle(routes, http.interface, http.port)
14
7c4b05467630 Run mode: devel / production
Tomas Zeman <tzeman@volny.cz>
parents: 13
diff changeset
    58
  if (run.mode == "devel") {
7c4b05467630 Run mode: devel / production
Tomas Zeman <tzeman@volny.cz>
parents: 13
diff changeset
    59
    system.log.info("Click `Enter` to close application...")
7c4b05467630 Run mode: devel / production
Tomas Zeman <tzeman@volny.cz>
parents: 13
diff changeset
    60
    StdIn.readLine()
7c4b05467630 Run mode: devel / production
Tomas Zeman <tzeman@volny.cz>
parents: 13
diff changeset
    61
    system.terminate()
7c4b05467630 Run mode: devel / production
Tomas Zeman <tzeman@volny.cz>
parents: 13
diff changeset
    62
  }
3
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
48479e4b89d4 App skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
}