Skip to content

Commit 2e95370

Browse files
committed
Split API and Application into two parts
1 parent 61f08de commit 2e95370

File tree

2 files changed

+110
-87
lines changed

2 files changed

+110
-87
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package no.nav.dagpenger.inntekt
2+
3+
import com.auth0.jwk.JwkProviderBuilder
4+
import io.ktor.server.engine.embeddedServer
5+
import io.ktor.server.engine.stop
6+
import io.ktor.server.netty.Netty
7+
import io.prometheus.client.hotspot.DefaultExports
8+
import java.net.URL
9+
import java.util.concurrent.TimeUnit
10+
import kotlin.concurrent.fixedRateTimer
11+
import kotlinx.coroutines.launch
12+
import kotlinx.coroutines.runBlocking
13+
import mu.KotlinLogging
14+
import no.nav.dagpenger.inntekt.db.PostgresInntektStore
15+
import no.nav.dagpenger.inntekt.db.dataSourceFrom
16+
import no.nav.dagpenger.inntekt.db.migrate
17+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentHttpClient
18+
import no.nav.dagpenger.inntekt.oppslag.OppslagClient
19+
import no.nav.dagpenger.inntekt.rpc.InntektGrpcServer
20+
import no.nav.dagpenger.inntekt.subsumsjonbrukt.KafkaSubsumsjonBruktDataConsumer
21+
import no.nav.dagpenger.inntekt.subsumsjonbrukt.Vaktmester
22+
import no.nav.dagpenger.ktor.auth.ApiKeyVerifier
23+
import no.nav.dagpenger.oidc.StsOidcClient
24+
25+
private val LOGGER = KotlinLogging.logger {}
26+
private val config = Configuration()
27+
28+
fun main() = runBlocking {
29+
migrate(config)
30+
DefaultExports.initialize()
31+
32+
val dataSource = dataSourceFrom(config)
33+
val authApiKeyVerifier = AuthApiKeyVerifier(
34+
apiKeyVerifier = ApiKeyVerifier(config.application.apiSecret),
35+
clients = config.application.allowedApiKeys
36+
)
37+
val postgresInntektStore = PostgresInntektStore(dataSource)
38+
val stsOidcClient = StsOidcClient(
39+
config.application.oicdStsUrl,
40+
config.application.username,
41+
config.application.password
42+
)
43+
val inntektskomponentHttpClient = InntektskomponentHttpClient(
44+
config.application.hentinntektListeUrl,
45+
stsOidcClient
46+
)
47+
val cachedInntektsGetter = BehandlingsInntektsGetter(inntektskomponentHttpClient, postgresInntektStore)
48+
val oppslagClient = OppslagClient(config.application.oppslagUrl, stsOidcClient)
49+
val jwkProvider = JwkProviderBuilder(URL(config.application.jwksUrl))
50+
.cached(10, 24, TimeUnit.HOURS)
51+
.rateLimited(10, 1, TimeUnit.MINUTES)
52+
.build()
53+
54+
// Marks inntekt as used
55+
val subsumsjonBruktDataConsumer =
56+
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore).apply {
57+
listen()
58+
}.also {
59+
Runtime.getRuntime().addShutdownHook(Thread {
60+
it.stop()
61+
})
62+
}
63+
64+
// Provides a gRPC server for getting inntekt
65+
InntektGrpcServer(
66+
port = 50051,
67+
inntektStore = postgresInntektStore,
68+
apiKeyVerifier = authApiKeyVerifier
69+
).also {
70+
launch {
71+
it.start()
72+
it.blockUntilShutdown()
73+
}
74+
}
75+
76+
// Provides a HTTP API for getting inntekt
77+
embeddedServer(Netty, port = config.application.httpPort) {
78+
inntektApi(
79+
inntektskomponentHttpClient,
80+
postgresInntektStore,
81+
cachedInntektsGetter,
82+
oppslagClient,
83+
authApiKeyVerifier,
84+
jwkProvider,
85+
listOf(
86+
postgresInntektStore as HealthCheck,
87+
subsumsjonBruktDataConsumer as HealthCheck
88+
)
89+
)
90+
}.start().also {
91+
Runtime.getRuntime().addShutdownHook(Thread {
92+
it.stop(5, 60, TimeUnit.SECONDS)
93+
})
94+
}
95+
96+
// Cleans up unused inntekt on a regular interbal
97+
Vaktmester(dataSource).also {
98+
fixedRateTimer(
99+
name = "vaktmester",
100+
initialDelay = TimeUnit.MINUTES.toMillis(10),
101+
period = TimeUnit.HOURS.toMillis(12),
102+
action = {
103+
LOGGER.info { "Vaktmesteren rydder" }
104+
it.rydd()
105+
LOGGER.info { "Vaktmesteren er ferdig... for denne gang" }
106+
})
107+
}
108+
}

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/InntektApi.kt

Lines changed: 2 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package no.nav.dagpenger.inntekt
22

33
import com.auth0.jwk.JwkProvider
4-
import com.auth0.jwk.JwkProviderBuilder
54
import com.ryanharter.ktor.moshi.moshi
65
import com.squareup.moshi.JsonDataException
76
import com.squareup.moshi.JsonEncodingException
@@ -26,117 +25,32 @@ import io.ktor.request.path
2625
import io.ktor.response.respond
2726
import io.ktor.routing.route
2827
import io.ktor.routing.routing
29-
import io.ktor.server.engine.embeddedServer
30-
import io.ktor.server.netty.Netty
3128
import io.micrometer.core.instrument.Clock
3229
import io.micrometer.prometheus.PrometheusConfig
3330
import io.micrometer.prometheus.PrometheusMeterRegistry
3431
import io.prometheus.client.CollectorRegistry
35-
import io.prometheus.client.hotspot.DefaultExports
3632
import java.net.URI
37-
import java.net.URL
38-
import java.util.concurrent.TimeUnit
3933
import java.util.concurrent.atomic.AtomicLong
40-
import kotlin.concurrent.fixedRateTimer
41-
import kotlinx.coroutines.launch
42-
import kotlinx.coroutines.runBlocking
4334
import mu.KotlinLogging
4435
import no.nav.dagpenger.inntekt.db.IllegalInntektIdException
4536
import no.nav.dagpenger.inntekt.db.InntektNotFoundException
4637
import no.nav.dagpenger.inntekt.db.InntektStore
47-
import no.nav.dagpenger.inntekt.db.PostgresInntektStore
48-
import no.nav.dagpenger.inntekt.db.dataSourceFrom
49-
import no.nav.dagpenger.inntekt.db.migrate
5038
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient
51-
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentHttpClient
5239
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentenHttpClientException
5340
import no.nav.dagpenger.inntekt.oppslag.OppslagClient
54-
import no.nav.dagpenger.inntekt.rpc.InntektGrpcServer
55-
import no.nav.dagpenger.inntekt.subsumsjonbrukt.KafkaSubsumsjonBruktDataConsumer
56-
import no.nav.dagpenger.inntekt.subsumsjonbrukt.Vaktmester
5741
import no.nav.dagpenger.inntekt.v1.inntekt
5842
import no.nav.dagpenger.inntekt.v1.opptjeningsperiodeApi
5943
import no.nav.dagpenger.inntekt.v1.uklassifisertInntekt
6044
import no.nav.dagpenger.ktor.auth.ApiKeyCredential
6145
import no.nav.dagpenger.ktor.auth.ApiKeyVerifier
6246
import no.nav.dagpenger.ktor.auth.ApiPrincipal
6347
import no.nav.dagpenger.ktor.auth.apiKeyAuth
64-
import no.nav.dagpenger.oidc.StsOidcClient
6548
import org.slf4j.event.Level
6649

6750
private val LOGGER = KotlinLogging.logger {}
6851
private val sikkerLogg = KotlinLogging.logger("tjenestekall")
6952
private val config = Configuration()
7053

71-
fun main() = runBlocking {
72-
73-
migrate(config)
74-
val jwkProvider = JwkProviderBuilder(URL(config.application.jwksUrl))
75-
.cached(10, 24, TimeUnit.HOURS)
76-
.rateLimited(10, 1, TimeUnit.MINUTES)
77-
.build()
78-
79-
val authApiKeyVerifier =
80-
AuthApiKeyVerifier(ApiKeyVerifier(config.application.apiSecret), config.application.allowedApiKeys)
81-
82-
val dataSource = dataSourceFrom(config)
83-
val postgresInntektStore = PostgresInntektStore(dataSource)
84-
val stsOidcClient =
85-
StsOidcClient(config.application.oicdStsUrl, config.application.username, config.application.password)
86-
87-
val subsumsjonBruktDataConsumer = KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore).apply {
88-
listen()
89-
}
90-
91-
val gRpcServer =
92-
InntektGrpcServer(port = 50051, inntektStore = postgresInntektStore, apiKeyVerifier = authApiKeyVerifier)
93-
94-
launch {
95-
gRpcServer.start()
96-
gRpcServer.blockUntilShutdown()
97-
}
98-
99-
val vaktmester = Vaktmester(dataSource)
100-
101-
fixedRateTimer(
102-
name = "vaktmester",
103-
initialDelay = TimeUnit.MINUTES.toMillis(10),
104-
period = TimeUnit.HOURS.toMillis(12),
105-
action = {
106-
LOGGER.info { "Vaktmesteren rydder" }
107-
vaktmester.rydd()
108-
LOGGER.info { "Vaktmesteren er ferdig... for denne gang" }
109-
})
110-
111-
val inntektskomponentHttpClient = InntektskomponentHttpClient(
112-
config.application.hentinntektListeUrl,
113-
stsOidcClient
114-
)
115-
val oppslagClient = OppslagClient(config.application.oppslagUrl, stsOidcClient)
116-
117-
val cachedInntektsGetter = BehandlingsInntektsGetter(inntektskomponentHttpClient, postgresInntektStore)
118-
119-
DefaultExports.initialize()
120-
val application = embeddedServer(Netty, port = config.application.httpPort) {
121-
inntektApi(
122-
inntektskomponentHttpClient,
123-
postgresInntektStore,
124-
cachedInntektsGetter,
125-
oppslagClient,
126-
authApiKeyVerifier,
127-
jwkProvider,
128-
listOf(
129-
postgresInntektStore as HealthCheck,
130-
subsumsjonBruktDataConsumer as HealthCheck
131-
)
132-
)
133-
}.start()
134-
Runtime.getRuntime().addShutdownHook(Thread {
135-
subsumsjonBruktDataConsumer.stop()
136-
application.stop(5000, 60000)
137-
})
138-
}
139-
14054
fun Application.inntektApi(
14155
inntektskomponentHttpClient: InntektskomponentClient,
14256
inntektStore: InntektStore,
@@ -146,11 +60,12 @@ fun Application.inntektApi(
14660
jwkProvider: JwkProvider,
14761
healthChecks: List<HealthCheck>
14862
) {
149-
15063
install(DefaultHeaders)
64+
15165
install(MicrometerMetrics) {
15266
registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT, CollectorRegistry.defaultRegistry, Clock.SYSTEM)
15367
}
68+
15469
install(Authentication) {
15570
apiKeyAuth {
15671
apiKeyName = "X-API-KEY"

0 commit comments

Comments
 (0)