Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ jobs:
needs: changes
if: needs.changes.outputs.run == 'true'
runs-on: ubuntu-latest
# Vangnet tegen een hangende test: een request tegen een niet-bestaande route
# wordt met 405/404 beantwoord zónder de request-body te lezen, waarna een
# test die megabytes uploadt blijft schrijven tot GitHub de job na 6 uur kapt.
# 30 min is ruim boven de reguliere looptijd (~8 min).
timeout-minutes: 30
# pull-requests: write voor de coverage-PR-comment (madrapps/jacoco-report).
permissions:
Expand Down
2 changes: 1 addition & 1 deletion apis.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"apis": [
{
"name": "FBS Berichtenmagazijn — Aanlever API",
"description": "Aanlevering van berichten aan het decentrale magazijn (POST /api/v1/berichten). Onderdeel van het Federatief Berichtenstelsel.",
"description": "Aanlevering van berichten aan het decentrale magazijn (POST /api/v1/aanleveringen). Onderdeel van het Federatief Berichtenstelsel.",
"image": "https://www.rijksoverheid.nl/img/logo-rijksoverheid.svg",
"humanURL": "https://github.com/MinBZK/moza-poc-fbs-berichtenbox",
"baseURL": "/api/v1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{baseUrlMagazijn}}/berichten
url: {{baseUrlMagazijn}}/aanleveringen
body: json
auth: none
}
Expand Down
2 changes: 1 addition & 1 deletion demo/smoke.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ lever_aan() {
local respons="/tmp/smoke-aanlever-$label.json" status berichtId

status=$(curl -s -o "$respons" -w '%{http_code}' \
-X POST "$basis/api/v1/berichten" \
-X POST "$basis/api/v1/aanleveringen" \
-H 'Content-Type: application/json' \
-d "{
\"afzender\": \"$oin\",
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<maven.compiler.release>21</maven.compiler.release>
<kotlin.version>2.4.10</kotlin.version>
<quarkus.platform.version>3.38.1</quarkus.platform.version>
<openapi-generator.version>7.23.0</openapi-generator.version>
<openapi-generator.version>7.24.0</openapi-generator.version>
<detekt-maven-plugin.version>1.23.8</detekt-maven-plugin.version>
<!-- Expliciete versie: de modules declareren maven-compiler-plugin (Kotlin compileert
zelf, java-compile draait alleen op gegenereerde sources). Zonder beheerde versie
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@ import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.StatusCode
import io.opentelemetry.context.Context as OtelContext
import jakarta.enterprise.context.ApplicationScoped
import jakarta.ws.rs.Path
import jakarta.ws.rs.core.Context
import jakarta.ws.rs.core.HttpHeaders
import jakarta.ws.rs.core.UriInfo
import nl.mijnoverheidzakelijk.ldv.exporter.LogboekWriteFailureRecorder
import nl.mijnoverheidzakelijk.ldv.logboekdataverwerking.LogboekContext
import nl.mijnoverheidzakelijk.ldv.logboekdataverwerking.LogboekWriteException
import nl.mijnoverheidzakelijk.ldv.logboekdataverwerking.ProcessingHandler
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ApiInfo
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.AanleverApi
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtAanleverenRequest
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtLinks
Expand All @@ -29,6 +27,10 @@ import org.jboss.logging.Logger
/**
* REST-resource voor de Aanlever API.
*
* **Geen eigen `@Path`**: de paden komen uit de gegenereerde [AanleverApi], de
* `/api/v1`-prefix uit `quarkus.rest.path`. Een class-`@Path` hier zou botsen met
* de pad-verdeling die de generator zelf over class- en methode-niveau maakt.
*
* **Geen `@Logboek`-annotatie**: die interceptor zet `processingActivityId` op een
* hardcoded annotation-value, wat config-driven URI's onmogelijk maakt. Daarom zelf
* span-management (zoals [nl.rijksoverheid.moz.fbs.berichtenmagazijn.publicatie.PublicatieClaimVerwerker]),
Expand All @@ -42,7 +44,6 @@ import org.jboss.logging.Logger
* clusterrand (mTLS PKIoverheid / OAuth, edge-gateway), dus de upstream is vertrouwd
* en de inzage-entry voor LDV ligt daar — niet bij dit endpoint.
*/
@Path(ApiInfo.BASE_PATH + "/berichten")
@ApplicationScoped
class AanleverResource(
private val opslagService: BerichtOpslagService,
Expand Down Expand Up @@ -129,7 +130,6 @@ class AanleverResource(

private fun naarBerichtResponse(bericht: Bericht): BerichtResponse {
val selfHref = uriInfo.baseUriBuilder
.path(ApiInfo.BASE_PATH)
.path("berichten")
.path(bericht.berichtId.toString())
.build().toString()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,40 +1,53 @@
package nl.rijksoverheid.moz.fbs.berichtenmagazijn.ophaal
package nl.rijksoverheid.moz.fbs.berichtenmagazijn.berichten

import jakarta.enterprise.context.ApplicationScoped
import jakarta.ws.rs.InternalServerErrorException
import jakarta.ws.rs.Path
import jakarta.ws.rs.container.ContainerRequestContext
import jakarta.ws.rs.core.Context
import jakarta.ws.rs.core.MediaType
import jakarta.ws.rs.core.UriInfo
import org.jboss.logging.Logger
import nl.mijnoverheidzakelijk.ldv.logboekdataverwerking.Logboek
import nl.mijnoverheidzakelijk.ldv.logboekdataverwerking.LogboekContext
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ApiInfo
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ProcessingActivities
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.OphaalApi
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.BerichtenApi
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.Bericht
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtenLijst
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.beheer.BerichtBeheerService
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ophaal.BIJLAGE_MIME_TYPE_PROPERTY
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ophaal.BerichtDtoMapper
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ophaal.BerichtOphaalService
import nl.rijksoverheid.moz.fbs.common.identificatie.Identificatienummer
import java.util.UUID
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtStatusPatch as BerichtStatusPatchDto
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.opslag.BerichtStatusPatch as BerichtStatusPatchDomain

/**
* Resource voor de Ophaal-API. Implementeert de gegenereerde [OphaalApi]
* interface en mapt domeinobjecten naar de API-modellen via [BerichtDtoMapper].
* Resource voor alle operaties onder `/berichten`: lijst, detail, bijlage, status-PATCH
* en soft-delete. Ophalen en beheren delen één instappunt omdat één tag in de spec één
* gegenereerde interface oplevert, en die door precies één class geïmplementeerd wordt.
* Ze moeten dezelfde tag delen omdat ze hetzelfde pad delen — `GET` en `PATCH`/`DELETE`
* op `/berichten/{berichtId}` — en twee tags onder dezelfde pad-root elkaars routes
* onbereikbaar maken. De logica zelf blijft gescheiden in [BerichtOphaalService] en
* [BerichtBeheerService]; alleen de HTTP-laag komt hier samen.
*
* Voor `getBijlage` wordt het werkelijke MIME-type van de bijlage in de
* `Content-Type` response-header gezet via [BijlageContentTypeFilter]; de
* resource zet het MIME-type op een request-attribute zodat het filter het
* vlak voor het schrijven van de body kan toepassen.
* Bewust géén eigen `@Path`: de paden komen uit [BerichtenApi], de `/api/v1`-prefix uit
* `quarkus.rest.path`. Een class-`@Path` hier zou botsen met de pad-verdeling die de
* generator zelf over class- en methode-niveau maakt.
*
* Voor `getBijlage` wordt het werkelijke MIME-type van de bijlage in de `Content-Type`
* response-header gezet via `BijlageContentTypeFilter`; de resource zet het MIME-type op
* een request-attribute zodat het filter het vlak voor het schrijven van de body kan
* toepassen.
*/
@Path(ApiInfo.BASE_PATH + "/berichten")
@ApplicationScoped
class OphaalResource(
class BerichtenResource(
private val ophaalService: BerichtOphaalService,
private val beheerService: BerichtBeheerService,
private val logboekContext: LogboekContext,
@param:Context private val uriInfo: UriInfo,
@param:Context private val request: ContainerRequestContext,
) : OphaalApi {
) : BerichtenApi {

@Logboek(
name = "ophalen-berichtenlijst",
Expand All @@ -54,6 +67,7 @@ class OphaalResource(
page = page ?: 0,
pageSize = pageSize ?: DEFAULT_PAGE_SIZE,
)

return BerichtDtoMapper.toBerichtenLijst(pagina, afzender, uriInfo.baseUriBuilder)
}

Expand All @@ -65,6 +79,7 @@ class OphaalResource(
val ontvanger = Identificatienummer.fromHeader(xOntvanger)
registreerLdvSubject(ontvanger)
val bericht = ophaalService.haalBerichtOp(berichtId, ontvanger)

return BerichtDtoMapper.toBericht(bericht, uriInfo.baseUriBuilder)
}

Expand Down Expand Up @@ -92,13 +107,49 @@ class OphaalResource(
)
}
.getOrNull()

if (mediaType == null) {
throw InternalServerErrorException("Ongeldig MIME-type in bijlage")
}

request.setProperty(BIJLAGE_MIME_TYPE_PROPERTY, mediaType.toString())

return bijlage.content
}

@Logboek(
name = "bijwerken-bericht-status",
processingActivityId = ProcessingActivities.MAGAZIJN_BEHEER,
)
override fun updateBerichtStatus(
berichtId: UUID,
xOntvanger: String,
berichtStatusPatch: BerichtStatusPatchDto,
): Bericht {
val ontvanger = Identificatienummer.fromHeader(xOntvanger)
registreerLdvSubject(ontvanger)
val bericht = beheerService.wijzigStatus(
berichtId = berichtId,
ontvanger = ontvanger,
patch = BerichtStatusPatchDomain(
gelezen = berichtStatusPatch.gelezen,
map = berichtStatusPatch.map,
),
)

return BerichtDtoMapper.toBericht(bericht, uriInfo.baseUriBuilder)
}

@Logboek(
name = "verwijderen-bericht",
processingActivityId = ProcessingActivities.MAGAZIJN_BEHEER,
)
override fun verwijderBericht(berichtId: UUID, xOntvanger: String) {
val ontvanger = Identificatienummer.fromHeader(xOntvanger)
registreerLdvSubject(ontvanger)
beheerService.verwijder(berichtId, ontvanger)
}

private fun registreerLdvSubject(ontvanger: Identificatienummer) {
// Zet dataSubjectId nadat fromHeader is geslaagd — bij een 400 (ongeldige
// header) blijft de safe default uit LogboekContextDefaultFilter staan.
Expand All @@ -109,7 +160,7 @@ class OphaalResource(
}

private companion object {
private val log: Logger = Logger.getLogger(OphaalResource::class.java)
private val log: Logger = Logger.getLogger(BerichtenResource::class.java)

// Default voor `pageSize` als de query-param ontbreekt. De gegenereerde
// interface levert `pageSize` als `Int?`; Quarkus REST dwingt de
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package nl.rijksoverheid.moz.fbs.berichtenmagazijn.ophaal

import jakarta.ws.rs.core.UriBuilder
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.ApiInfo
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtLinks
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtSamenvatting
import nl.rijksoverheid.moz.fbs.berichtenmagazijn.api.model.BerichtStatusInfo
Expand Down Expand Up @@ -129,7 +128,6 @@ internal object BerichtDtoMapper {

private fun linkVoorPagina(page: Int, pageSize: Int, afzender: String?, baseUri: UriBuilder): Link {
var builder = baseUri.clone()
.path(ApiInfo.BASE_PATH)
.path("berichten")
.queryParam("page", page)
.queryParam("pageSize", pageSize)
Expand All @@ -140,13 +138,11 @@ internal object BerichtDtoMapper {
}

private fun selfHrefVoorBericht(berichtId: UUID, baseUri: UriBuilder) = baseUri.clone()
.path(ApiInfo.BASE_PATH)
.path("berichten")
.path(berichtId.toString())
.build().toString()

private fun bijlageHref(berichtId: UUID, bijlageId: UUID, baseUri: UriBuilder) = baseUri.clone()
.path(ApiInfo.BASE_PATH)
.path("berichten")
.path(berichtId.toString())
.path("bijlagen")
Expand Down
Loading
Loading