Skip to content

Commit

Permalink
HAI-3326 Add täydennys liitteet to hakemus API (#901)
Browse files Browse the repository at this point in the history
When getting a single hakemus, add liitteet to the taydennys object of
the hakemus. Return the information for any existing attachments.
  • Loading branch information
corvidian authored Dec 13, 2024
1 parent c9c62cf commit 28e0b29
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ import fi.hel.haitaton.hanke.factory.HankeFactory
import fi.hel.haitaton.hanke.factory.HankealueFactory
import fi.hel.haitaton.hanke.factory.PaatosFactory
import fi.hel.haitaton.hanke.factory.PaperDecisionReceiverFactory
import fi.hel.haitaton.hanke.factory.TaydennysAttachmentFactory
import fi.hel.haitaton.hanke.factory.TaydennysFactory
import fi.hel.haitaton.hanke.factory.TaydennysFactory.Companion.withMuutokset
import fi.hel.haitaton.hanke.factory.TaydennysFactory.Companion.withExtras
import fi.hel.haitaton.hanke.factory.TaydennyspyyntoFactory
import fi.hel.haitaton.hanke.geometria.GeometriatDao
import fi.hel.haitaton.hanke.getResourceAsBytes
Expand All @@ -47,7 +48,7 @@ import fi.hel.haitaton.hanke.paatos.PaatosTyyppi.PAATOS
import fi.hel.haitaton.hanke.paatos.PaatosTyyppi.TOIMINNALLINEN_KUNTO
import fi.hel.haitaton.hanke.paatos.PaatosTyyppi.TYO_VALMIS
import fi.hel.haitaton.hanke.permissions.PermissionCode
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutokset
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtras
import fi.hel.haitaton.hanke.test.USERNAME
import fi.hel.haitaton.hanke.toJsonString
import fi.hel.haitaton.hanke.valmistumisilmoitus.ValmistumisilmoitusFactory
Expand Down Expand Up @@ -277,12 +278,12 @@ class HakemusControllerITest(@Autowired override val mockMvc: MockMvc) : Control
applicationType = applicationType,
hankeTunnus = HANKE_TUNNUS,
)
val taydennys: TaydennysWithMuutokset =
val taydennys: TaydennysWithExtras =
TaydennysFactory.create(
hakemusId = hakemus.id,
hakemusData = hakemus.applicationData,
)
.withMuutokset(hakemus.applicationData)
.withExtras()
every { hakemusService.getWithExtras(id) } returns
hakemus.withExtras(taydennys = taydennys)
every { authorizer.authorizeHakemusId(id, PermissionCode.VIEW.name) } returns true
Expand All @@ -297,6 +298,8 @@ class HakemusControllerITest(@Autowired override val mockMvc: MockMvc) : Control
)
.andExpect(jsonPath("$.taydennys.muutokset").isArray)
.andExpect(jsonPath("$.taydennys.muutokset").isEmpty)
.andExpect(jsonPath("$.taydennys.liitteet").isArray)
.andExpect(jsonPath("$.taydennys.liitteet").isEmpty)

verifySequence {
authorizer.authorizeHakemusId(id, PermissionCode.VIEW.name)
Expand All @@ -318,12 +321,12 @@ class HakemusControllerITest(@Autowired override val mockMvc: MockMvc) : Control
hankeTunnus = HANKE_TUNNUS,
)
val muutokset = listOf("name", "areas[1]")
val taydennys: TaydennysWithMuutokset =
val taydennys: TaydennysWithExtras =
TaydennysFactory.create(
hakemusId = hakemus.id,
hakemusData = hakemus.applicationData,
)
.withMuutokset(muutokset)
.withExtras(muutokset = muutokset)
every { hakemusService.getWithExtras(id) } returns
hakemus.withExtras(taydennys = taydennys)
every { authorizer.authorizeHakemusId(id, PermissionCode.VIEW.name) } returns true
Expand All @@ -342,6 +345,44 @@ class HakemusControllerITest(@Autowired override val mockMvc: MockMvc) : Control
}
}

@ParameterizedTest
@EnumSource(ApplicationType::class)
fun `returns taydennys liitteet with hakemus`(applicationType: ApplicationType) {
val hakemus =
HakemusFactory.create(
id = id,
applicationType = applicationType,
hankeTunnus = HANKE_TUNNUS,
)
val liitteet =
listOf(
TaydennysAttachmentFactory.create(fileName = "First"),
TaydennysAttachmentFactory.create(fileName = "Second"),
)
val taydennys: TaydennysWithExtras =
TaydennysFactory.create(
hakemusId = hakemus.id,
hakemusData = hakemus.applicationData,
)
.withExtras(liitteet = liitteet)
every { hakemusService.getWithExtras(id) } returns
hakemus.withExtras(taydennys = taydennys)
every { authorizer.authorizeHakemusId(id, PermissionCode.VIEW.name) } returns true

get(url)
.andExpect(status().isOk)
.andExpect(jsonPath("taydennys").exists())
.andExpect(jsonPath("taydennys.liitteet[0].fileName").value("First"))
.andExpect(jsonPath("taydennys.liitteet[1].fileName").value("Second"))

verifySequence {
authorizer.authorizeHakemusId(id, PermissionCode.VIEW.name)
hakemusService.getWithExtras(id)
disclosureLogService.saveForHakemusResponse(any(), USERNAME)
disclosureLogService.saveForTaydennys(taydennys.toResponse().taydennys, USERNAME)
}
}

@Test
fun `returns valmistumisilmoitukset with a kaivuilmoitus`() {
val hakemus =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import fi.hel.haitaton.hanke.factory.HankeKayttajaFactory
import fi.hel.haitaton.hanke.factory.HankeKayttajaFactory.Companion.KAYTTAJA_INPUT_ASIANHOITAJA
import fi.hel.haitaton.hanke.factory.PaatosFactory
import fi.hel.haitaton.hanke.factory.PaperDecisionReceiverFactory
import fi.hel.haitaton.hanke.factory.TaydennysAttachmentFactory
import fi.hel.haitaton.hanke.factory.TaydennysFactory
import fi.hel.haitaton.hanke.factory.TaydennyspyyntoFactory
import fi.hel.haitaton.hanke.factory.TaydennyspyyntoFactory.Companion.addKentta
Expand All @@ -78,7 +79,7 @@ import fi.hel.haitaton.hanke.logging.Operation
import fi.hel.haitaton.hanke.paatos.PaatosTila
import fi.hel.haitaton.hanke.permissions.HankekayttajaRepository
import fi.hel.haitaton.hanke.permissions.Kayttooikeustaso
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutokset
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtras
import fi.hel.haitaton.hanke.taydennys.Taydennyspyynto
import fi.hel.haitaton.hanke.test.AlluException
import fi.hel.haitaton.hanke.test.Asserts.hasStreetName
Expand Down Expand Up @@ -140,6 +141,7 @@ class HakemusServiceITest(
@Autowired private val alluClient: AlluClient,
@Autowired private val taydennyspyyntoFactory: TaydennyspyyntoFactory,
@Autowired private val taydennysFactory: TaydennysFactory,
@Autowired private val taydennysAttachmentFactory: TaydennysAttachmentFactory,
@Autowired private val hankeService: HankeService,
) : IntegrationTest() {

Expand Down Expand Up @@ -284,12 +286,12 @@ class HakemusServiceITest(
val response = hakemusService.getWithExtras(hakemus.id)

assertThat(response.taydennys).isNotNull().all {
prop(TaydennysWithMuutokset::id).isEqualTo(taydennys.id)
prop(TaydennysWithMuutokset::hakemusData).all {
prop(TaydennysWithExtras::id).isEqualTo(taydennys.id)
prop(TaydennysWithExtras::hakemusData).all {
prop(HakemusData::name).isEqualTo(ApplicationFactory.DEFAULT_APPLICATION_NAME)
prop(HakemusData::startTime).isEqualTo(DateFactory.getStartDatetime())
}
prop(TaydennysWithMuutokset::muutokset).isEmpty()
prop(TaydennysWithExtras::muutokset).isEmpty()
}
}

Expand All @@ -310,16 +312,36 @@ class HakemusServiceITest(
val response = hakemusService.getWithExtras(hakemus.id)

assertThat(response.taydennys).isNotNull().all {
prop(TaydennysWithMuutokset::hakemusData)
prop(TaydennysWithExtras::hakemusData)
.isInstanceOf(JohtoselvityshakemusData::class)
.all {
prop(JohtoselvityshakemusData::emergencyWork).isTrue()
prop(JohtoselvityshakemusData::postalAddress).hasStreetName("Tie 3")
}
prop(TaydennysWithMuutokset::muutokset)
prop(TaydennysWithExtras::muutokset)
.containsExactlyInAnyOrder("emergencyWork", "postalAddress")
}
}

@Test
fun `returns liitteet with taydennys`() {
val hakemus =
hakemusFactory
.builder()
.withMandatoryFields()
.withStatus(ApplicationStatus.WAITING_INFORMATION)
.saveEntity()
val taydennys = taydennysFactory.builder(hakemus).save()
taydennysAttachmentFactory.save(fileName = "First", taydennys = taydennys)
taydennysAttachmentFactory.save(fileName = "Second", taydennys = taydennys)

val response = hakemusService.getWithExtras(hakemus.id)

assertThat(response.taydennys).isNotNull().prop(TaydennysWithExtras::liitteet).all {
hasSize(2)
extracting { it.fileName }.containsExactlyInAnyOrder("First", "Second")
}
}
}

@Nested
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import fi.hel.haitaton.hanke.allu.CustomerType
import fi.hel.haitaton.hanke.attachment.application.ApplicationAttachmentService
import fi.hel.haitaton.hanke.attachment.common.ApplicationAttachmentMetadata
import fi.hel.haitaton.hanke.attachment.common.ApplicationAttachmentType
import fi.hel.haitaton.hanke.attachment.taydennys.TaydennysAttachmentMetadataService
import fi.hel.haitaton.hanke.daysBetween
import fi.hel.haitaton.hanke.domain.Hankevaihe
import fi.hel.haitaton.hanke.email.ApplicationNotificationEmail
Expand Down Expand Up @@ -71,6 +72,7 @@ class HakemusService(
private val disclosureLogService: DisclosureLogService,
private val hankeKayttajaService: HankeKayttajaService,
private val attachmentService: ApplicationAttachmentService,
private val taydennysAttachmentService: TaydennysAttachmentMetadataService,
private val alluClient: AlluClient,
private val paatosService: PaatosService,
private val applicationEventPublisher: ApplicationEventPublisher,
Expand All @@ -86,10 +88,10 @@ class HakemusService(
val paatokset = paatosService.findByHakemusId(hakemusId)
val taydennyspyynto = taydennyspyyntoRepository.findByApplicationId(hakemusId)?.toDomain()
val taydennys =
taydennysRepository
.findByApplicationId(hakemusId)
?.toDomain()
?.withMuutokset(hakemus.applicationData)
taydennysRepository.findByApplicationId(hakemusId)?.let {
val liitteet = taydennysAttachmentService.getMetadataList(it.id)
it.toDomain().withExtras(hakemus.applicationData, liitteet)
}

return HakemusWithExtras(hakemus, paatokset, taydennyspyynto, taydennys)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ package fi.hel.haitaton.hanke.hakemus
import com.fasterxml.jackson.annotation.JsonUnwrapped
import fi.hel.haitaton.hanke.paatos.Paatos
import fi.hel.haitaton.hanke.paatos.PaatosResponse
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutokset
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutoksetResponse
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtras
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtrasResponse
import fi.hel.haitaton.hanke.taydennys.Taydennyspyynto
import fi.hel.haitaton.hanke.taydennys.TaydennyspyyntoResponse

data class HakemusWithExtras(
val hakemus: Hakemus,
val paatokset: List<Paatos>,
val taydennyspyynto: Taydennyspyynto?,
val taydennys: TaydennysWithMuutokset?,
val taydennys: TaydennysWithExtras?,
) {
fun toResponse(): HakemusWithExtrasResponse =
HakemusWithExtrasResponse(
Expand All @@ -27,5 +27,5 @@ data class HakemusWithExtrasResponse(
@JsonUnwrapped val hakemus: HakemusResponse,
val paatokset: Map<String, List<PaatosResponse>>,
val taydennyspyynto: TaydennyspyyntoResponse?,
val taydennys: TaydennysWithMuutoksetResponse?,
val taydennys: TaydennysWithExtrasResponse?,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fi.hel.haitaton.hanke.taydennys

import com.fasterxml.jackson.annotation.JsonUnwrapped
import fi.hel.haitaton.hanke.attachment.common.TaydennysAttachmentMetadata
import fi.hel.haitaton.hanke.attachment.common.TaydennysAttachmentMetadataDto
import fi.hel.haitaton.hanke.domain.HasId
import fi.hel.haitaton.hanke.hakemus.HakemusData
import fi.hel.haitaton.hanke.hakemus.HakemusDataResponse
Expand All @@ -14,32 +16,42 @@ data class Taydennys(
) : HasId<UUID> {
fun toResponse() = TaydennysResponse(id, hakemusData.toResponse())

fun withMuutokset(otherData: HakemusData): TaydennysWithMuutokset {
return TaydennysWithMuutokset(
fun withExtras(
otherData: HakemusData,
liitteet: List<TaydennysAttachmentMetadata>,
): TaydennysWithExtras {
return TaydennysWithExtras(
id = id,
taydennyspyyntoId = taydennyspyyntoId,
hakemusData = hakemusData,
muutokset = hakemusData.listChanges(otherData),
liitteet = liitteet,
)
}
}

data class TaydennysResponse(override val id: UUID, val applicationData: HakemusDataResponse) :
HasId<UUID> {
fun withMuutokset(muutokset: List<String>): TaydennysWithMuutoksetResponse =
TaydennysWithMuutoksetResponse(this, muutokset)
fun withExtras(
muutokset: List<String>,
liitteet: List<TaydennysAttachmentMetadata>,
): TaydennysWithExtrasResponse =
TaydennysWithExtrasResponse(this, muutokset, liitteet.map { it.toDto() })
}

data class TaydennysWithMuutokset(
data class TaydennysWithExtras(
override val id: UUID,
val taydennyspyyntoId: UUID,
val hakemusData: HakemusData,
val muutokset: List<String>,
val liitteet: List<TaydennysAttachmentMetadata>,
) : HasId<UUID> {
fun toResponse() = TaydennysResponse(id, hakemusData.toResponse()).withMuutokset(muutokset)
fun toResponse() =
TaydennysResponse(id, hakemusData.toResponse()).withExtras(muutokset, liitteet)
}

data class TaydennysWithMuutoksetResponse(
data class TaydennysWithExtrasResponse(
@JsonUnwrapped val taydennys: TaydennysResponse,
val muutokset: List<String>,
val liitteet: List<TaydennysAttachmentMetadataDto>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import fi.hel.haitaton.hanke.hakemus.PaperDecisionReceiver
import fi.hel.haitaton.hanke.hakemus.PostalAddress
import fi.hel.haitaton.hanke.paatos.Paatos
import fi.hel.haitaton.hanke.permissions.HankeKayttajaService
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutokset
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtras
import fi.hel.haitaton.hanke.taydennys.Taydennyspyynto
import fi.hel.haitaton.hanke.test.USERNAME
import fi.hel.haitaton.hanke.valmistumisilmoitus.Valmistumisilmoitus
Expand Down Expand Up @@ -243,7 +243,7 @@ class HakemusFactory(
fun Hakemus.withExtras(
paatokset: List<Paatos> = listOf(),
taydennyspyynto: Taydennyspyynto? = null,
taydennys: TaydennysWithMuutokset? = null,
taydennys: TaydennysWithExtras? = null,
) = HakemusWithExtras(this, paatokset, taydennyspyynto, taydennys)

fun hakemusDataForRegistryKeyTest(tyyppi: CustomerType): KaivuilmoitusData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package fi.hel.haitaton.hanke.factory

import fi.hel.haitaton.hanke.allu.ApplicationStatus
import fi.hel.haitaton.hanke.allu.CustomerType
import fi.hel.haitaton.hanke.attachment.common.TaydennysAttachmentMetadata
import fi.hel.haitaton.hanke.hakemus.ApplicationContactType
import fi.hel.haitaton.hanke.hakemus.ApplicationType
import fi.hel.haitaton.hanke.hakemus.HakemusData
Expand All @@ -15,7 +16,7 @@ import fi.hel.haitaton.hanke.taydennys.Taydennys
import fi.hel.haitaton.hanke.taydennys.TaydennysEntity
import fi.hel.haitaton.hanke.taydennys.TaydennysRepository
import fi.hel.haitaton.hanke.taydennys.TaydennysService
import fi.hel.haitaton.hanke.taydennys.TaydennysWithMuutokset
import fi.hel.haitaton.hanke.taydennys.TaydennysWithExtras
import fi.hel.haitaton.hanke.taydennys.TaydennyspyyntoEntity
import fi.hel.haitaton.hanke.taydennys.TaydennysyhteyshenkiloEntity
import fi.hel.haitaton.hanke.taydennys.TaydennysyhteyshenkiloRepository
Expand Down Expand Up @@ -135,8 +136,10 @@ class TaydennysFactory(
fun Taydennys.toUpdateRequest(): HakemusUpdateRequest =
this.toResponse().applicationData.toJsonString().parseJson()

fun Taydennys.withMuutokset(muutokset: List<String>) =
TaydennysWithMuutokset(id, taydennyspyyntoId, hakemusData, muutokset)
fun Taydennys.withExtras(
muutokset: List<String> = listOf(),
liitteet: List<TaydennysAttachmentMetadata> = listOf(),
) = TaydennysWithExtras(id, taydennyspyyntoId, hakemusData, muutokset, liitteet)

fun createYhteystietoEntity(
taydennys: TaydennysEntity,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import fi.hel.haitaton.hanke.allu.Contact
import fi.hel.haitaton.hanke.allu.Customer
import fi.hel.haitaton.hanke.allu.CustomerWithContacts
import fi.hel.haitaton.hanke.attachment.application.ApplicationAttachmentService
import fi.hel.haitaton.hanke.attachment.taydennys.TaydennysAttachmentMetadataService
import fi.hel.haitaton.hanke.factory.AlluFactory
import fi.hel.haitaton.hanke.factory.ApplicationFactory
import fi.hel.haitaton.hanke.factory.HakemusFactory
Expand Down Expand Up @@ -79,6 +80,7 @@ class HakemusServiceTest {
private val disclosureLogService: DisclosureLogService = mockk(relaxUnitFun = true)
private val hankeKayttajaService: HankeKayttajaService = mockk(relaxUnitFun = true)
private val attachmentService: ApplicationAttachmentService = mockk()
private val taydennysAttachmentService: TaydennysAttachmentMetadataService = mockk()
private val alluClient: AlluClient = mockk()
private val paatosService: PaatosService = mockk()
private val publisher: ApplicationEventPublisher = mockk()
Expand All @@ -97,6 +99,7 @@ class HakemusServiceTest {
disclosureLogService,
hankeKayttajaService,
attachmentService,
taydennysAttachmentService,
alluClient,
paatosService,
publisher,
Expand All @@ -121,6 +124,7 @@ class HakemusServiceTest {
disclosureLogService,
hankeKayttajaService,
attachmentService,
taydennysAttachmentService,
alluClient,
paatosService,
publisher,
Expand Down

0 comments on commit 28e0b29

Please sign in to comment.