/
AppConfig.scala
140 lines (127 loc) · 4.47 KB
/
AppConfig.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package org.knora.webapi.config
import com.typesafe.config.ConfigFactory
import zio._
import zio.config._
import scala.concurrent.duration
import typesafe._
import magnolia._
/**
* Represents (eventually) the complete configuration as defined in application.conf.
*/
final case class AppConfig(
testing: Boolean = false,
printExtendedConfig: Boolean,
defaultTimeout: String,
dumpMessages: Boolean,
showInternalErrors: Boolean,
bcryptPasswordStrength: Int,
jwtSecretKey: String,
jwtLongevity: String,
cookieDomain: String,
allowReloadOverHttp: Boolean,
knoraApi: KnoraAPI,
sipi: Sipi,
triplestore: Triplestore
) {
val jwtLongevityAsDuration = scala.concurrent.duration.Duration(jwtLongevity)
}
final case class KnoraAPI(
internalHost: String,
internalPort: Int,
externalProtocol: String,
externalHost: String,
externalPort: Int
) {
def internalKnoraApiHostPort: String = internalHost + (if (internalPort != 80)
":" + internalPort
else "")
def internalKnoraApiBaseUrl: String = "http://" + internalHost + (if (internalPort != 80)
":" + internalPort
else "")
def externalKnoraApiHostPort: String = externalHost + (if (externalPort != 80)
":" + externalPort
else "")
def externalKnoraApiBaseUrl: String = externalProtocol + "://" + externalHost + (if (externalPort != 80)
":" + externalPort
else "")
}
final case class Sipi(
internalProtocol: String,
internalHost: String,
internalPort: Int,
timeout: String,
externalProtocol: String,
externalHost: String,
externalPort: Int,
fileServerPath: String,
v2: V2,
imageMimeTypes: List[String],
documentMimeTypes: List[String],
textMimeTypes: List[String],
videoMimeTypes: List[String],
audioMimeTypes: List[String],
archiveMimeTypes: List[String]
) {
def internalBaseUrl: String = "http://" + internalHost + (if (internalPort != 80)
":" + internalPort
else "")
def externalBaseUrl: String = "http://" + externalHost + (if (externalPort != 80)
":" + externalPort
else "")
val timeoutInSeconds: duration.Duration = scala.concurrent.duration.Duration(timeout)
}
final case class V2(
fileMetadataRoute: String,
moveFileRoute: String,
deleteTempFileRoute: String
)
final case class Triplestore(
dbtype: String,
useHttps: Boolean,
host: String,
queryTimeout: String,
gravsearchTimeout: String,
autoInit: Boolean,
profileQueries: Boolean,
fuseki: Fuseki
) {
val queryTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(queryTimeout))
val gravsearchTimeoutAsDuration = zio.Duration.fromScala(scala.concurrent.duration.Duration(gravsearchTimeout))
}
/**
* Fuseki specific configuration.
*
* @param port
* @param repositoryName
* @param username
* @param password
*/
final case class Fuseki(
port: Int,
repositoryName: String,
username: String,
password: String
)
/**
* Loads the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading
* the Typesafe-Config format.
*/
object AppConfig {
/**
* Reads in the applicaton configuration using ZIO-Config. ZIO-Config is capable of loading
* the Typesafe-Config format. Reads the 'app' configuration from 'application.conf'.
*/
private val source: ConfigSource =
TypesafeConfigSource.fromTypesafeConfig(ZIO.attempt(ConfigFactory.load().getConfig("app").resolve))
/**
* Instantiates our config class hierarchy using the data from the 'app' configuration from 'application.conf'.
*/
private val config: IO[ReadError[String], AppConfig] = read(descriptor[AppConfig].mapKey(toKebabCase) from source)
/**
* Live configuration reading from application.conf.
*/
val live: ZLayer[Any, Nothing, AppConfig] =
ZLayer {
config.orDie
}.tap(_ => ZIO.debug(">>> AppConfig Initialized <<<"))
}