Skip to content

Commit d23910a

Browse files
committed
Gjorde jobb mer konfigurerbar
1 parent 7421520 commit d23910a

File tree

15 files changed

+259
-199
lines changed

15 files changed

+259
-199
lines changed

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/Job.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ fun main() {
3232
Database.connect(dataSource)
3333
val azureAdM2MTokenClient = createAzureAdM2MTokenClient(jobConfig.runtimeEnvironment, azureAdM2MConfig)
3434
val arbeidssoekerSynkRepository = ArbeidssoekerSynkRepository()
35-
val inngangHttpConsumer = InngangHttpConsumer(jobConfig.apiInngangBaseUrl) {
36-
azureAdM2MTokenClient.createMachineToMachineToken(jobConfig.apiInngangScope)
35+
val inngangHttpConsumer = InngangHttpConsumer(jobConfig.apiInngang.baseUrl) {
36+
azureAdM2MTokenClient.createMachineToMachineToken(jobConfig.apiInngang.scope)
3737
}
3838
val arbeidssoekerSynkService =
3939
ArbeidssoekerSynkService(jobConfig, arbeidssoekerSynkRepository, inngangHttpConsumer)
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package no.nav.paw.arbeidssoeker.synk.config
22

3+
import no.nav.paw.arbeidssoeker.synk.model.PeriodeTilstand
34
import no.nav.paw.config.env.RuntimeEnvironment
45
import no.nav.paw.config.env.currentRuntimeEnvironment
56

67
const val JOB_CONFIG = "job_config.toml"
78

89
data class JobConfig(
910
val syncFilePath: String,
10-
val markerForhaandsgodkjentAvAnsatt: Boolean,
11-
val apiInngangBaseUrl: String,
12-
val apiInngangScope: String,
11+
val defaultVerdier: DefaultVerdier,
12+
val apiInngang: ApiInngangConfig,
1313
val runtimeEnvironment: RuntimeEnvironment = currentRuntimeEnvironment
1414
)
15+
16+
data class DefaultVerdier(
17+
val periodeTilstand: PeriodeTilstand,
18+
val forhaandsgodkjentAvAnsatt: Boolean
19+
)
20+
21+
data class ApiInngangConfig(
22+
val baseUrl: String,
23+
val scope: String,
24+
)

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/model/Arbeidssoeker.kt

+19-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,28 @@ package no.nav.paw.arbeidssoeker.synk.model
22

33
import java.time.Instant
44

5-
data class Arbeidssoeker(
5+
data class ArbeidssoekerFileRow(
66
val identitetsnummer: String,
7-
val originalStartTidspunkt: Instant
7+
val tidspunktFraKilde: Instant? = null
88
)
99

10-
data class VersjonertArbeidssoeker(
10+
data class ArbeidssoekerDatabaseRow(
1111
val version: String,
1212
val identitetsnummer: String,
13-
val originalStartTidspunkt: Instant,
14-
val forhaandsgodkjentAvAnsatt: Boolean = false,
13+
val status: Int,
14+
val inserted: Instant,
15+
val updated: Instant? = null
1516
)
17+
18+
data class Arbeidssoeker(
19+
val version: String,
20+
val identitetsnummer: String,
21+
val periodeTilstand: PeriodeTilstand,
22+
val tidspunktFraKilde: Instant?,
23+
val forhaandsgodkjentAvAnsatt: Boolean,
24+
)
25+
26+
enum class PeriodeTilstand {
27+
STARTET,
28+
STOPPET;
29+
}

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/model/ArbeidssoekereSynkRow.kt

-11
This file was deleted.

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/model/Converters.kt

+26-13
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,41 @@ import org.jetbrains.exposed.sql.ResultRow
66
import java.time.Duration
77
import java.time.Instant
88

9-
fun Arbeidssoeker.asVersioned(
9+
fun ArbeidssoekerFileRow.asArbeidssoeker(
1010
version: String,
11+
periodeTilstand: PeriodeTilstand = PeriodeTilstand.STARTET,
1112
forhaandsgodkjentAvAnsatt: Boolean = false
12-
): VersjonertArbeidssoeker = VersjonertArbeidssoeker(
13+
): Arbeidssoeker = Arbeidssoeker(
1314
version = version,
1415
identitetsnummer = identitetsnummer,
15-
originalStartTidspunkt = originalStartTidspunkt,
16+
periodeTilstand = periodeTilstand,
17+
tidspunktFraKilde = tidspunktFraKilde,
1618
forhaandsgodkjentAvAnsatt = forhaandsgodkjentAvAnsatt
1719
)
1820

19-
fun VersjonertArbeidssoeker.asOpprettPeriodeRequest(): OpprettPeriodeRequest = OpprettPeriodeRequest(
20-
identitetsnummer = this.identitetsnummer,
21-
periodeTilstand = PeriodeTilstand.STARTET,
22-
registreringForhaandsGodkjentAvAnsatt = this.forhaandsgodkjentAvAnsatt,
23-
feilretting = Feilretting(
24-
feilType = FeilType.FeilTidspunkt,
25-
melding = "Arbeidssøker migrert fra Arena",
26-
tidspunkt = this.originalStartTidspunkt
27-
)
21+
fun Arbeidssoeker.asOpprettPeriodeRequest(): OpprettPeriodeRequest = OpprettPeriodeRequest(
22+
identitetsnummer = identitetsnummer,
23+
periodeTilstand = asPeriodeTilstand(),
24+
registreringForhaandsGodkjentAvAnsatt = forhaandsgodkjentAvAnsatt,
25+
feilretting = asFeilretting()
2826
)
2927

30-
fun ResultRow.asArbeidssoekereSynkRow(): ArbeidssoekereSynkRow = ArbeidssoekereSynkRow(
28+
fun Arbeidssoeker.asPeriodeTilstand(): OpprettPeriodeTilstand =
29+
when (periodeTilstand) {
30+
PeriodeTilstand.STARTET -> OpprettPeriodeTilstand.STARTET
31+
PeriodeTilstand.STOPPET -> OpprettPeriodeTilstand.STOPPET
32+
}
33+
34+
fun Arbeidssoeker.asFeilretting(): Feilretting? =
35+
tidspunktFraKilde?.let {
36+
Feilretting(
37+
feilType = FeilType.FeilTidspunkt,
38+
melding = "Arbeidssøker migrert fra Arena",
39+
tidspunkt = it
40+
)
41+
}
42+
43+
fun ResultRow.asArbeidssoekereRow(): ArbeidssoekerDatabaseRow = ArbeidssoekerDatabaseRow(
3144
version = this[ArbeidssoekereSynkTable.version],
3245
identitetsnummer = this[ArbeidssoekereSynkTable.identitetsnummer],
3346
status = this[ArbeidssoekereSynkTable.status],

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/model/OpprettPeriode.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import java.time.Instant
44

55
data class OpprettPeriodeRequest(
66
val identitetsnummer: String,
7-
val periodeTilstand: PeriodeTilstand,
7+
val periodeTilstand: OpprettPeriodeTilstand,
88
val registreringForhaandsGodkjentAvAnsatt: Boolean? = null,
99
val feilretting: Feilretting? = null
1010
)
1111

12-
enum class PeriodeTilstand(val value: String) {
12+
enum class OpprettPeriodeTilstand(val value: String) {
1313
STARTET("STARTET"),
1414
STOPPET("STOPPET");
1515
}

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/repository/ArbeidssoekerSynkRepository.kt

+18-10
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package no.nav.paw.arbeidssoeker.synk.repository
22

3-
import no.nav.paw.arbeidssoeker.synk.model.ArbeidssoekereSynkRow
3+
import no.nav.paw.arbeidssoeker.synk.model.ArbeidssoekerDatabaseRow
44
import no.nav.paw.arbeidssoeker.synk.model.ArbeidssoekereSynkTable
5-
import no.nav.paw.arbeidssoeker.synk.model.asArbeidssoekereSynkRow
5+
import no.nav.paw.arbeidssoeker.synk.model.asArbeidssoekereRow
66
import org.jetbrains.exposed.sql.SortOrder
77
import org.jetbrains.exposed.sql.insert
88
import org.jetbrains.exposed.sql.selectAll
@@ -12,40 +12,44 @@ import java.time.Instant
1212

1313
class ArbeidssoekerSynkRepository {
1414

15-
fun find(): List<ArbeidssoekereSynkRow> {
15+
fun find(): List<ArbeidssoekerDatabaseRow> {
1616
return transaction {
1717
ArbeidssoekereSynkTable.selectAll()
1818
.orderBy(ArbeidssoekereSynkTable.inserted to SortOrder.ASC)
19-
.map { it.asArbeidssoekereSynkRow() }
19+
.map { it.asArbeidssoekereRow() }
2020
}
2121
}
2222

23-
fun find(identitetsnummer: String): List<ArbeidssoekereSynkRow> {
23+
fun find(identitetsnummer: String): List<ArbeidssoekerDatabaseRow> {
2424
return transaction {
2525
ArbeidssoekereSynkTable.selectAll()
2626
.where { ArbeidssoekereSynkTable.identitetsnummer eq identitetsnummer }
2727
.orderBy(ArbeidssoekereSynkTable.inserted to SortOrder.ASC)
28-
.map { it.asArbeidssoekereSynkRow() }
28+
.map { it.asArbeidssoekereRow() }
2929
}
3030
}
3131

3232
fun find(
3333
version: String,
3434
identitetsnummer: String
35-
): ArbeidssoekereSynkRow? {
35+
): ArbeidssoekerDatabaseRow? {
3636
return transaction {
3737
ArbeidssoekereSynkTable.selectAll()
3838
.where {
3939
ArbeidssoekereSynkTable.version eq version
4040
ArbeidssoekereSynkTable.identitetsnummer eq identitetsnummer
4141
}
4242
.orderBy(ArbeidssoekereSynkTable.inserted to SortOrder.ASC)
43-
.map { it.asArbeidssoekereSynkRow() }
43+
.map { it.asArbeidssoekereRow() }
4444
.firstOrNull()
4545
}
4646
}
4747

48-
fun insert(version: String, identitetsnummer: String, status: Int) {
48+
fun insert(
49+
version: String,
50+
identitetsnummer: String,
51+
status: Int
52+
) {
4953
transaction {
5054
ArbeidssoekereSynkTable.insert {
5155
it[ArbeidssoekereSynkTable.version] = version
@@ -56,7 +60,11 @@ class ArbeidssoekerSynkRepository {
5660
}
5761
}
5862

59-
fun update(version: String, identitetsnummer: String, status: Int) {
63+
fun update(
64+
version: String,
65+
identitetsnummer: String,
66+
status: Int
67+
) {
6068
transaction {
6169
ArbeidssoekereSynkTable.update({
6270
ArbeidssoekereSynkTable.version eq version

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/service/ArbeidssoekerSynkService.kt

+29-19
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package no.nav.paw.arbeidssoeker.synk.service
33
import io.opentelemetry.instrumentation.annotations.WithSpan
44
import no.nav.paw.arbeidssoeker.synk.config.JobConfig
55
import no.nav.paw.arbeidssoeker.synk.consumer.InngangHttpConsumer
6-
import no.nav.paw.arbeidssoeker.synk.model.VersjonertArbeidssoeker
6+
import no.nav.paw.arbeidssoeker.synk.model.Arbeidssoeker
7+
import no.nav.paw.arbeidssoeker.synk.model.asArbeidssoeker
78
import no.nav.paw.arbeidssoeker.synk.model.asOpprettPeriodeRequest
8-
import no.nav.paw.arbeidssoeker.synk.model.asVersioned
99
import no.nav.paw.arbeidssoeker.synk.model.isNotSuccess
1010
import no.nav.paw.arbeidssoeker.synk.model.millisSince
1111
import no.nav.paw.arbeidssoeker.synk.repository.ArbeidssoekerSynkRepository
@@ -27,30 +27,40 @@ class ArbeidssoekerSynkService(
2727

2828
@WithSpan(value = "synkArbeidssoekere")
2929
fun synkArbeidssoekere(path: Path) {
30-
var totalCount = 0
31-
val timestamp = Instant.now()
32-
logger.info("Leser CSV-fil {} fra mappe {}", path.name, path.parent)
33-
val values = ArbeidssoekerCsvReader.readValues(path)
34-
if (values.hasNextValue()) {
35-
logger.info("Starter prosessering av CSV-data")
36-
while (values.hasNextValue()) {
37-
totalCount++
38-
if (totalCount % 100 == 0) {
39-
logger.info("Prosessert {} linjer CSV-data på {} ms", totalCount, timestamp.millisSince())
30+
with(jobConfig) {
31+
var totalCount = 0
32+
val timestamp = Instant.now()
33+
logger.info("Leser CSV-fil {} fra mappe {}", path.name, path.parent)
34+
val values = ArbeidssoekerCsvReader.readValues(path)
35+
if (values.hasNextValue()) {
36+
logger.info("Starter prosessering av CSV-data")
37+
while (values.hasNextValue()) {
38+
totalCount++
39+
if (totalCount % 100 == 0) {
40+
logger.info("Prosessert {} linjer CSV-data på {} ms", totalCount, timestamp.millisSince())
41+
}
42+
val arbeidssoeker = values.nextValue()
43+
.asArbeidssoeker(
44+
version = path.name,
45+
periodeTilstand = defaultVerdier.periodeTilstand,
46+
forhaandsgodkjentAvAnsatt = defaultVerdier.forhaandsgodkjentAvAnsatt
47+
)
48+
prosesserArbeidssoeker(arbeidssoeker)
4049
}
41-
val arbeidssoeker = values.nextValue()
42-
.asVersioned(path.name, jobConfig.markerForhaandsgodkjentAvAnsatt)
43-
prosesserArbeidssoeker(arbeidssoeker)
50+
logger.info(
51+
"Fullførte prosessering av {} linjer CSV-data på {} ms",
52+
totalCount,
53+
timestamp.millisSince()
54+
)
55+
} else {
56+
logger.warn("CSV-fil {} fra mappe {} er tom", path.name, path.parent)
4457
}
45-
logger.info("Fullførte prosessering av {} linjer CSV-data på {} ms", totalCount, timestamp.millisSince())
46-
} else {
47-
logger.warn("CSV-fil {} fra mappe {} er tom", path.name, path.parent)
4858
}
4959
}
5060

5161
@WithSpan(value = "prosesserArbeidssoeker")
5262
@Suppress("LoggingSimilarMessage")
53-
private fun prosesserArbeidssoeker(arbeidssoeker: VersjonertArbeidssoeker) {
63+
private fun prosesserArbeidssoeker(arbeidssoeker: Arbeidssoeker) {
5464
val (version, identitetsnummer) = arbeidssoeker
5565
secureLogger.info("Prosesserer arbeidssøker {}", identitetsnummer)
5666

jobs/arbeidssoekere-synk-jobb/src/main/kotlin/no/nav/paw/arbeidssoeker/synk/utils/CsvReader.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.fasterxml.jackson.dataformat.csv.CsvMapper
77
import com.fasterxml.jackson.dataformat.csv.CsvSchema
88
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
99
import com.fasterxml.jackson.module.kotlin.KotlinModule
10-
import no.nav.paw.arbeidssoeker.synk.model.Arbeidssoeker
10+
import no.nav.paw.arbeidssoeker.synk.model.ArbeidssoekerFileRow
1111
import java.net.URI
1212
import java.nio.file.Path
1313

@@ -36,8 +36,8 @@ sealed class CsvReader<T>(val objectReader: ObjectReader) {
3636
}
3737
}
3838

39-
data object ArbeidssoekerCsvReader : CsvReader<Arbeidssoeker>(
39+
data object ArbeidssoekerCsvReader : CsvReader<ArbeidssoekerFileRow>(
4040
objectReader = csvMapper
41-
.readerFor(Arbeidssoeker::class.java)
41+
.readerFor(ArbeidssoekerFileRow::class.java)
4242
.with(csvSchema)
4343
)
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
syncFilePath = "/tmp/v1.csv"
2-
markerForhaandsgodkjentAvAnsatt = false
3-
apiInngangBaseUrl = "http://localhost:8090"
4-
apiInngangScope = "api://test.paw.paw-arbeidssokerregisteret-api-inngang/.default"
2+
3+
[defaultVerdier]
4+
periodeTilstand = "STARTET"
5+
forhaandsgodkjentAvAnsatt = false
6+
7+
[apiInngang]
8+
baseUrl = "http://localhost:8090"
9+
scope = "api://test.paw.paw-arbeidssokerregisteret-api-inngang/.default"
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
syncFilePath = "/var/run/secrets/paw-arbeidssoekere-synk-jobb-csv/v1.csv"
2-
markerForhaandsgodkjentAvAnsatt = false
3-
apiInngangBaseUrl = "http://paw-arbeidssokerregisteret-api-inngang"
4-
apiInngangScope = "api://${NAIS_CLUSTER_NAME}.paw.paw-arbeidssokerregisteret-api-inngang/.default"
2+
3+
[defaultVerdier]
4+
periodeTilstand = "STARTET"
5+
forhaandsgodkjentAvAnsatt = false
6+
7+
[apiInngang]
8+
baseUrl = "http://paw-arbeidssokerregisteret-api-inngang"
9+
scope = "api://${NAIS_CLUSTER_NAME}.paw.paw-arbeidssokerregisteret-api-inngang/.default"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package no.nav.paw.arbeidssoeker.synk.context
2+
3+
import io.ktor.http.HttpStatusCode
4+
import no.nav.paw.arbeidssoeker.synk.config.JOB_CONFIG
5+
import no.nav.paw.arbeidssoeker.synk.config.JobConfig
6+
import no.nav.paw.arbeidssoeker.synk.consumer.InngangHttpConsumer
7+
import no.nav.paw.arbeidssoeker.synk.repository.ArbeidssoekerSynkRepository
8+
import no.nav.paw.arbeidssoeker.synk.service.ArbeidssoekerSynkService
9+
import no.nav.paw.arbeidssoeker.synk.test.buildMockHttpClient
10+
import no.nav.paw.arbeidssoeker.synk.test.createTestDataSource
11+
import no.nav.paw.arbeidssoeker.synk.utils.flywayMigrate
12+
import no.nav.paw.config.hoplite.loadNaisOrLocalConfiguration
13+
import org.jetbrains.exposed.sql.Database
14+
import kotlin.io.path.toPath
15+
16+
class TestContext {
17+
private val fileUrl = javaClass.getResource("/v1.csv")!!
18+
val filePath = fileUrl.toURI().toPath()
19+
private val jobConfig = loadNaisOrLocalConfiguration<JobConfig>(JOB_CONFIG)
20+
val arbeidssoekerSynkRepository = ArbeidssoekerSynkRepository()
21+
22+
fun initArbeidssoekerSynkService(
23+
responseMapping: Map<String, Pair<HttpStatusCode, String>>
24+
): ArbeidssoekerSynkService {
25+
val mockHttpClient = buildMockHttpClient(responseMapping)
26+
val inngangHttpConsumer = InngangHttpConsumer("http://whatever", mockHttpClient) { "dummy token" }
27+
return ArbeidssoekerSynkService(
28+
jobConfig = jobConfig,
29+
arbeidssoekerSynkRepository = arbeidssoekerSynkRepository,
30+
inngangHttpConsumer = inngangHttpConsumer
31+
)
32+
}
33+
34+
fun initDatabase() {
35+
val dataSource = createTestDataSource()
36+
dataSource.flywayMigrate()
37+
Database.connect(dataSource)
38+
}
39+
}

0 commit comments

Comments
 (0)