1+ package no.nav.klage.innsyn.api.controller
2+
3+ import io.swagger.v3.oas.annotations.Operation
4+ import io.swagger.v3.oas.annotations.security.SecurityRequirement
5+ import io.swagger.v3.oas.annotations.tags.Tag
6+ import no.nav.klage.innsyn.api.view.InnsynResponse
7+ import no.nav.klage.innsyn.service.InnsynService
8+ import no.nav.klage.oppgave.config.SecurityConfiguration
9+ import no.nav.klage.oppgave.util.TokenUtil
10+ import no.nav.klage.oppgave.util.getLogger
11+ import no.nav.klage.oppgave.util.getSecureLogger
12+ import no.nav.klage.oppgave.util.logMethodDetails
13+ import no.nav.security.token.support.core.api.ProtectedWithClaims
14+ import org.springframework.core.io.FileSystemResource
15+ import org.springframework.core.io.Resource
16+ import org.springframework.http.HttpHeaders
17+ import org.springframework.http.MediaType
18+ import org.springframework.http.ResponseEntity
19+ import org.springframework.web.bind.annotation.GetMapping
20+ import org.springframework.web.bind.annotation.PathVariable
21+ import org.springframework.web.bind.annotation.RequestMapping
22+ import org.springframework.web.bind.annotation.RestController
23+ import java.io.FileInputStream
24+ import java.io.InputStream
25+ import java.nio.file.Files
26+
27+ @RestController
28+ @Tag(
29+ name = " kabal-innsyn" ,
30+ description = " api for innsyn i brukeres saker"
31+ )
32+
33+ @ProtectedWithClaims(issuer = SecurityConfiguration .TOKEN_X , claimMap = [" acr=Level4" ])
34+ @RequestMapping(" api/innsyn" )
35+ @SecurityRequirement(name = " bearerAuth" )
36+ class InnsynController (
37+ private val innsynService : InnsynService ,
38+ private val tokenUtil : TokenUtil ,
39+ ) {
40+
41+ companion object {
42+ @Suppress(" JAVA_CLASS_ON_COMPANION" )
43+ private val logger = getLogger(javaClass.enclosingClass)
44+ private val secureLogger = getSecureLogger()
45+ }
46+
47+ @Operation(
48+ summary = " Hent en brukers saker" ,
49+ description = " Hent en brukers saker, basert på brukerens ident hentet fra token"
50+ )
51+ @GetMapping(" /saker" )
52+ fun getSaker (): InnsynResponse {
53+ val identFromToken = tokenUtil.getSubjectFromTokenXToken()
54+ logMethodDetails(
55+ methodName = ::getSaker.name,
56+ innloggetIdent = identFromToken,
57+ logger = secureLogger,
58+ )
59+
60+ return innsynService.getSakerForBruker(fnr = identFromToken)
61+ }
62+
63+ @Operation(
64+ summary = " Hent et gitt dokument fra arkivet" ,
65+ description = " Henter alle dokumenter på en journalpost. Må være ført på innlogget bruker."
66+ )
67+ @GetMapping(" /documents/{journalpostId}" )
68+ fun getDocument (
69+ @PathVariable(" journalpostId" ) journalpostId : String ,
70+ ): ResponseEntity <Resource > {
71+ val identFromToken = tokenUtil.getSubjectFromTokenXToken()
72+ logMethodDetails(
73+ methodName = ::getDocument.name,
74+ innloggetIdent = identFromToken,
75+ logger = secureLogger,
76+ )
77+
78+ // TODO: Samkjør dette med metoden som brukes for merging av dokument inne i Kabal
79+ val (pathToMergedDocument, title) = innsynService.getJournalpostPdf(journalpostId = journalpostId)
80+ val responseHeaders = HttpHeaders ()
81+ responseHeaders.contentType = MediaType .APPLICATION_PDF
82+ responseHeaders.add(HttpHeaders .CONTENT_DISPOSITION , " inline; filename=\" $title .pdf\" " )
83+
84+ return ResponseEntity .ok()
85+ .headers(responseHeaders)
86+ .contentLength(pathToMergedDocument.toFile().length())
87+ .body(
88+ object : FileSystemResource (pathToMergedDocument) {
89+ override fun getInputStream (): InputStream {
90+ return object : FileInputStream (pathToMergedDocument.toFile()) {
91+ override fun close () {
92+ super .close()
93+ // Override to do this after client has downloaded file
94+ Files .delete(file.toPath())
95+ }
96+ }
97+ }
98+ })
99+
100+
101+ }
102+ }
0 commit comments