Skip to content

Commit

Permalink
chore: refactoring to not use optional and wrapping withContext
Browse files Browse the repository at this point in the history
Co-authored-by: Andreas <[email protected]>
  • Loading branch information
jaflaten and andreasDev committed Nov 29, 2024
1 parent b4ce4ed commit 51e154e
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,36 @@ class NasjonalOppgaveService(
suspend fun lagreOppgave(papirManuellOppgave: PapirManuellOppgave): NasjonalManuellOppgaveDAO = withContext(Dispatchers.IO) {
val eksisterendeOppgave = nasjonalOppgaveRepository.findBySykmeldingId(papirManuellOppgave.sykmeldingId)

if (eksisterendeOppgave.isPresent) {
log.info("Fant eksisterende oppgave med sykmeldingId ${papirManuellOppgave.sykmeldingId} , oppdaterer oppgave med database id ${eksisterendeOppgave.get().id}")
nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, eksisterendeOppgave.get().id))
if (eksisterendeOppgave != null) {
log.info("Fant eksisterende oppgave med sykmeldingId ${papirManuellOppgave.sykmeldingId} , oppdaterer oppgave med database id ${eksisterendeOppgave.id}")
nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, eksisterendeOppgave.id))
}
val res = nasjonalOppgaveRepository.save(mapToDao(papirManuellOppgave, null))
log.info("Lagret oppgave med sykmeldingId ${res.sykmeldingId} og med database id ${eksisterendeOppgave.get().id}")
log.info("Lagret oppgave med sykmeldingId ${res.sykmeldingId} og med database id ${eksisterendeOppgave?.id}")
res
}

suspend fun oppdaterOppgave(sykmeldingId: String, utfall: String, ferdigstiltAv: String, avvisningsgrunn: String?): NasjonalManuellOppgaveDAO = withContext(Dispatchers.IO){
nasjonalOppgaveRepository.save(
mapToUpdateDao(sykmeldingId, utfall, ferdigstiltAv, avvisningsgrunn, nasjonalOppgaveRepository.findBySykmeldingId(sykmeldingId).get()),
)
suspend fun oppdaterOppgave(sykmeldingId: String, utfall: String, ferdigstiltAv: String, avvisningsgrunn: String?): NasjonalManuellOppgaveDAO? = withContext(Dispatchers.IO){
val updated = nasjonalOppgaveRepository.findBySykmeldingId(sykmeldingId)?.copy(
utfall = utfall,
ferdigstiltAv = ferdigstiltAv,
avvisningsgrunn = avvisningsgrunn,
datoFerdigstilt = LocalDateTime.now(),
ferdigstilt = true,
)
when (updated) {
null -> log.info("Sykmelding $sykmeldingId not found ")
else -> nasjonalOppgaveRepository.save(updated)
}
updated
}

suspend fun findByOppgaveId(oppgaveId: Int): NasjonalManuellOppgaveDAO? {
val oppgave = withContext(Dispatchers.IO) {
nasjonalOppgaveRepository.findByOppgaveId(oppgaveId)
}
if (!oppgave.isPresent) return null
return oppgave.get()
if (oppgave == null) return null
return oppgave
}

suspend fun getNasjonalOppgave(oppgaveId: String): NasjonalManuellOppgaveDAO {
Expand Down Expand Up @@ -96,14 +105,14 @@ class NasjonalOppgaveService(
val eksisterendeOppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId)

val avvisningsgrunn = mapper.readValue(request, AvvisSykmeldingRequest::class.java).reason
if (eksisterendeOppgave.isPresent) {
if (eksisterendeOppgave != null) {
val navEmail = oppgaveSecurityService.getNavEmailAsync()
log.info("navEmail: $navEmail")
// val veilederIdent = oppgaveSecurityService.getNavIdent().veilederIdent
val veilederIdent = navEmail
ferdigstillNasjonalAvvistOppgave(oppgaveId, authorization, navEnhet, navEmail, avvisningsgrunn, veilederIdent)
val res = oppdaterOppgave(
eksisterendeOppgave.get().sykmeldingId,
eksisterendeOppgave.sykmeldingId,
utfall = Utfall.AVVIST.toString(),
ferdigstiltAv = veilederIdent,
avvisningsgrunn = avvisningsgrunn,
Expand Down Expand Up @@ -262,4 +271,4 @@ private fun getLoggingMeta(sykmeldingId: String, oppgave: NasjonalManuellOppgave
journalpostId = oppgave.journalpostId,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ import java.util.UUID
@Transactional
@Repository
interface NasjonalOppgaveRepository : CrudRepository<NasjonalManuellOppgaveDAO, UUID> {
fun findBySykmeldingId(sykmeldingId: String): Optional<NasjonalManuellOppgaveDAO>
fun findByOppgaveId(oppgaveId: Int): Optional<NasjonalManuellOppgaveDAO>
fun findBySykmeldingId(sykmeldingId: String): NasjonalManuellOppgaveDAO?
fun findByOppgaveId(oppgaveId: Int): NasjonalManuellOppgaveDAO?
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import java.time.LocalDateTime
import java.util.UUID

@Table(name = "nasjonal_manuelloppgave")
open class NasjonalManuellOppgaveDAO(
data class NasjonalManuellOppgaveDAO(
@Id
@GeneratedValue(generator = "UUID")
var id: UUID? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,100 +43,99 @@ class OppgaveSecurityService(
return tilgang
}

suspend fun hasAccessToNasjonalOppgave(oppgaveId: String): Boolean {
securelog.info("sjekker om bruker har tilgang på oppgave $oppgaveId")
val oppgave = withContext(Dispatchers.IO) {
nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt())
suspend fun hasAccessToNasjonalOppgave(oppgaveId: String): Boolean = withContext(
Dispatchers.IO) {
securelog.info("sjekker om bruker har tilgang på oppgave $oppgaveId")
val oppgave = nasjonalOppgaveRepository.findByOppgaveId(oppgaveId.toInt())
val navEmail = getNavEmailAsync()
val fnr = oppgave?.fnr
if (oppgave != null && fnr != null) {
val tilgang = hasAccess(fnr, navEmail)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $oppgaveId")
tilgang
}
false
}
val navEmail = getNavEmailAsync()
val fnr = oppgave.get().fnr
if (oppgave.isPresent && fnr != null) {
val tilgang = hasAccess(fnr, navEmail)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $oppgaveId")

fun hasAccessToSykmelding(sykmeldingId: String): Boolean {
securelog.info("sjekker om bruker har tilgang på sykmelding $sykmeldingId")
val oppgave = sykDigOppgaveService.getOppgaveFromSykmeldingId(sykmeldingId)
val navEmail = getNavEmail()
val tilgang = hasAccess(oppgave.fnr, navEmail)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $sykmeldingId")
return tilgang
}
return false
}

fun hasAccessToSykmelding(sykmeldingId: String): Boolean {
securelog.info("sjekker om bruker har tilgang på sykmelding $sykmeldingId")
val oppgave = sykDigOppgaveService.getOppgaveFromSykmeldingId(sykmeldingId)
val navEmail = getNavEmail()
val tilgang = hasAccess(oppgave.fnr, navEmail)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} tilgang til oppgave med id $sykmeldingId")
return tilgang
}

fun hasAccessToJournalpost(journalpostResult: JournalpostResult): Boolean {
return when (journalpostResult) {
is Journalpost -> return hasAccess(journalpostResult.fnr, getNavEmail())
is JournalpostStatus -> return true
else -> false
fun hasAccessToJournalpost(journalpostResult: JournalpostResult): Boolean {
return when (journalpostResult) {
is Journalpost -> return hasAccess(journalpostResult.fnr, getNavEmail())
is JournalpostStatus -> return true
else -> false
}
}
}

fun hasAccessToJournalpostId(journalpostId: String): Boolean {
val journalpost = safGraphQlClient.getJournalpost(journalpostId)
securelog.info("journalpostid $journalpostId ble hentet: ${objectMapper.writeValueAsString(journalpost)}")
fun hasAccessToJournalpostId(journalpostId: String): Boolean {
val journalpost = safGraphQlClient.getJournalpost(journalpostId)
securelog.info("journalpostid $journalpostId ble hentet: ${objectMapper.writeValueAsString(journalpost)}")

val id =
when (journalpost.journalpost?.bruker?.type) {
Type.ORGNR -> null
else -> journalpost.journalpost?.bruker?.id
}
val id =
when (journalpost.journalpost?.bruker?.type) {
Type.ORGNR -> null
else -> journalpost.journalpost?.bruker?.id
}

if (id == null) {
securelog.info("Fant ikke id i journalpost: $journalpostId")
return false
}
if (id == null) {
securelog.info("Fant ikke id i journalpost: $journalpostId")
return false
}

val fnr = personService.getPerson(id, journalpostId).fnr
val fnr = personService.getPerson(id, journalpostId).fnr

securelog.info("Fødselsnummer: $fnr")
val navEmail = getNavEmail()
val tilgang = hasAccess(fnr, journalpostId)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} til journalpost med id $journalpostId")
return tilgang
}
securelog.info("Fødselsnummer: $fnr")
val navEmail = getNavEmail()
val tilgang = hasAccess(fnr, journalpostId)
securelog.info("Innlogget bruker: $navEmail har${if (!tilgang) " ikke" else ""} til journalpost med id $journalpostId")
return tilgang
}

private fun hasAccess(
fnr: String,
navEmail: String,
): Boolean {
val tilgang = istilgangskontrollOboClient.sjekkTilgangVeileder(fnr)
auditlog.info(
AuditLogger().createcCefMessage(
fnr = fnr,
navEmail = navEmail,
operation = AuditLogger.Operation.READ,
requestPath = "/api/graphql",
permit =
when (tilgang) {
true -> AuditLogger.Permit.PERMIT
false -> AuditLogger.Permit.DENY
},
),
)
private fun hasAccess(
fnr: String,
navEmail: String,
): Boolean {
val tilgang = istilgangskontrollOboClient.sjekkTilgangVeileder(fnr)
auditlog.info(
AuditLogger().createcCefMessage(
fnr = fnr,
navEmail = navEmail,
operation = AuditLogger.Operation.READ,
requestPath = "/api/graphql",
permit =
when (tilgang) {
true -> AuditLogger.Permit.PERMIT
false -> AuditLogger.Permit.DENY
},
),
)

return tilgang
}
return tilgang
}

fun getNavIdent(): Veileder {
val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken
return Veileder(authentication.token.claims["NAVident"].toString())
}
fun getNavIdent(): Veileder {
val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken
return Veileder(authentication.token.claims["NAVident"].toString())
}

fun getNavEmail(): String {
val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken
return authentication.token.claims["preferred_username"].toString()
}
fun getNavEmail(): String {
val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken
return authentication.token.claims["preferred_username"].toString()
}

suspend fun getNavEmailAsync(): String {
return ReactiveSecurityContextHolder.getContext().map { context ->
val auth = context.authentication as JwtAuthenticationToken
auth.token.claims["preferred_username"].toString()
}.awaitSingle()
}
suspend fun getNavEmailAsync(): String {
return ReactiveSecurityContextHolder.getContext().map { context ->
val auth = context.authentication as JwtAuthenticationToken
auth.token.claims["preferred_username"].toString()
}.awaitSingle()
}
}


22 changes: 12 additions & 10 deletions src/main/resources/db/migration/V14__create_nasjonal_tables.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
drop table if exists nasjonal_manuelloppgave;
drop table if exists nasjonal_sykmelding;

create table nasjonal_manuelloppgave
(
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
Expand All @@ -9,25 +6,30 @@ create table nasjonal_manuelloppgave
fnr VARCHAR NULL,
aktor_id VARCHAR NULL,
dokument_info_id VARCHAR NULL,
dato_opprettet TIMESTAMP NULL,
dato_opprettet TIMESTAMP with time zone NULL,
oppgave_id INT,
ferdigstilt boolean NOT NULL,
papir_sm_registrering JSONB NULL,
utfall VARCHAR NULL,
ferdigstilt_av VARCHAR NULL,
dato_ferdigstilt TIMESTAMP NULL,
dato_ferdigstilt TIMESTAMP with time zone NULL,
avvisningsgrunn VARCHAR NULL
);

create table nasjonal_sykmelding
(
sykmelding_id VARCHAR NOT NULL,
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
sykmelding_id VARCHAR NOT NULL,
sykmelding JSONB NOT NULL,
timestamp TIMESTAMP with time zone NOT NULL,
ferdigstilt_av VARCHAR null,
dato_ferdigstilt TIMESTAMP,
primary key (sykmelding_id, timestamp)
ferdigstilt_av VARCHAR NULL,
dato_ferdigstilt TIMESTAMP with time zone NULL
);

ALTER TABLE nasjonal_manuelloppgave
ADD CONSTRAINT unique_sykmelding_id UNIQUE (sykmelding_id);
ADD CONSTRAINT unique_sykmelding_id UNIQUE (sykmelding_id);

ALTER TABLE nasjonal_sykmelding
ADD CONSTRAINT unique_sykmelding_id_timestamp UNIQUE (sykmelding_id, timestamp);

CREATE INDEX idx_sykmelding_id ON sykmelding(sykmelding_id);

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ class NasjonalOppgaveRepositoryTest : IntegrationTest() {
fun `given New NasjonalOppgave opprett og hent`() = runBlocking {
val savedOppgave = nasjonalOppgaveRepository.save(testData(null, "123"))
val retrievedOppgave = nasjonalOppgaveRepository.findBySykmeldingId(savedOppgave.sykmeldingId)
Assertions.assertTrue(retrievedOppgave.isPresent)
assertEquals(savedOppgave.sykmeldingId, retrievedOppgave.get().sykmeldingId)
Assertions.assertNotNull(retrievedOppgave)
assertEquals(savedOppgave.sykmeldingId, retrievedOppgave?.sykmeldingId)
}

@Test
fun `insert two instances with same sykmeldingId`() = runBlocking {
nasjonalOppgaveRepository.save(testData(null, "1"))
val eksisterendeOppgave = nasjonalOppgaveRepository.findBySykmeldingId("1")
nasjonalOppgaveRepository.save(testData(eksisterendeOppgave.get().id, "1"))
nasjonalOppgaveRepository.save(testData(eksisterendeOppgave?.id, "1"))
val retrievedOppgave = nasjonalOppgaveRepository.findAll()
assertEquals(1, retrievedOppgave.count())
}
Expand Down

0 comments on commit 51e154e

Please sign in to comment.