| author | Tomas Zeman <tomas@functionals.cz> |
| Tue, 29 Dec 2020 16:46:47 +0100 | |
| changeset 33 | fa0f19a74283 |
| parent 32 | 2d14f02ba3bd |
| permissions | -rw-r--r-- |
|
32
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
1 |
/* |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
2 |
* Copyright 2018-2020 Tomas Zeman <tomas@functionals.cz> |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
3 |
* |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
4 |
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
5 |
* you may not use this file except in compliance with the License. |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
6 |
* You may obtain a copy of the License at |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
7 |
* |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
8 |
* http://www.apache.org/licenses/LICENSE-2.0 |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
9 |
* |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
10 |
* Unless required by applicable law or agreed to in writing, software |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
11 |
* distributed under the License is distributed on an "AS IS" BASIS, |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
12 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
13 |
* See the License for the specific language governing permissions and |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
14 |
* limitations under the License. |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
15 |
*/ |
| 3 | 16 |
package sqwl.cms |
17 |
||
|
32
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
18 |
import akka.actor.typed.ActorSystem |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
19 |
import akka.actor.typed.scaladsl.Behaviors |
| 3 | 20 |
import akka.http.scaladsl.Http |
| 13 | 21 |
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
|
22 |
import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpHeader, HttpResponse}
|
| 3 | 23 |
import akka.http.scaladsl.server.Directives._ |
24 |
||
|
4
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
25 |
import scala.collection.immutable |
| 3 | 26 |
import scala.concurrent.ExecutionContextExecutor |
27 |
||
|
32
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
28 |
trait Server extends App with Service[Nothing] with config with UrlScheme {
|
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
29 |
|
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
30 |
override implicit val system: ActorSystem[Nothing] = |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
31 |
ActorSystem(Behaviors.empty, "Server") |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
32 |
override implicit val executor: ExecutionContextExecutor = |
|
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
33 |
system.executionContext |
| 3 | 34 |
|
|
4
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
35 |
protected def content: iContent |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
36 |
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
37 |
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
|
38 |
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
|
39 |
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
|
40 |
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
41 |
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
|
42 |
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
|
43 |
HttpResponse( |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
44 |
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
|
45 |
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
|
46 |
"<!DOCTYPE html>" + s)) |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
47 |
} |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
48 |
|
| 3 | 49 |
private val routes = get {
|
|
4
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
50 |
pathPrefix(http.prefix) {
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
51 |
pathEnd {
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
52 |
complete(asHtml(Dashboard)) |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
53 |
} ~ pathPrefix(asArticle) { article =>
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
54 |
pathEnd {
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
55 |
complete(asHtml(ViewArticle(article))) |
| 33 | 56 |
} ~ getFromDirectory(content.articleAssets(article).toString) |
|
4
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
57 |
} ~ path(asCategory) { category =>
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
58 |
complete(asHtml(ViewCategory(category))) |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
59 |
} ~ path(TAG / asTag) { tag =>
|
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
60 |
complete(asHtml(ViewTag(tag))) |
|
1a1347e8c5be
Build modules: base, content, app; example content, minimal layout
Tomas Zeman <tzeman@volny.cz>
parents:
3
diff
changeset
|
61 |
} |
| 3 | 62 |
} ~ pathPrefix(http.prefix / ASSETS) {
|
63 |
getFromResourceDirectory("META-INF/resources/webjars")
|
|
| 7 | 64 |
} ~ pathPrefix(http.prefix / PUBLIC / content.icon._1) {
|
65 |
getFromFile(content.icon._2.toFile) |
|
66 |
} ~ pathPrefix(http.prefix / PUBLIC / content.styleSheet._1) {
|
|
67 |
getFromFile(content.styleSheet._2.toFile) |
|
| 3 | 68 |
} ~ pathPrefix(http.prefix / PUBLIC) {
|
| 7 | 69 |
getFromDirectory(content.publicAssets.toString) |
| 3 | 70 |
} |
71 |
} |
|
72 |
||
|
32
2d14f02ba3bd
SQWL#2014 Server platform (component) upgrade
Tomas Zeman <tomas@functionals.cz>
parents:
14
diff
changeset
|
73 |
Http().newServerAt(http.interface, http.port).bind(routes) |
| 3 | 74 |
|
75 |
} |