diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActions.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActions.kt new file mode 100644 index 0000000000..0a7c01c486 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActions.kt @@ -0,0 +1,88 @@ +package fr.gouv.cacem.monitorenv.domain.use_cases.missions + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.ActionTypeEnum +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionNoteEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionSurveillanceEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IDepartmentAreaRepository +import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository +import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository + +@UseCase +class CreateOrUpdateEnvActions( + private val departmentRepository: IDepartmentAreaRepository, + private val facadeRepository: IFacadeAreasRepository, + private val missionRepository: IMissionRepository, +) { + @Throws(IllegalArgumentException::class) + fun execute( + mission: MissionEntity, + envActions: List?, + ): MissionEntity { + val envActionsToSave = + envActions?.map { + when (it.actionType) { + ActionTypeEnum.CONTROL -> { + (it as EnvActionControlEntity).copy( + facade = + (it.geom ?: mission.geom)?.let { geom -> + facadeRepository.findFacadeFromGeometry(geom) + }, + department = + (it.geom ?: mission.geom)?.let { geom -> + departmentRepository.findDepartmentFromGeometry( + geom, + ) + }, + ) + } + ActionTypeEnum.SURVEILLANCE -> { + val surveillance = it as EnvActionSurveillanceEntity + /* + When coverMissionZone is true, use mission geometry in priority, fall back to action geometry. + When coverMissionZone is not true, prioritize the other way around. + Ideally the fallbacks should not be needed, but if coverMissionZone is true and the mission geom + is null, or if coverMissionZone is false and the action geom is null, then rather that nothing, + better use the geometry that is available, if any. + */ + val geometry = + if (surveillance.coverMissionZone == true) { + (mission.geom ?: surveillance.geom) + } else { + (surveillance.geom ?: mission.geom) + } + surveillance.copy( + facade = + geometry?.let { geom -> + facadeRepository.findFacadeFromGeometry(geom) + }, + department = + geometry?.let { geom -> + departmentRepository.findDepartmentFromGeometry( + geom, + ) + }, + ) + } + ActionTypeEnum.NOTE -> { + (it as EnvActionNoteEntity).copy() + } + } + } + + val missionToSave = + mission.copy( + envActions = envActionsToSave, + ) + val savedMission = missionRepository.save(missionToSave) + + if (savedMission.mission.id == null) { + throw IllegalArgumentException("Mission id is null") + } + + return savedMission.mission + } +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMission.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMission.kt index 16cde2bbd7..09dcd4d085 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMission.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMission.kt @@ -4,11 +4,6 @@ package fr.gouv.cacem.monitorenv.domain.use_cases.missions import fr.gouv.cacem.monitorenv.config.UseCase import fr.gouv.cacem.monitorenv.domain.entities.mission.* -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.ActionTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionNoteEntity -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionSurveillanceEntity -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity -import fr.gouv.cacem.monitorenv.domain.repositories.IDepartmentAreaRepository import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository import fr.gouv.cacem.monitorenv.domain.use_cases.missions.events.UpdateMissionEvent @@ -17,7 +12,6 @@ import org.springframework.context.ApplicationEventPublisher @UseCase class CreateOrUpdateMission( - private val departmentRepository: IDepartmentAreaRepository, private val facadeRepository: IFacadeAreasRepository, private val missionRepository: IMissionRepository, private val eventPublisher: ApplicationEventPublisher, @@ -30,67 +24,13 @@ class CreateOrUpdateMission( ): MissionEntity { require(mission != null) { "No mission to create or update" } - val envActions = - mission.envActions?.map { - when (it.actionType) { - ActionTypeEnum.CONTROL -> { - (it as EnvActionControlEntity).copy( - facade = - (it.geom ?: mission.geom)?.let { geom -> - facadeRepository.findFacadeFromGeometry(geom) - }, - department = - (it.geom ?: mission.geom)?.let { geom -> - departmentRepository.findDepartmentFromGeometry( - geom, - ) - }, - ) - } - ActionTypeEnum.SURVEILLANCE -> { - val surveillance = it as EnvActionSurveillanceEntity - /* - When coverMissionZone is true, use mission geometry in priority, fall back to action geometry. - When coverMissionZone is not true, prioritize the other way around. - Ideally the fallbacks should not be needed, but if coverMissionZone is true and the mission geom - is null, or if coverMissionZone is false and the action geom is null, then rather that nothing, - better use the geometry that is available, if any. - */ - val geometry = - if (surveillance.coverMissionZone == true) { - (mission.geom ?: surveillance.geom) - } else { - (surveillance.geom ?: mission.geom) - } - surveillance.copy( - facade = - geometry?.let { geom -> - facadeRepository.findFacadeFromGeometry(geom) - }, - department = - geometry?.let { geom -> - departmentRepository.findDepartmentFromGeometry( - geom, - ) - }, - ) - } - ActionTypeEnum.NOTE -> { - (it as EnvActionNoteEntity).copy() - } - } - } - - var facade: String? = null - - if (mission.geom != null) { - facade = facadeRepository.findFacadeFromGeometry(mission.geom) - } + val facade = if (mission.geom != null) { facadeRepository.findFacadeFromGeometry(mission.geom) } else { null } + val storedMission = if (mission.id != null) { missionRepository.findById(mission.id) } else { null } val missionToSave = mission.copy( facade = facade, - envActions = envActions, + envActions = storedMission?.envActions, ) val savedMission = missionRepository.save(missionToSave) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReporting.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReporting.kt similarity index 89% rename from backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReporting.kt rename to backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReporting.kt index aa6f3707e2..f73f4af83f 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReporting.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReporting.kt @@ -13,13 +13,14 @@ import org.slf4j.LoggerFactory import java.util.UUID @UseCase -class CreateOrUpdateMissionWithAttachedReporting( +class CreateOrUpdateMissionWithActionsAndAttachedReporting( private val createOrUpdateMission: CreateOrUpdateMission, + private val createOrUpdateEnvActions: CreateOrUpdateEnvActions, private val missionRepository: IMissionRepository, private val reportingRepository: IReportingRepository, ) { private val logger = - LoggerFactory.getLogger(CreateOrUpdateMissionWithAttachedReporting::class.java) + LoggerFactory.getLogger(CreateOrUpdateMissionWithActionsAndAttachedReporting::class.java) @Throws(IllegalArgumentException::class) fun execute( @@ -40,6 +41,11 @@ class CreateOrUpdateMissionWithAttachedReporting( val savedMission = createOrUpdateMission.execute(mission) require(savedMission.id != null) { "The mission id is null" } + createOrUpdateEnvActions.execute( + savedMission, + mission.envActions, + ) + attachedReportingIds.forEach { val reporting = reportingRepository.findById(it) if (reporting.reporting.missionId != null && diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/CreateOrUpdateMissionDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/CreateOrUpdateMissionDataInput.kt index 7317ecf6fe..45da1c31de 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/CreateOrUpdateMissionDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/CreateOrUpdateMissionDataInput.kt @@ -4,7 +4,6 @@ import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEnt import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity import org.locationtech.jts.geom.MultiPolygon import java.time.ZonedDateTime @@ -22,7 +21,6 @@ data class CreateOrUpdateMissionDataInput( val endDateTimeUtc: ZonedDateTime? = null, val missionSource: MissionSourceEnum, val isClosed: Boolean, - val envActions: List? = null, val hasMissionOrder: Boolean, val isUnderJdp: Boolean, val isGeometryComputedFromControls: Boolean, @@ -43,7 +41,6 @@ data class CreateOrUpdateMissionDataInput( isClosed = this.isClosed, isDeleted = false, missionSource = this.missionSource, - envActions = this.envActions, hasMissionOrder = this.hasMissionOrder, isUnderJdp = this.isUnderJdp, isGeometryComputedFromControls = this.isGeometryComputedFromControls, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Missions.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Missions.kt index 6bacb13270..3958111c03 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Missions.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/Missions.kt @@ -18,8 +18,8 @@ import java.time.ZonedDateTime @RequestMapping("/bff/v1/missions") @Tag(description = "API Missions", name = "BFF.Missions") class Missions( - private val createOrUpdateMissionWithAttachedReporting: - CreateOrUpdateMissionWithAttachedReporting, + private val createOrUpdateMissionWithActionsAndAttachedReporting: + CreateOrUpdateMissionWithActionsAndAttachedReporting, private val getFullMissions: GetFullMissions, private val getFullMissionById: GetFullMissionById, private val deleteMission: DeleteMission, @@ -32,7 +32,7 @@ class Missions( createMissionDataInput: CreateOrUpdateMissionDataInput, ): MissionDataOutput { val createdMission = - createOrUpdateMissionWithAttachedReporting.execute( + createOrUpdateMissionWithActionsAndAttachedReporting.execute( mission = createMissionDataInput.toMissionEntity(), attachedReportingIds = createMissionDataInput.attachedReportingIds, envActionsAttachedToReportingIds = @@ -128,7 +128,7 @@ class Missions( if ((updateMissionDataInput.id != null) && (missionId != updateMissionDataInput.id)) { throw java.lang.IllegalArgumentException("missionId doesn't match with request param") } - return createOrUpdateMissionWithAttachedReporting.execute( + return createOrUpdateMissionWithActionsAndAttachedReporting.execute( mission = updateMissionDataInput.toMissionEntity(), attachedReportingIds = updateMissionDataInput.attachedReportingIds, envActionsAttachedToReportingIds = diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActionsUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActionsUTests.kt new file mode 100644 index 0000000000..4c7bbdacec --- /dev/null +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateEnvActionsUTests.kt @@ -0,0 +1,187 @@ +@file:Suppress("ktlint:standard:package-name") + +package fr.gouv.cacem.monitorenv.domain.use_cases.missions + +import com.nhaarman.mockitokotlin2.* +import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum +import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionNoteEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionSurveillanceEntity +import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IDepartmentAreaRepository +import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository +import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.locationtech.jts.geom.MultiPoint +import org.locationtech.jts.geom.MultiPolygon +import org.locationtech.jts.io.WKTReader +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.context.junit.jupiter.SpringExtension +import java.time.ZonedDateTime +import java.util.* + +@ExtendWith(SpringExtension::class) +class CreateOrUpdateEnvActionsUTests { + @MockBean private lateinit var departmentRepository: IDepartmentAreaRepository + + @MockBean private lateinit var missionRepository: IMissionRepository + + @MockBean private lateinit var facadeAreasRepository: IFacadeAreasRepository + + @Test + fun `should return the mission to update with computed facade and department info for envActions`() { + // Given + val wktReader = WKTReader() + + val multipolygonString = + "MULTIPOLYGON(((-2.7335 47.6078, -2.7335 47.8452, -3.6297 47.8452, -3.6297 47.6078, -2.7335 47.6078)))" + val polygon = wktReader.read(multipolygonString) as MultiPolygon + + val multipointString = "MULTIPOINT((49.354105 -0.427455))" + val point = wktReader.read(multipointString) as MultiPoint + + val envActions = + listOf( + EnvActionControlEntity( + id = + UUID.fromString( + "33310163-4e22-4d3d-b585-dac4431eb4b5", + ), + geom = point, + ), + EnvActionSurveillanceEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", + ), + geom = polygon, + ), + EnvActionNoteEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", + ), + observations = + "Quelqu'un aurait vu quelque chose quelque part à un certain moment.", + ), + ) + + val updatedEnvActions = listOf( + EnvActionControlEntity( + id = + UUID.fromString( + "33310163-4e22-4d3d-b585-dac4431eb4b5", + ), + geom = point, + facade = "La Face Ade", + department = "Quequ'part", + ), + EnvActionSurveillanceEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", + ), + geom = polygon, + facade = "La Face Ade", + department = "Quequ'part", + ), + EnvActionNoteEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", + ), + observations = + "Quelqu'un aurait vu quelque chose quelque part à un certain moment.", + ), + ) + + val missionToUpdate = + MissionEntity( + id = 100, + endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), + envActions = envActions, + facade = "Outre-Mer", + geom = polygon, + hasMissionOrder = false, + isClosed = false, + isDeleted = false, + isGeometryComputedFromControls = false, + isUnderJdp = false, + missionSource = MissionSourceEnum.MONITORENV, + missionTypes = listOf(MissionTypeEnum.LAND), + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + ) + + val expectedUpdatedMission = + MissionEntity( + id = 100, + endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), + envActions = updatedEnvActions, + facade = "Outre-Mer", + geom = polygon, + hasMissionOrder = false, + isClosed = false, + isDeleted = false, + isGeometryComputedFromControls = false, + isUnderJdp = false, + missionSource = MissionSourceEnum.MONITORENV, + missionTypes = listOf(MissionTypeEnum.LAND), + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + ) + + given(facadeAreasRepository.findFacadeFromGeometry(anyOrNull())).willReturn("La Face Ade") + given(departmentRepository.findDepartmentFromGeometry(anyOrNull())).willReturn("Quequ'part") + given(missionRepository.save(anyOrNull())) + .willReturn(MissionDTO(mission = expectedUpdatedMission)) + + // When + val createdMission = + CreateOrUpdateEnvActions( + departmentRepository = departmentRepository, + missionRepository = missionRepository, + facadeRepository = facadeAreasRepository, + ) + .execute( + mission = missionToUpdate, + envActions = envActions, + ) + + // Then + verify(facadeAreasRepository, times(1)).findFacadeFromGeometry(argThat { this == polygon }) + verify(facadeAreasRepository, times(1)).findFacadeFromGeometry(argThat { this == point }) + verify(departmentRepository, times(1)).findDepartmentFromGeometry(argThat { this == polygon }) + verify(departmentRepository, times(1)).findDepartmentFromGeometry(argThat { this == point }) + + verify(missionRepository, times(1)) + .save( + argThat { + this == + missionToUpdate.copy( + envActions = + missionToUpdate.envActions?.map { + when (it) { + is EnvActionControlEntity -> + it.copy( + facade = "La Face Ade", + department = + "Quequ'part", + ) + is EnvActionSurveillanceEntity -> + it.copy( + facade = "La Face Ade", + department = + "Quequ'part", + ) + else -> it + } + }, + ) + }, + ) + assertThat(createdMission).isEqualTo(expectedUpdatedMission) + } +} diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionUTests.kt index 45dce525f0..7759ac87e5 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionUTests.kt @@ -1,6 +1,6 @@ @file:Suppress("ktlint:standard:package-name") -package fr.gouv.cacem.monitorenv.domain.use_cases +package fr.gouv.cacem.monitorenv.domain.use_cases.missions import com.nhaarman.mockitokotlin2.* import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity @@ -9,10 +9,8 @@ import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionNoteEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionSurveillanceEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity -import fr.gouv.cacem.monitorenv.domain.repositories.IDepartmentAreaRepository import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.CreateOrUpdateMission import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import org.assertj.core.api.Assertions import org.assertj.core.api.Assertions.assertThat @@ -29,8 +27,6 @@ import java.util.* @ExtendWith(SpringExtension::class) class CreateOrUpdateMissionUTests { - @MockBean private lateinit var departmentRepository: IDepartmentAreaRepository - @MockBean private lateinit var missionRepository: IMissionRepository @MockBean private lateinit var facadeAreasRepository: IFacadeAreasRepository @@ -43,7 +39,6 @@ class CreateOrUpdateMissionUTests { val throwable = Assertions.catchThrowable { CreateOrUpdateMission( - departmentRepository = departmentRepository, missionRepository = missionRepository, facadeRepository = facadeAreasRepository, eventPublisher = applicationEventPublisher, @@ -57,146 +52,103 @@ class CreateOrUpdateMissionUTests { } @Test - fun `should return the mission to create or update with computed facade and department info`() { + fun `should return the mission to update with computed facade`() { // Given val wktReader = WKTReader() val multipolygonString = "MULTIPOLYGON(((-2.7335 47.6078, -2.7335 47.8452, -3.6297 47.8452, -3.6297 47.6078, -2.7335 47.6078)))" val polygon = wktReader.read(multipolygonString) as MultiPolygon - val multipointString = "MULTIPOINT((49.354105 -0.427455))" val point = wktReader.read(multipointString) as MultiPoint - val missionToCreate = + val missionToUpdate = MissionEntity( + id = 100, missionTypes = listOf(MissionTypeEnum.LAND), facade = "Outre-Mer", geom = polygon, startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), isClosed = false, - isDeleted = false, missionSource = MissionSourceEnum.MONITORENV, hasMissionOrder = false, + isDeleted = false, isUnderJdp = false, - envActions = - listOf( - EnvActionControlEntity( - id = - UUID.fromString( - "33310163-4e22-4d3d-b585-dac4431eb4b5", - ), - geom = point, + isGeometryComputedFromControls = false, + ) + + val existingEnvActions = + listOf( + EnvActionControlEntity( + id = + UUID.fromString( + "33310163-4e22-4d3d-b585-dac4431eb4b5", ), - EnvActionSurveillanceEntity( - id = - UUID.fromString( - "a6c4bd17-eb45-4504-ab15-7a18ea714a10", - ), - geom = polygon, + geom = point, + facade = "La Face Ade", + department = "Quequ'part", + ), + EnvActionSurveillanceEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", ), - EnvActionNoteEntity( - id = - UUID.fromString( - "a6c4bd17-eb45-4504-ab15-7a18ea714a10", - ), - observations = - "Quelqu'un aurait vu quelque chose quelque part à un certain moment.", + geom = polygon, + facade = "La Face Ade", + department = "Quequ'part", + ), + EnvActionNoteEntity( + id = + UUID.fromString( + "a6c4bd17-eb45-4504-ab15-7a18ea714a10", ), + observations = + "Quelqu'un aurait vu quelque chose quelque part à un certain moment.", ), - isGeometryComputedFromControls = false, ) val expectedCreatedMission = MissionEntity( id = 100, - missionTypes = listOf(MissionTypeEnum.LAND), - facade = "Outre-Mer", - startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), + facade = "La Face Ade", + hasMissionOrder = false, isClosed = false, isDeleted = false, - missionSource = MissionSourceEnum.MONITORENV, - hasMissionOrder = false, - isUnderJdp = false, isGeometryComputedFromControls = false, - envActions = - listOf( - EnvActionControlEntity( - id = - UUID.fromString( - "33310163-4e22-4d3d-b585-dac4431eb4b5", - ), - geom = point, - facade = "La Face Ade", - department = "Quequ'part", - ), - EnvActionSurveillanceEntity( - id = - UUID.fromString( - "a6c4bd17-eb45-4504-ab15-7a18ea714a10", - ), - geom = polygon, - facade = "La Face Ade", - department = "Quequ'part", - ), - EnvActionNoteEntity( - id = - UUID.fromString( - "a6c4bd17-eb45-4504-ab15-7a18ea714a10", - ), - observations = - "Quelqu'un aurait vu quelque chose quelque part à un certain moment.", - ), - ), + isUnderJdp = false, + missionSource = MissionSourceEnum.MONITORENV, + missionTypes = listOf(MissionTypeEnum.LAND), + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), ) given(facadeAreasRepository.findFacadeFromGeometry(anyOrNull())).willReturn("La Face Ade") - given(departmentRepository.findDepartmentFromGeometry(anyOrNull())).willReturn("Quequ'part") + given(missionRepository.findById(100)).willReturn(missionToUpdate.copy(envActions = existingEnvActions)) given(missionRepository.save(anyOrNull())) .willReturn(MissionDTO(mission = expectedCreatedMission)) // When val createdMission = CreateOrUpdateMission( - departmentRepository = departmentRepository, missionRepository = missionRepository, facadeRepository = facadeAreasRepository, eventPublisher = applicationEventPublisher, ) .execute( - missionToCreate, + missionToUpdate, ) // Then - verify(facadeAreasRepository, times(2)).findFacadeFromGeometry(argThat { this == polygon }) - verify(facadeAreasRepository, times(1)).findFacadeFromGeometry(argThat { this == point }) + verify(facadeAreasRepository, times(1)).findFacadeFromGeometry(argThat { this == polygon }) verify(missionRepository, times(1)) .save( argThat { this == - missionToCreate.copy( + missionToUpdate.copy( facade = "La Face Ade", - envActions = - missionToCreate.envActions?.map { - when (it) { - is EnvActionControlEntity -> - it.copy( - facade = "La Face Ade", - department = - "Quequ'part", - ) - is EnvActionSurveillanceEntity -> - it.copy( - facade = "La Face Ade", - department = - "Quequ'part", - ) - else -> it - } - }, + envActions = existingEnvActions, ) }, ) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReportingUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReportingUTests.kt similarity index 94% rename from backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReportingUTests.kt rename to backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReportingUTests.kt index 6e67a54bd1..ee040bf98b 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithAttachedReportingUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/CreateOrUpdateMissionWithActionsAndAttachedReportingUTests.kt @@ -1,6 +1,6 @@ @file:Suppress("ktlint:standard:package-name") -package fr.gouv.cacem.monitorenv.domain.use_cases +package fr.gouv.cacem.monitorenv.domain.use_cases.missions import com.nhaarman.mockitokotlin2.anyOrNull import com.nhaarman.mockitokotlin2.given @@ -10,8 +10,6 @@ import fr.gouv.cacem.monitorenv.domain.entities.mission.* import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository import fr.gouv.cacem.monitorenv.domain.repositories.IReportingRepository -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.CreateOrUpdateMission -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.CreateOrUpdateMissionWithAttachedReporting import fr.gouv.cacem.monitorenv.domain.use_cases.missions.TestUtils.getReportingDTO import fr.gouv.cacem.monitorenv.domain.use_cases.missions.TestUtils.getReportingDTOWithAttachedMission import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO @@ -28,10 +26,12 @@ import java.time.ZonedDateTime import java.util.* @ExtendWith(SpringExtension::class) -class CreateOrUpdateMissionWithAttachedReportingUTests { +class CreateOrUpdateMissionWithActionsAndAttachedReportingUTests { @MockBean private lateinit var createOrUpdateMission: CreateOrUpdateMission + @MockBean private lateinit var createOrUpdateEnvActions: CreateOrUpdateEnvActions + @MockBean private lateinit var missionRepository: IMissionRepository @MockBean private lateinit var reportingRepository: IReportingRepository @@ -91,8 +91,9 @@ class CreateOrUpdateMissionWithAttachedReportingUTests { given(reportingRepository.findById(3)).willReturn(getReportingDTO(3)) // When val createdMissionDTO = - CreateOrUpdateMissionWithAttachedReporting( + CreateOrUpdateMissionWithActionsAndAttachedReporting( createOrUpdateMission = createOrUpdateMission, + createOrUpdateEnvActions = createOrUpdateEnvActions, missionRepository = missionRepository, reportingRepository = reportingRepository, ) @@ -136,8 +137,9 @@ class CreateOrUpdateMissionWithAttachedReportingUTests { // Then assertThatThrownBy { - CreateOrUpdateMissionWithAttachedReporting( + CreateOrUpdateMissionWithActionsAndAttachedReporting( createOrUpdateMission = createOrUpdateMission, + createOrUpdateEnvActions = createOrUpdateEnvActions, missionRepository = missionRepository, reportingRepository = reportingRepository, ) @@ -214,8 +216,9 @@ class CreateOrUpdateMissionWithAttachedReportingUTests { // When val createdMissionDTO = - CreateOrUpdateMissionWithAttachedReporting( + CreateOrUpdateMissionWithActionsAndAttachedReporting( createOrUpdateMission = createOrUpdateMission, + createOrUpdateEnvActions = createOrUpdateEnvActions, missionRepository = missionRepository, reportingRepository = reportingRepository, ) diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsITests.kt index 29fd60dd29..0edad4a095 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsITests.kt @@ -55,8 +55,8 @@ class MissionsITests { @Autowired private lateinit var mockMvc: MockMvc @MockBean - private lateinit var createOrUpdateMissionWithAttachedReporting: - CreateOrUpdateMissionWithAttachedReporting + private lateinit var createOrUpdateMissionWithActionsAndAttachedReporting: + CreateOrUpdateMissionWithActionsAndAttachedReporting @MockBean private lateinit var getFullMissions: GetFullMissions @@ -118,7 +118,7 @@ class MissionsITests { ) val requestbody = objectMapper.writeValueAsString(newMissionRequest) given( - createOrUpdateMissionWithAttachedReporting.execute( + createOrUpdateMissionWithActionsAndAttachedReporting.execute( mission = newMissionRequest.toMissionEntity(), attachedReportingIds = listOf(), envActionsAttachedToReportingIds = listOf(), @@ -833,7 +833,7 @@ class MissionsITests { ) as List given( - createOrUpdateMissionWithAttachedReporting.execute( + createOrUpdateMissionWithActionsAndAttachedReporting.execute( mission = requestBody.toMissionEntity(), attachedReportingIds = listOf(1), envActionsAttachedToReportingIds = envActionsAttachedToReportingIds, diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsITests.kt index f8eb056256..1968c6adce 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsITests.kt @@ -4,13 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.nhaarman.mockitokotlin2.any import fr.gouv.cacem.monitorenv.config.MapperConfiguration import fr.gouv.cacem.monitorenv.config.WebSecurityConfig -import fr.gouv.cacem.monitorenv.domain.entities.VehicleTypeEnum import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.ActionTargetTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity import fr.gouv.cacem.monitorenv.domain.use_cases.missions.* import fr.gouv.cacem.monitorenv.domain.use_cases.missions.events.UpdateMissionEvent import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.CreateOrUpdateMissionDataInput @@ -248,13 +245,7 @@ class ApiMissionsITests { isUnderJdp = true, isGeometryComputedFromControls = false, ) - val envAction = - EnvActionControlEntity( - id = UUID.fromString("bf9f4062-83d3-4a85-b89b-76c0ded6473d"), - actionTargetType = ActionTargetTypeEnum.VEHICLE, - vehicleType = VehicleTypeEnum.VESSEL, - actionNumberOfControls = 4, - ) + val requestBody = CreateOrUpdateMissionDataInput( id = 14, @@ -263,7 +254,6 @@ class ApiMissionsITests { observationsCnsp = "updated observations", startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), missionSource = MissionSourceEnum.MONITORFISH, - envActions = listOf(envAction), isClosed = false, hasMissionOrder = true, isUnderJdp = true,