En Kotlin/Ktor-applikasjon for håndtering av tilbakekrevingsoperasjoner gjennom integrasjon med Skatteetatens API.
Tilbakekreving er en tjeneste som tilrettelegger for kommunikasjon med Skatteetatens API for tilbakekrevingsoperasjoner. Den tilbyr endepunkter for å hente kravdetaljer og kravoversikter.
Prosjektet følger en standard Kotlin/Ktor-applikasjonsstruktur:
src/main/kotlin/no/nav/tilbakekreving/
- HovedapplikasjonskodeApplication.kt
- Inngangspunkt for applikasjoneninfrastructure/
- Infrastrukturkomponenter (ruter, klienter)domain/
- Domenemodellerutil/
- Hjelpeklasser
src/main/resources/
- Konfigurasjonsfilerapplication.conf
- HOCON-konfigurasjon for applikasjonen
src/test/kotlin/no/nav/tilbakekreving/
- Testkodeinfrastructure/
- Tester for infrastrukturkomponenterutil/
- Tester for hjelpeklasser
Applikasjonen eksponerer følgende endepunkter:
/internal/kravdetaljer
- For å hente detaljert informasjon om krav/internal/kravoversikt
- For å hente en oversikt over krav
- JDK 21
- Gradle (wrapper inkludert)
# Bygg prosjektet
./gradlew build
# Kjør tester
./gradlew test
# Lag distribusjon
./gradlew installDist
Applikasjonen krever følgende miljøvariabler:
NAIS_CLUSTER_NAME
- NAIS-klusternavnet (brukes for å bestemme miljø)NAIS_TOKEN_ENDPOINT
- NAIS-token-endepunktet for autentisering
Miljøvariabler leses av Hoplite fra konfigurasjonsfilene (application.conf). Når du kjører applikasjonen lokalt, trenger du ikke å sette disse miljøvariablene. I stedet kan du legge til verdiene direkte i konfigurasjonsfilene:
- For lokal utvikling: Verdier spesifiseres direkte i
application-local.conf
- For utviklingsmiljø: Miljøvariabler må settes i kjøretidsmiljøet
- For produksjon: Miljøvariabler må settes i kjøretidsmiljøet
Applikasjonen er containerisert ved hjelp av et distroless Java 21-image. Dockerfile er konfigurert til å bruke utdataen
fra
installDist
Gradle-oppgaven.
For å bygge Docker-image lokalt:
./gradlew installDist
docker build -t tilbakekreving .
Prosjektet bruker følgende testrammeverk:
- Kotest - Hovedtestrammeverk med WordSpec-stil
- Mockk - Bibliotek for mocking
- Ktor Test - Verktøy for testing av Ktor-applikasjoner
- Arrow Test - Påstander for Arrow funksjonelle typer
# Kjør alle tester
./gradlew test
# Kjør en spesifikk testklasse
./gradlew test --tests no.nav.tilbakekreving.infrastructure.route.HentKravdetaljerTest
# Kjør tester med kontinuerlig bygging
./gradlew test --continuous
Kotest støtter flere teststiler. Her er et eksempel med FunSpec:
// Eksempel på testklasse med Kotest
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
class ExampleTest : FunSpec({
test("skal returnere forventet verdi") {
val result = someFunction()
result shouldBe expectedValue
}
test("skal håndtere feiltilfeller") {
val result = someFunctionWithError()
result shouldBe expectedErrorValue
}
})
For testing av HTTP-endepunkter, bruk specWideTestApplication
-verktøyet:
// Eksempel på oppsett for testing av HTTP-endepunkt
val client = specWideTestApplication {
application {
configureSerialization()
routing {
route("/your-endpoint") {
yourEndpointRoute(mockDependency)
}
}
}
}.client
// Deretter bruk klienten til å sende forespørsler
client.post("/your-endpoint") {
contentType(ContentType.Application.Json)
setBody("""{"key": "value"}""")
}.shouldBeOK()
Prosjektet bruker Arrow for funksjonelle programmeringsmønstre:
- Bruk
Either<L, R>
for operasjoner som kan feile - Returner
left()
for feil ogright()
for vellykkede resultater - Bruk Arrow-operatorer for å jobbe med funksjonelle typer
- Bruk forseglede klasser (sealed classes) for feiltyper
- Returner feil som
Either.Left
-verdier - Håndter alle mulige feiltilfeller
- Skriv tester for alle offentlige funksjoner
- Mock eksterne avhengigheter
- Bruk beskrivende testnavn som forklarer oppførselen som testes
- Bruk KDoc-kommentarer for offentlige API-er
- Dokumenter parametere og returverdier
- Gi eksempler for komplekse funksjoner
- Følg Kotlin Coding Conventions
- Bruk uttrykkskropper for enkle funksjoner
- Foretrekk uforanderlighet (val over var)
- Bruk dataklasser for modeller
Dette prosjektet bruker Dependabot for å holde avhengigheter oppdatert. Dependabot er konfigurert til å:
- Sjekke ukentlig for oppdateringer til Gradle-avhengigheter, GitHub Actions og Docker
- Automatisk opprette pull-forespørsler for oppdateringer
- Automatisk flette ikke-hovedversjonsoppdateringer for direkte avhengigheter etter at alle kontroller er bestått
Prosjektet bruker GitHub Actions for CI/CD-pipelines:
- Alle arbeidsflyter bruker den spesifikke runner-versjonen
ubuntu-24.04
i stedet forlatest
for å sikre konsistens - Følgende arbeidsflyter er definert:
- build.yaml: Gjenbrukbar arbeidsflyt for bygging og testing av applikasjonen
- deploy.yaml: Gjenbrukbar arbeidsflyt for distribusjon av applikasjonen til NAIS
- tilbakekreving.yaml: Hoved-CI/CD-pipeline som bruker de gjenbrukbare arbeidsflyterne
- dependabot-auto-merge.yml: Fletter automatisk ikke-hovedversjonsoppdateringer fra Dependabot
- Kotlin 2.1.10 - Programmeringsspråk
- Ktor 3.1.2 - Webrammeverk
- Arrow 2.0.1 - Bibliotek for funksjonell programmering
- Hoplite 2.9.0 - Konfigurasjonsbibliotek
- Kotest 6.0.0.M2 - Testrammeverk
- Mockk 1.13.17 - Mockingbibliotek