diff --git a/backend/.gradle/8.4/checksums/checksums.lock b/backend/.gradle/8.4/checksums/checksums.lock new file mode 100644 index 000000000..69b31ed21 Binary files /dev/null and b/backend/.gradle/8.4/checksums/checksums.lock differ diff --git a/backend/.gradle/8.4/checksums/md5-checksums.bin b/backend/.gradle/8.4/checksums/md5-checksums.bin new file mode 100644 index 000000000..152eb513a Binary files /dev/null and b/backend/.gradle/8.4/checksums/md5-checksums.bin differ diff --git a/backend/.gradle/8.4/checksums/sha1-checksums.bin b/backend/.gradle/8.4/checksums/sha1-checksums.bin new file mode 100644 index 000000000..3f6997e0b Binary files /dev/null and b/backend/.gradle/8.4/checksums/sha1-checksums.bin differ diff --git a/backend/.gradle/8.4/checksums/sha256-checksums.bin b/backend/.gradle/8.4/checksums/sha256-checksums.bin new file mode 100644 index 000000000..620b1a9cf Binary files /dev/null and b/backend/.gradle/8.4/checksums/sha256-checksums.bin differ diff --git a/backend/.gradle/8.4/checksums/sha512-checksums.bin b/backend/.gradle/8.4/checksums/sha512-checksums.bin new file mode 100644 index 000000000..022cdacc6 Binary files /dev/null and b/backend/.gradle/8.4/checksums/sha512-checksums.bin differ diff --git a/backend/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock b/backend/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 000000000..0c8b503b3 Binary files /dev/null and b/backend/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock differ diff --git a/backend/.gradle/8.4/dependencies-accessors/gc.properties b/backend/.gradle/8.4/dependencies-accessors/gc.properties new file mode 100644 index 000000000..e69de29bb diff --git a/backend/.gradle/8.4/executionHistory/executionHistory.bin b/backend/.gradle/8.4/executionHistory/executionHistory.bin new file mode 100644 index 000000000..7a080b405 Binary files /dev/null and b/backend/.gradle/8.4/executionHistory/executionHistory.bin differ diff --git a/backend/.gradle/8.4/executionHistory/executionHistory.lock b/backend/.gradle/8.4/executionHistory/executionHistory.lock new file mode 100644 index 000000000..ceaf92a02 Binary files /dev/null and b/backend/.gradle/8.4/executionHistory/executionHistory.lock differ diff --git a/backend/.gradle/8.4/fileChanges/last-build.bin b/backend/.gradle/8.4/fileChanges/last-build.bin new file mode 100644 index 000000000..f76dd238a Binary files /dev/null and b/backend/.gradle/8.4/fileChanges/last-build.bin differ diff --git a/backend/.gradle/8.4/fileHashes/fileHashes.bin b/backend/.gradle/8.4/fileHashes/fileHashes.bin new file mode 100644 index 000000000..29ad4470a Binary files /dev/null and b/backend/.gradle/8.4/fileHashes/fileHashes.bin differ diff --git a/backend/.gradle/8.4/fileHashes/fileHashes.lock b/backend/.gradle/8.4/fileHashes/fileHashes.lock new file mode 100644 index 000000000..f18b4f041 Binary files /dev/null and b/backend/.gradle/8.4/fileHashes/fileHashes.lock differ diff --git a/backend/.gradle/8.4/fileHashes/resourceHashesCache.bin b/backend/.gradle/8.4/fileHashes/resourceHashesCache.bin new file mode 100644 index 000000000..72762b84a Binary files /dev/null and b/backend/.gradle/8.4/fileHashes/resourceHashesCache.bin differ diff --git a/backend/.gradle/8.4/gc.properties b/backend/.gradle/8.4/gc.properties new file mode 100644 index 000000000..e69de29bb diff --git a/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 000000000..2fb65590a Binary files /dev/null and b/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/backend/.gradle/buildOutputCleanup/cache.properties b/backend/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 000000000..d389034e1 --- /dev/null +++ b/backend/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Wed Oct 18 10:21:17 CEST 2023 +gradle.version=8.4 diff --git a/backend/.gradle/buildOutputCleanup/outputFiles.bin b/backend/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 000000000..f17ddd5d6 Binary files /dev/null and b/backend/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/backend/.gradle/file-system.probe b/backend/.gradle/file-system.probe new file mode 100644 index 000000000..0e9f8f193 Binary files /dev/null and b/backend/.gradle/file-system.probe differ diff --git a/backend/.gradle/vcs-1/gc.properties b/backend/.gradle/vcs-1/gc.properties new file mode 100644 index 000000000..e69de29bb diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IMissionRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IMissionRepository.kt index bda4ecede..c93c50e19 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IMissionRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IMissionRepository.kt @@ -3,27 +3,30 @@ package fr.gouv.cacem.monitorenv.domain.repositories import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO -import org.springframework.data.domain.Pageable import java.time.Instant +import org.springframework.data.domain.Pageable interface IMissionRepository { - fun count(): Long - - fun delete(missionId: Int) - - fun findAll( - startedAfter: Instant, - startedBefore: Instant?, - missionTypes: List?, - missionStatuses: List?, - missionSources: List? = null, - seaFronts: List?, - pageable: Pageable, + fun findFullMissionById(missionId: Int): MissionDTO + fun findById(missionId: Int): MissionEntity + fun findAllFullMissions( + startedAfter: Instant, + startedBefore: Instant?, + missionTypes: List?, + missionStatuses: List?, + missionSources: List? = null, + seaFronts: List?, + pageable: Pageable, ): List - fun findByControlUnitId(controlUnitId: Int): List - - fun findById(missionId: Int): MissionDTO - + fun findAll( + startedAfter: Instant, + startedBefore: Instant?, + missionTypes: List?, + missionStatuses: List?, + missionSources: List? = null, + seaFronts: List?, + pageable: Pageable, + ): List fun save(mission: MissionEntity): MissionDTO } 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 9c252b14f..540254d6b 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 @@ -11,7 +11,6 @@ import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionContr 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 @UseCase class CreateOrUpdateMission( @@ -22,8 +21,7 @@ class CreateOrUpdateMission( @Throws(IllegalArgumentException::class) fun execute( mission: MissionEntity?, - attachedReportingIds: List? = null, - ): MissionDTO { + ): MissionEntity { require(mission != null) { "No mission to create or update" } 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/CreateOrUpdateMissionWithAttachedReporting.kt index 6b8ccfc62..400352a02 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/CreateOrUpdateMissionWithAttachedReporting.kt @@ -4,12 +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.repositories.IReportingRepository import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO @@ -17,8 +11,7 @@ import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.inputs.missions. @UseCase class CreateOrUpdateMissionWithAttachedReporting( - private val departmentRepository: IDepartmentAreaRepository, - private val facadeRepository: IFacadeAreasRepository, + private val createOrUpdateMission: CreateOrUpdateMission, private val missionRepository: IMissionRepository, private val reportingRepository: IReportingRepository, @@ -26,83 +19,21 @@ class CreateOrUpdateMissionWithAttachedReporting( @Throws(IllegalArgumentException::class) fun execute( mission: MissionEntity?, - attachedReportingIds: List? = null, + attachedReportingIds: List, envActionsAttachedToReportingIds: List, ): MissionDTO { - require(mission != null) { - "No mission to create or update" + val savedMission = createOrUpdateMission.execute(mission) + require(savedMission.id != null) { + "The mission id is null" } - 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) }, - ) - } + reportingRepository.attachReportingsToMission(attachedReportingIds, savedMission.id) - ActionTypeEnum.NOTE -> { - (it as EnvActionNoteEntity).copy() - } - } + envActionsAttachedToReportingIds.forEach { + reportingRepository.attachEnvActionsToReportings(it.first, it.second) } - var facade: String? = null - - if (mission.geom != null) { - facade = facadeRepository.findFacadeFromGeometry(mission.geom) - } - - val missionToSave = mission.copy( - facade = facade, - envActions = envActions, - ) - val savedMission = missionRepository.save(missionToSave) - - if (savedMission.mission.id == null) { - throw IllegalArgumentException("Mission id is null") - } - - if (attachedReportingIds != null) { - reportingRepository.attachReportingsToMission(attachedReportingIds, savedMission.mission.id) - } - - if (envActionsAttachedToReportingIds != null) { - envActionsAttachedToReportingIds.forEach { - reportingRepository.attachEnvActionsToReportings(it.first, it.second) - } - } - - return missionRepository.findById(savedMission.mission.id) + return missionRepository.findFullMissionById(savedMission.id) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnits.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnits.kt index c4a1f4c69..d6410d06a 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnits.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnits.kt @@ -8,11 +8,11 @@ import org.slf4j.LoggerFactory import java.time.ZonedDateTime @UseCase -class GetEngagedControlUnits(private val getMissions: GetMissions) { +class GetEngagedControlUnits(private val getFullMissions: GetFullMissions) { private val logger = LoggerFactory.getLogger(GetEngagedControlUnits::class.java) fun execute(): List { - val openedMissions = getMissions.execute( + val openedMissions = getFullMissions.execute( startedAfterDateTime = ZonedDateTime.now().minusMonths(2), startedBeforeDateTime = null, missionSources = null, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissionById.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissionById.kt new file mode 100644 index 000000000..65c0ad51a --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissionById.kt @@ -0,0 +1,14 @@ +@file:Suppress("ktlint:standard:package-name") + +package fr.gouv.cacem.monitorenv.domain.use_cases.missions + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO + +@UseCase +class GetFullMissionById(private val missionRepository: IMissionRepository) { + fun execute(missionId: Int): MissionDTO { + return missionRepository.findFullMissionById(missionId) + } +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissions.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissions.kt new file mode 100644 index 000000000..6091adec3 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetFullMissions.kt @@ -0,0 +1,49 @@ +@file:Suppress("ktlint:standard:package-name") + +package fr.gouv.cacem.monitorenv.domain.use_cases.missions + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum +import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO +import org.slf4j.LoggerFactory +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Pageable +import java.time.ZonedDateTime + +@UseCase +class GetFullMissions(private val missionRepository: IMissionRepository) { + private val logger = LoggerFactory.getLogger(GetFullMissions::class.java) + + fun execute( + startedAfterDateTime: ZonedDateTime?, + startedBeforeDateTime: ZonedDateTime?, + missionSources: List?, + missionTypes: List?, + missionStatuses: List?, + pageNumber: Int?, + pageSize: Int?, + seaFronts: List?, + ): List { + val missions = missionRepository.findAllFullMissions( + startedAfter = startedAfterDateTime?.toInstant() ?: ZonedDateTime.now().minusDays(30).toInstant(), + startedBefore = startedBeforeDateTime?.toInstant(), + missionSources = missionSources ?: listOf(MissionSourceEnum.MONITORENV, MissionSourceEnum.MONITORFISH), + missionTypes = missionTypes, + missionStatuses = missionStatuses, + seaFronts = seaFronts, + pageable = if (pageNumber != null && pageSize != null) { + PageRequest.of( + pageNumber, + pageSize, + ) + } else { + Pageable.unpaged() + }, + ) + + logger.info("Found ${missions.size} mission(s)") + + return missions + } +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissionById.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissionById.kt index 24266e58a..1dcda3563 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissionById.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissionById.kt @@ -3,12 +3,12 @@ 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.repositories.IMissionRepository -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO @UseCase class GetMissionById(private val missionRepository: IMissionRepository) { - fun execute(missionId: Int): MissionDTO { + fun execute(missionId: Int): MissionEntity { return missionRepository.findById(missionId) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissions.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissions.kt index 629a5d841..4e0982c01 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissions.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetMissions.kt @@ -3,9 +3,9 @@ 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.MissionSourceEnum import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import org.slf4j.LoggerFactory import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Pageable @@ -24,7 +24,7 @@ class GetMissions(private val missionRepository: IMissionRepository) { pageNumber: Int?, pageSize: Int?, seaFronts: List?, - ): List { + ): List { val missions = missionRepository.findAll( startedAfter = startedAfterDateTime?.toInstant() ?: ZonedDateTime.now().minusDays(30).toInstant(), startedBefore = startedBeforeDateTime?.toInstant(), diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/missions/CreateOrUpdateMissionDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/missions/CreateOrUpdateMissionDataInput.kt index b9fe0da71..91dbb6415 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/missions/CreateOrUpdateMissionDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/missions/CreateOrUpdateMissionDataInput.kt @@ -25,7 +25,7 @@ data class CreateOrUpdateMissionDataInput( val envActions: List? = null, val hasMissionOrder: Boolean? = false, val isUnderJdp: Boolean? = false, - val attachedReportingIds: List? = null, + val attachedReportingIds: List, ) { fun toMissionEntity(): MissionEntity { val hasMissionOrder = this.hasMissionOrder ?: false diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/MissionDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/MissionDataOutput.kt index e1fb1c218..c6e657c60 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/MissionDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/MissionDataOutput.kt @@ -1,10 +1,10 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.outputs 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.EnvActionEntity -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import org.locationtech.jts.geom.MultiPolygon import java.time.ZonedDateTime @@ -28,29 +28,29 @@ data class MissionDataOutput( val isGeometryComputedFromControls: Boolean, ) { companion object { - fun fromMissionDTO(dto: MissionDTO): MissionDataOutput { - requireNotNull(dto.mission.id) { + fun fromMissionEntity(mission: MissionEntity): MissionDataOutput { + requireNotNull(mission.id) { "a mission must have an id" } return MissionDataOutput( - id = dto.mission.id, - missionTypes = dto.mission.missionTypes, - controlUnits = dto.mission.controlUnits, - openBy = dto.mission.openBy, - closedBy = dto.mission.closedBy, - observationsCacem = dto.mission.observationsCacem, - observationsCnsp = dto.mission.observationsCnsp, - facade = dto.mission.facade, - geom = dto.mission.geom, - startDateTimeUtc = dto.mission.startDateTimeUtc, - endDateTimeUtc = dto.mission.endDateTimeUtc, - envActions = dto.mission.envActions, - missionSource = dto.mission.missionSource, - isClosed = dto.mission.isClosed, - hasMissionOrder = dto.mission.hasMissionOrder, - isUnderJdp = dto.mission.isUnderJdp, - isGeometryComputedFromControls = dto.mission.isGeometryComputedFromControls, + id = mission.id, + missionTypes = mission.missionTypes, + controlUnits = mission.controlUnits, + openBy = mission.openBy, + closedBy = mission.closedBy, + observationsCacem = mission.observationsCacem, + observationsCnsp = mission.observationsCnsp, + facade = mission.facade, + geom = mission.geom, + startDateTimeUtc = mission.startDateTimeUtc, + endDateTimeUtc = mission.endDateTimeUtc, + envActions = mission.envActions, + missionSource = mission.missionSource, + isClosed = mission.isClosed, + hasMissionOrder = mission.hasMissionOrder, + isUnderJdp = mission.isUnderJdp, + isGeometryComputedFromControls = mission.isGeometryComputedFromControls, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsController.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsController.kt index f773370cd..a9f4bf331 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsController.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsController.kt @@ -19,8 +19,8 @@ import java.time.ZonedDateTime @Tag(description = "API Missions", name = "Missions") class MissionsController( private val createOrUpdateMissionWithAttachedReporting: CreateOrUpdateMissionWithAttachedReporting, - private val getMissions: GetMissions, - private val getMissionById: GetMissionById, + private val getFullMissions: GetFullMissions, + private val getFullMissionById: GetFullMissionById, private val deleteMission: DeleteMission, private val getEngagedControlUnits: GetEngagedControlUnits, ) { @@ -55,7 +55,7 @@ class MissionsController( @RequestParam(name = "seaFronts", required = false) seaFronts: List?, ): List { - val missions = getMissions.execute( + val missions = getFullMissions.execute( startedAfterDateTime = startedAfterDateTime, startedBeforeDateTime = startedBeforeDateTime, missionSources = missionSources, @@ -89,7 +89,7 @@ class MissionsController( @PathVariable(name = "missionId") missionId: Int, ): MissionDataOutput { - val mission = getMissionById.execute(missionId = missionId) + val mission = getFullMissionById.execute(missionId = missionId) return MissionDataOutput.fromMissionDTO(mission) } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsController.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsController.kt index 5e5628e7a..2bc3a33ea 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsController.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsController.kt @@ -64,7 +64,7 @@ class ApiMissionsController( pageNumber = pageNumber, pageSize = pageSize, ) - return missions.map { MissionDataOutput.fromMissionDTO(it) } + return missions.map { MissionDataOutput.fromMissionEntity(it) } } @PostMapping("", consumes = ["application/json"]) @@ -75,7 +75,7 @@ class ApiMissionsController( ): MissionDataOutput { val newMission = createMissionDataInput.toMissionEntity() val createdMission = createOrUpdateMission.execute(mission = newMission) - return MissionDataOutput.fromMissionDTO(createdMission) + return MissionDataOutput.fromMissionEntity(createdMission) } @GetMapping("/{missionId}") @@ -87,7 +87,7 @@ class ApiMissionsController( ): MissionDataOutput { val mission = getMissionById.execute(missionId = missionId) - return MissionDataOutput.fromMissionDTO(mission) + return MissionDataOutput.fromMissionEntity(mission) } @PostMapping(value = ["/{missionId}"], consumes = ["application/json"]) @@ -105,7 +105,7 @@ class ApiMissionsController( return createOrUpdateMission.execute( mission = updateMissionDataInput.toMissionEntity(), ).let { - MissionDataOutput.fromMissionDTO(it) + MissionDataOutput.fromMissionEntity(it) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepository.kt index 91d738284..f5ab1a595 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepository.kt @@ -33,7 +33,7 @@ class JpaMissionRepository( dbMissionRepository.delete(missionId) } - override fun findAll( + override fun findAllFullMissions( startedAfter: Instant, startedBefore: Instant?, missionTypes: List?, @@ -61,10 +61,36 @@ class JpaMissionRepository( } } - override fun findById(missionId: Int): MissionDTO { + override fun findAll( + startedAfter: Instant, + startedBefore: Instant?, + missionTypes: List?, + missionStatuses: List?, + missionSources: List?, + seaFronts: List?, + pageable: Pageable, + ): List { + val missionSourcesAsStringArray = missionSources?.map { it.name } + return dbMissionRepository.findAll( + startedAfter = startedAfter, + startedBefore = startedBefore, + missionTypes = convertToPGArray(missionTypes), + missionStatuses = convertToPGArray(missionStatuses), + missionSources = convertToPGArray(missionSourcesAsStringArray), + seaFronts = convertToPGArray(seaFronts), + pageable = pageable, + ) + .map { it.toMissionEntity(mapper) } + } + + override fun findFullMissionById(missionId: Int): MissionDTO { return dbMissionRepository.findById(missionId).get().toMissionDTO(mapper) } + override fun findById(missionId: Int): MissionEntity { + return dbMissionRepository.findById(missionId).get().toMissionEntity(mapper) + } + @Transactional @Modifying(clearAutomatically = true, flushAutomatically = true) override fun save(mission: MissionEntity): MissionDTO { diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionUTests.kt index 854f41ae6..e5117665f 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionUTests.kt @@ -2,12 +2,10 @@ package fr.gouv.cacem.monitorenv.domain.use_cases -import com.nhaarman.mockitokotlin2.anyOrNull -import com.nhaarman.mockitokotlin2.argThat -import com.nhaarman.mockitokotlin2.given -import com.nhaarman.mockitokotlin2.times -import com.nhaarman.mockitokotlin2.verify -import fr.gouv.cacem.monitorenv.domain.entities.mission.* +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 @@ -132,10 +130,10 @@ class CreateOrUpdateMissionUTests { given(facadeAreasRepository.findFacadeFromGeometry(anyOrNull())).willReturn("La Face Ade") given(departmentRepository.findDepartmentFromGeometry(anyOrNull())).willReturn("Quequ'part") given(missionRepository.save(anyOrNull())).willReturn(MissionDTO(mission = expectedCreatedMission)) - given(missionRepository.findById(100)).willReturn(MissionDTO(mission = expectedCreatedMission)) + given(missionRepository.findById(100)).willReturn(expectedCreatedMission) // When - val createdMissionDTO = CreateOrUpdateMission( + val createdMission = CreateOrUpdateMission( departmentRepository = departmentRepository, missionRepository = missionRepository, facadeRepository = facadeAreasRepository, @@ -169,6 +167,6 @@ class CreateOrUpdateMissionUTests { }, ) verify(missionRepository, times(1)).findById(100) - assertThat(createdMissionDTO.mission).isEqualTo(expectedCreatedMission) + assertThat(createdMission).isEqualTo(expectedCreatedMission) } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionWithAttachedReportingUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionWithAttachedReportingUTests.kt index 7158f0d50..a9a240b34 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionWithAttachedReportingUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/CreateOrUpdateMissionWithAttachedReportingUTests.kt @@ -3,25 +3,18 @@ package fr.gouv.cacem.monitorenv.domain.use_cases import com.nhaarman.mockitokotlin2.anyOrNull -import com.nhaarman.mockitokotlin2.argThat import com.nhaarman.mockitokotlin2.given import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify import fr.gouv.cacem.monitorenv.domain.entities.mission.* -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.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.dtos.MissionDTO -import org.assertj.core.api.Assertions 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 @@ -33,155 +26,14 @@ import java.util.* class CreateOrUpdateMissionWithAttachedReportingUTests { @MockBean - private lateinit var departmentRepository: IDepartmentAreaRepository + private lateinit var createOrUpdateMission: CreateOrUpdateMission @MockBean private lateinit var missionRepository: IMissionRepository - @MockBean - private lateinit var facadeAreasRepository: IFacadeAreasRepository - @MockBean private lateinit var reportingRepository: IReportingRepository - @Test - fun `execute Should throw an exception when input mission is null`() { - // When - val throwable = Assertions.catchThrowable { - CreateOrUpdateMissionWithAttachedReporting( - departmentRepository = departmentRepository, - facadeRepository = facadeAreasRepository, - missionRepository = missionRepository, - reportingRepository = reportingRepository, - ) - .execute( - mission = null, - envActionsAttachedToReportingIds = listOf(), - ) - } - - // Then - assertThat(throwable).isInstanceOf(IllegalArgumentException::class.java) - assertThat(throwable.message).contains("No mission to create or update") - } - - @Test - fun `should return the mission to create or update with computed facade and department info`() { - // 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 = MissionEntity( - 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, - isUnderJdp = false, - 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.", - ), - ), - 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"), - 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.", - ), - ), - ) - - given(facadeAreasRepository.findFacadeFromGeometry(anyOrNull())).willReturn("La Face Ade") - given(departmentRepository.findDepartmentFromGeometry(anyOrNull())).willReturn("Quequ'part") - given(missionRepository.save(anyOrNull())).willReturn(MissionDTO(mission = expectedCreatedMission)) - given(missionRepository.findById(100)).willReturn(MissionDTO(mission = expectedCreatedMission)) - - // When - val createdMissionDTO = CreateOrUpdateMissionWithAttachedReporting( - departmentRepository = departmentRepository, - facadeRepository = facadeAreasRepository, - missionRepository = missionRepository, - reportingRepository = reportingRepository, - ).execute( - missionToCreate, - envActionsAttachedToReportingIds = listOf(), - ) - - // Then - verify(facadeAreasRepository, times(2)).findFacadeFromGeometry(argThat { this == polygon }) - verify(facadeAreasRepository, times(1)).findFacadeFromGeometry(argThat { this == point }) - - verify(missionRepository, times(1)) - .save( - argThat { - this == missionToCreate.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 - } - }, - ) - }, - ) - verify(missionRepository, times(1)).findById(100) - assertThat(createdMissionDTO.mission).isEqualTo(expectedCreatedMission) - } - @Test fun `should attach mission to specified reportings`() { // Given @@ -224,13 +76,13 @@ class CreateOrUpdateMissionWithAttachedReportingUTests { attachedReportingIds = attachedReportingIds, ) + given(createOrUpdateMission.execute(anyOrNull())).willReturn(missionToCreate.copy(id = 100)) given(missionRepository.save(anyOrNull())).willReturn(MissionDTO(mission = missionToCreate.copy(id = 100))) - given(missionRepository.findById(100)).willReturn(expectedCreatedMission) + given(missionRepository.findFullMissionById(100)).willReturn(expectedCreatedMission) // When val createdMissionDTO = CreateOrUpdateMissionWithAttachedReporting( - departmentRepository = departmentRepository, - facadeRepository = facadeAreasRepository, + createOrUpdateMission = createOrUpdateMission, missionRepository = missionRepository, reportingRepository = reportingRepository, ).execute( @@ -242,7 +94,7 @@ class CreateOrUpdateMissionWithAttachedReportingUTests { // Then verify(reportingRepository, times(1)).attachReportingsToMission(attachedReportingIds, 100) - verify(missionRepository, times(1)).findById(100) + verify(missionRepository, times(1)).findFullMissionById(100) assertThat(createdMissionDTO).isEqualTo(expectedCreatedMission) } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnitsUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnitsUTests.kt index 5ef44d21e..c911a1361 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnitsUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/GetEngagedControlUnitsUTests.kt @@ -17,7 +17,7 @@ import java.time.ZonedDateTime @ExtendWith(SpringExtension::class) class GetEngagedControlUnitsUTests { @MockBean - private lateinit var getMissions: GetMissions + private lateinit var getFullMissions: GetFullMissions @Test fun `execute() should return engaged control units`() { @@ -48,7 +48,7 @@ class GetEngagedControlUnitsUTests { ) given( - getMissions.execute( + getFullMissions.execute( anyOrNull(), anyOrNull(), anyOrNull(), @@ -61,7 +61,7 @@ class GetEngagedControlUnitsUTests { ) .willReturn(listOf(expectedMission, expectedMission)) - val controlUnits = GetEngagedControlUnits(getMissions).execute() + val controlUnits = GetEngagedControlUnits(getFullMissions).execute() assertThat(controlUnits).hasSize(1) assertThat(controlUnits.first().name).isEqualTo("Control Unit Name") diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsControllerITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsControllerITests.kt index 81b3efd1b..761ebb697 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsControllerITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/MissionsControllerITests.kt @@ -20,8 +20,8 @@ import fr.gouv.cacem.monitorenv.domain.entities.semaphore.SemaphoreEntity import fr.gouv.cacem.monitorenv.domain.use_cases.missions.CreateOrUpdateMissionWithAttachedReporting import fr.gouv.cacem.monitorenv.domain.use_cases.missions.DeleteMission import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetEngagedControlUnits -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissionById -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissions +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetFullMissionById +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetFullMissions import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import fr.gouv.cacem.monitorenv.domain.use_cases.reportings.dtos.ReportingDTO import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.inputs.missions.CreateOrUpdateMissionDataInput @@ -61,10 +61,10 @@ class MissionsControllerITests { private lateinit var createOrUpdateMissionWithAttachedReporting: CreateOrUpdateMissionWithAttachedReporting @MockBean - private lateinit var getMissions: GetMissions + private lateinit var getFullMissions: GetFullMissions @MockBean - private lateinit var getMissionById: GetMissionById + private lateinit var getFullMissionById: GetFullMissionById @MockBean private lateinit var deleteMission: DeleteMission @@ -108,12 +108,13 @@ class MissionsControllerITests { endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), isClosed = false, missionSource = MissionSourceEnum.MONITORENV, + attachedReportingIds = listOf(), ) val requestbody = objectMapper.writeValueAsString(newMissionRequest) given( createOrUpdateMissionWithAttachedReporting.execute( mission = newMissionRequest.toMissionEntity(), - attachedReportingIds = null, + attachedReportingIds = listOf(), envActionsAttachedToReportingIds = listOf(), ), ).willReturn(expectedNewMission) @@ -217,7 +218,7 @@ class MissionsControllerITests { ), ) given( - getMissions.execute( + getFullMissions.execute( startedAfterDateTime = null, startedBeforeDateTime = null, seaFronts = null, @@ -271,14 +272,14 @@ class MissionsControllerITests { ), ) // we test only if the route is called with the right arg - given(getMissionById.execute(requestedId)).willReturn(expectedFirstMission) + given(getFullMissionById.execute(requestedId)).willReturn(expectedFirstMission) // When mockMvc.perform(get("/bff/v1/missions/$requestedId")) // Then .andExpect(status().isOk) .andExpect(jsonPath("$.missionTypes[0]", equalTo(MissionTypeEnum.SEA.toString()))) - verify(getMissionById).execute(requestedId) + verify(getFullMissionById).execute(requestedId) } @Test diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsControllerITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsControllerITests.kt index b47924dbb..0eb8f4344 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsControllerITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiMissionsControllerITests.kt @@ -11,12 +11,7 @@ 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.CreateOrUpdateMission -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.DeleteMission -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetEngagedControlUnits -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissionById -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissions -import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.* import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.CreateOrUpdateMissionDataInput import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.Test @@ -69,22 +64,20 @@ class ApiMissionsControllerITests { "MULTIPOLYGON (((-4.54877817 48.30555988, -4.54997332 48.30597601, -4.54998501 48.30718823, -4.5487929 48.30677461, -4.54877817 48.30555988)))" val polygon = wktReader.read(multipolygonString) as MultiPolygon // Given - val expectedNewMission = MissionDTO( - mission = MissionEntity( - id = 10, - missionTypes = listOf(MissionTypeEnum.LAND), - facade = "Outre-Mer", - geom = polygon, - observationsCnsp = null, - startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), - endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), - isClosed = false, - isDeleted = false, - missionSource = MissionSourceEnum.MONITORFISH, - hasMissionOrder = true, - isUnderJdp = true, - isGeometryComputedFromControls = false, - ), + val expectedNewMission = MissionEntity( + id = 10, + missionTypes = listOf(MissionTypeEnum.LAND), + facade = "Outre-Mer", + geom = polygon, + observationsCnsp = null, + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), + isClosed = false, + isDeleted = false, + missionSource = MissionSourceEnum.MONITORFISH, + hasMissionOrder = true, + isUnderJdp = true, + isGeometryComputedFromControls = false, ) val newMissionRequest = CreateOrUpdateMissionDataInput( missionTypes = listOf(MissionTypeEnum.LAND), @@ -103,7 +96,6 @@ class ApiMissionsControllerITests { given( createOrUpdateMission.execute( mission = newMissionRequest.toMissionEntity(), - attachedReportingIds = null, ), ) .willReturn(expectedNewMission) @@ -126,22 +118,20 @@ class ApiMissionsControllerITests { "MULTIPOLYGON (((-4.54877817 48.30555988, -4.54997332 48.30597601, -4.54998501 48.30718823, -4.5487929 48.30677461, -4.54877817 48.30555988)))" val polygon = wktReader.read(multipolygonString) as MultiPolygon - val expectedFirstMission = MissionDTO( - mission = MissionEntity( - id = 10, - missionTypes = listOf(MissionTypeEnum.SEA), - facade = "Outre-Mer", - geom = polygon, - observationsCnsp = null, - startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), - endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), - isDeleted = false, - missionSource = MissionSourceEnum.MONITORFISH, - isClosed = false, - hasMissionOrder = false, - isUnderJdp = false, - isGeometryComputedFromControls = false, - ), + val expectedFirstMission = MissionEntity( + id = 10, + missionTypes = listOf(MissionTypeEnum.SEA), + facade = "Outre-Mer", + geom = polygon, + observationsCnsp = null, + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"), + isDeleted = false, + missionSource = MissionSourceEnum.MONITORFISH, + isClosed = false, + hasMissionOrder = false, + isUnderJdp = false, + isGeometryComputedFromControls = false, ) given( getMissions.execute( @@ -167,18 +157,16 @@ class ApiMissionsControllerITests { fun `Should get specific mission when requested by Id`() { // Given val requestedId = 0 - val expectedFirstMission = MissionDTO( - mission = MissionEntity( - id = 10, - missionTypes = listOf(MissionTypeEnum.SEA), - startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), - isDeleted = false, - missionSource = MissionSourceEnum.MONITORFISH, - isClosed = false, - hasMissionOrder = false, - isUnderJdp = false, - isGeometryComputedFromControls = false, - ), + val expectedFirstMission = MissionEntity( + id = 10, + missionTypes = listOf(MissionTypeEnum.SEA), + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + isDeleted = false, + missionSource = MissionSourceEnum.MONITORFISH, + isClosed = false, + hasMissionOrder = false, + isUnderJdp = false, + isGeometryComputedFromControls = false, ) // we test only if the route is called with the right arg given(getMissionById.execute(requestedId)).willReturn(expectedFirstMission) @@ -194,20 +182,18 @@ class ApiMissionsControllerITests { @Test fun `update mission should return updated mission`() { // Given - val expectedUpdatedMission = MissionDTO( - mission = MissionEntity( - id = 14, - missionTypes = listOf(MissionTypeEnum.SEA), - observationsCacem = "updated observations", - observationsCnsp = "updated observations", - startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), - isClosed = false, - isDeleted = false, - missionSource = MissionSourceEnum.MONITORFISH, - hasMissionOrder = true, - isUnderJdp = true, - isGeometryComputedFromControls = false, - ), + val expectedUpdatedMission = MissionEntity( + id = 14, + missionTypes = listOf(MissionTypeEnum.SEA), + observationsCacem = "updated observations", + observationsCnsp = "updated observations", + startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"), + isClosed = false, + isDeleted = false, + missionSource = MissionSourceEnum.MONITORFISH, + hasMissionOrder = true, + isUnderJdp = true, + isGeometryComputedFromControls = false, ) val envAction = EnvActionControlEntity( id = UUID.fromString("bf9f4062-83d3-4a85-b89b-76c0ded6473d"), @@ -231,7 +217,6 @@ class ApiMissionsControllerITests { given( createOrUpdateMission.execute( mission = requestBody.toMissionEntity(), - attachedReportingIds = null, ), ).willReturn(expectedUpdatedMission) // When @@ -242,7 +227,7 @@ class ApiMissionsControllerITests { ) // Then .andExpect(status().isOk) - .andExpect(jsonPath("$.observationsCnsp", equalTo(expectedUpdatedMission.mission.observationsCnsp))) + .andExpect(jsonPath("$.observationsCnsp", equalTo(expectedUpdatedMission.observationsCnsp))) } @Test diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepositoryITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepositoryITests.kt index 544fd44e1..48fc77134 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepositoryITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaMissionRepositoryITests.kt @@ -46,7 +46,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `save should create a new mission`() { // Given - val existingMissions = jpaMissionRepository.findAll( + val existingMissions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T10:54:00Z").toInstant(), startedBefore = ZonedDateTime.parse("2022-08-08T00:00:00Z").toInstant(), missionTypes = null, @@ -141,7 +141,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { noteObservations, ) - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T10:54:00Z").toInstant(), startedBefore = ZonedDateTime.parse("2022-08-08T00:00:00Z").toInstant(), missionTypes = null, @@ -309,7 +309,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return all missions when only required startedAfter is set to a very old date`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -324,7 +324,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when startedAfter & startedBefore are set`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T10:54:00Z").toInstant(), startedBefore = ZonedDateTime.parse("2022-08-08T00:00:00Z").toInstant(), missionTypes = null, @@ -339,7 +339,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when missionTypes is set`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = listOf("SEA"), @@ -354,7 +354,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when multiple missionTypes are set`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = listOf("SEA", "LAND"), @@ -369,7 +369,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when seaFront is set to MEMN`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -384,7 +384,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when seaFront is set to MEMN and NAMO`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -399,7 +399,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when status is set to UPCOMING`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -414,7 +414,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when status is set to PENDING`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -429,7 +429,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when status is set to ENDED`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -444,7 +444,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when status is set to CLOSED`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -459,7 +459,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll Should return filtered missions when status is set to CLOSED or UPCOMING`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -474,7 +474,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll with pagenumber and pagesize Should return subset of missions`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -489,7 +489,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findAll should filter missions based on MissionSources`() { // When - val missions = jpaMissionRepository.findAll( + val missions = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2000-01-01T00:01:00Z").toInstant(), startedBefore = null, missionTypes = null, @@ -564,7 +564,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { isGeometryComputedFromControls = false, ), ) - val mission = jpaMissionRepository.findById(10) + val mission = jpaMissionRepository.findFullMissionById(10) assertThat(mission).isEqualTo(firstMission) } @@ -573,7 +573,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `findById Should return specified mission and associated env actions`() { // When - val missionDTO = jpaMissionRepository.findById(34) + val missionDTO = jpaMissionRepository.findFullMissionById(34) assertThat(missionDTO.mission.id).isEqualTo(34) assertThat(missionDTO.mission.envActions).hasSize(2) } @@ -661,7 +661,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { ) // When jpaMissionRepository.save(missionToUpdate) - assertThat(jpaMissionRepository.findById(10)).isEqualTo(expectedUpdatedMission) + assertThat(jpaMissionRepository.findFullMissionById(10)).isEqualTo(expectedUpdatedMission) } @Test @@ -717,7 +717,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { ) // When jpaMissionRepository.save(missionToUpdate) - val updatedMission = jpaMissionRepository.findById(10) + val updatedMission = jpaMissionRepository.findFullMissionById(10) assertThat(updatedMission).isEqualTo(expectedUpdatedMission) } @@ -725,7 +725,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { @Transactional fun `delete Should set the deleted flag as true`() { // Given - val missionsList = jpaMissionRepository.findAll( + val missionsList = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T10:54:00Z").toInstant(), startedBefore = ZonedDateTime.parse("2022-08-08T00:00:00Z").toInstant(), missionTypes = null, @@ -739,7 +739,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { jpaMissionRepository.delete(3) // Then - val nextMissionList = jpaMissionRepository.findAll( + val nextMissionList = jpaMissionRepository.findAllFullMissions( startedAfter = ZonedDateTime.parse("2022-01-01T10:54:00Z").toInstant(), startedBefore = ZonedDateTime.parse("2022-08-08T00:00:00Z").toInstant(), missionTypes = null,