Skip to content

Commit

Permalink
[feat] using Optional for patch function
Browse files Browse the repository at this point in the history
  • Loading branch information
maximeperrault committed Jun 11, 2024
1 parent 6aab2d4 commit 773e5d4
Show file tree
Hide file tree
Showing 18 changed files with 218 additions and 283 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.gouv.cacem.monitorenv.config

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.SerializationFeature
Expand All @@ -21,6 +22,7 @@ class MapperConfiguration {
mapper.registerModule(JavaTimeModule())
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
mapper.propertyNamingStrategy = PropertyNamingStrategies.LOWER_CAMEL_CASE
mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

return mapper
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ abstract class EnvActionEntity(
open val id: UUID,
open val actionType: ActionTypeEnum,
@Patchable
open val actionEndDateTimeUtc: ZonedDateTime? = null,
open var actionEndDateTimeUtc: ZonedDateTime? = null,
@Patchable
open val actionStartDateTimeUtc: ZonedDateTime? = null,
open var actionStartDateTimeUtc: ZonedDateTime? = null,
open val completedBy: String? = null,
open val completion: ActionCompletionEnum? = null,
open val controlPlans: List<EnvActionControlPlanEntity>? = listOf(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import java.util.UUID

data class EnvActionNoteEntity(
override val id: UUID,
override val actionStartDateTimeUtc: ZonedDateTime? = null,
override var actionStartDateTimeUtc: ZonedDateTime? = null,
override val missionId: Int? = null,
val observations: String? = null,
) :
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import java.util.UUID

data class EnvActionSurveillanceEntity(
override val id: UUID,
override val actionEndDateTimeUtc: ZonedDateTime? = null,
override val actionStartDateTimeUtc: ZonedDateTime? = null,
override var actionEndDateTimeUtc: ZonedDateTime? = null,
override var actionStartDateTimeUtc: ZonedDateTime? = null,
override val completedBy: String? = null,
override val completion: ActionCompletionEnum? = null,
override val controlPlans: List<EnvActionControlPlanEntity>? = listOf(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fr.gouv.cacem.monitorenv.domain.entities.mission.envAction

import java.time.ZonedDateTime
import java.util.Optional

data class PatchableEnvActionEntity(
val actionStartDateTimeUtc: Optional<ZonedDateTime>?,
val actionEndDateTimeUtc: Optional<ZonedDateTime>?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import java.util.UUID

data class EnvActionControlEntity(
override val id: UUID,
override val actionEndDateTimeUtc: ZonedDateTime? = null,
override val actionStartDateTimeUtc: ZonedDateTime? = null,
override var actionEndDateTimeUtc: ZonedDateTime? = null,
override var actionStartDateTimeUtc: ZonedDateTime? = null,
override val completedBy: String? = null,
override val completion: ActionCompletionEnum? = null,
override val controlPlans: List<EnvActionControlPlanEntity>? = listOf(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.actions

import fr.gouv.cacem.monitorenv.config.UseCase
import fr.gouv.cacem.monitorenv.domain.entities.PatchableEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.PatchableEnvActionEntity
import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageErrorCode
import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException
import fr.gouv.cacem.monitorenv.domain.repositories.IEnvActionRepository
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.interactors.IDataPatcher
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.interactors.MergeEnvActionEntity
import java.util.UUID

@UseCase
class PatchEnvAction(
private val envActionRepository: IEnvActionRepository,
private val patchData: IDataPatcher<EnvActionEntity>,
private val mergeEnvActionEntity: MergeEnvActionEntity,
) {

fun execute(id: UUID, patchableEntity: PatchableEntity): EnvActionEntity {
fun execute(id: UUID, patchableEnvActionEntity: PatchableEnvActionEntity): EnvActionEntity {
envActionRepository.findById(id)?.let {
return envActionRepository.save(patchData.execute(it, patchableEntity, EnvActionEntity::class))
return envActionRepository.save(mergeEnvActionEntity.execute(it, patchableEnvActionEntity))
}
throw BackendUsageException(BackendUsageErrorCode.ENTITY_NOT_FOUND, "envAction $id not found")
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.actions.interactors

import fr.gouv.cacem.monitorenv.config.UseCase
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.PatchableEnvActionEntity
import java.time.ZonedDateTime
import java.util.Optional

@UseCase
class MergeEnvActionEntity {

fun execute(
envActionEntity: EnvActionEntity,
patchableEnvActionEntity: PatchableEnvActionEntity,
): EnvActionEntity {
val patchedActionEndDateTime =
getValueFromOptional(
envActionEntity.actionEndDateTimeUtc,
patchableEnvActionEntity.actionEndDateTimeUtc,
)
val patchedActionStartDateTime = getValueFromOptional(
envActionEntity.actionStartDateTimeUtc,
patchableEnvActionEntity.actionStartDateTimeUtc,
)
envActionEntity.actionEndDateTimeUtc = patchedActionEndDateTime
envActionEntity.actionStartDateTimeUtc = patchedActionStartDateTime
return envActionEntity
}

private fun getValueFromOptional(
actionEndDateTimeUtc: ZonedDateTime?,
oActionEndDateTimeUtc: Optional<ZonedDateTime>?,
) = if (oActionEndDateTimeUtc == null) {
actionEndDateTimeUtc
} else if (oActionEndDateTimeUtc.isEmpty) {
null
} else {
oActionEndDateTimeUtc.get()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.inputs.actions

import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.PatchableEnvActionEntity
import java.time.ZonedDateTime
import java.util.Optional

data class PatchableEnvActionDataInput(
val actionStartDateTimeUtc: Optional<ZonedDateTime>?,
val actionEndDateTimeUtc: Optional<ZonedDateTime>?,
) {
fun toPatchableEnvActionEntity(): PatchableEnvActionEntity {
return PatchableEnvActionEntity(
actionStartDateTimeUtc = actionStartDateTimeUtc,
actionEndDateTimeUtc = actionEndDateTimeUtc,
)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package fr.gouv.cacem.monitorenv.infrastructure.api.endpoints.publicapi.actions

import com.fasterxml.jackson.databind.JsonNode
import fr.gouv.cacem.monitorenv.domain.entities.PatchableEntity
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.PatchEnvAction
import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.inputs.actions.PatchableEnvActionDataInput
import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.outputs.actions.EnvActionDataOutput
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
Expand All @@ -21,8 +20,11 @@ class EnvAction(
) {
@PatchMapping("/actions/{id}")
@Operation(summary = "patch an existing action", description = "action")
fun patch(@PathVariable id: UUID, @RequestBody partialEnvActionAsJson: JsonNode): EnvActionDataOutput {
val envActionEntity = patchEnvAction.execute(id, PatchableEntity(partialEnvActionAsJson))
fun patch(
@PathVariable id: UUID,
@RequestBody partialEnvActionDataInput: PatchableEnvActionDataInput,
): EnvActionDataOutput {
val envActionEntity = patchEnvAction.execute(id, partialEnvActionDataInput.toPatchableEnvActionEntity())
return EnvActionDataOutput.fromEnvActionEntity(envActionEntity)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ package fr.gouv.cacem.monitorenv.domain.use_cases.actions
import com.fasterxml.jackson.databind.ObjectMapper
import com.nhaarman.mockitokotlin2.given
import com.nhaarman.mockitokotlin2.verify
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.PatchableEnvActionEntity
import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException
import fr.gouv.cacem.monitorenv.domain.repositories.IEnvActionRepository
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.fixtures.EnvActionFixture.Companion.aPatchableEntity
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.fixtures.EnvActionFixture.Companion.anEnvAction
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.interactors.IDataPatcher
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.interactors.MergeEnvActionEntity
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
Expand All @@ -19,8 +18,8 @@ import java.util.UUID
class PatchEnvActionUTest {

private val envActionRepository: IEnvActionRepository = mock()
private val patchData: IDataPatcher<EnvActionEntity> = mock()
private val patchEnvAction: PatchEnvAction = PatchEnvAction(envActionRepository, patchData)
private val mergeEnvActionEntity: MergeEnvActionEntity = mock()
private val patchEnvAction: PatchEnvAction = PatchEnvAction(envActionRepository, mergeEnvActionEntity)
private val objectMapper: ObjectMapper = ObjectMapper()

@Test
Expand All @@ -30,18 +29,18 @@ class PatchEnvActionUTest {
val today = ZonedDateTime.now()
val tomorrow = ZonedDateTime.now().plusDays(1)

val patchableEntity = aPatchableEntity(objectMapper)
val patchableEnvActionEntity = PatchableEnvActionEntity(null, null)
val envActionFromDatabase = anEnvAction(objectMapper, id, ZonedDateTime.now(), ZonedDateTime.now().plusDays(2))
val envActionPatched = anEnvAction(objectMapper, envActionFromDatabase.id, today, tomorrow)

given(envActionRepository.findById(id)).willReturn(envActionFromDatabase)
given(patchData.execute(envActionFromDatabase, patchableEntity, EnvActionEntity::class)).willReturn(
given(mergeEnvActionEntity.execute(envActionFromDatabase, patchableEnvActionEntity)).willReturn(
envActionPatched,
)
given(envActionRepository.save(envActionPatched)).willReturn(envActionPatched)

// When
val savedEnvAction = patchEnvAction.execute(id, patchableEntity)
val savedEnvAction = patchEnvAction.execute(id, patchableEnvActionEntity)

// Then
assertThat(savedEnvAction.actionStartDateTimeUtc).isEqualTo(envActionPatched.actionStartDateTimeUtc)
Expand All @@ -53,13 +52,13 @@ class PatchEnvActionUTest {
fun `execute() should throw BackendUsageException with message when the entity does not exist`() {
// Given
val id = UUID.randomUUID()
val aPatchableEntity = aPatchableEntity(objectMapper)
val patchableEnvActionEntity = PatchableEnvActionEntity(null, null)

given(envActionRepository.findById(id)).willReturn(null)

// When & Then
val exception =
assertThrows<BackendUsageException> { patchEnvAction.execute(id, aPatchableEntity) }
assertThrows<BackendUsageException> { patchEnvAction.execute(id, patchableEnvActionEntity) }

assertThat(exception.message).isEqualTo("envAction $id not found")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.actions.fixtures

import com.fasterxml.jackson.databind.ObjectMapper
import fr.gouv.cacem.monitorenv.domain.entities.PatchableEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.ActionCompletionEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.ActionTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
Expand Down Expand Up @@ -40,13 +39,5 @@ class EnvActionFixture {
value = "{}",
)
}

fun aPatchableEntity(objectMapper: ObjectMapper): PatchableEntity {
val partialEnvActionAsJson = """
{}
""".trimIndent()
val jsonNode = objectMapper.readTree(partialEnvActionAsJson)
return PatchableEntity(jsonNode)
}
}
}
Loading

0 comments on commit 773e5d4

Please sign in to comment.