diff --git a/backend/pom.xml b/backend/pom.xml index 2eb75fa03f..119cc59971 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -1,5 +1,5 @@ - 4.0.0 @@ -325,7 +325,9 @@ -parameters - + 8 + 8 + org.jetbrains.kotlin diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/ControlUnitResourceEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/ControlUnitResourceEntity.kt index 150275efec..cca9ef7ea4 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/ControlUnitResourceEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/ControlUnitResourceEntity.kt @@ -42,4 +42,11 @@ data class ControlUnitResourceEntity( return result } + + fun toLegacyControlUnitEntity(): LegacyControlUnitResourceEntity { + return LegacyControlUnitResourceEntity( + id = requireNotNull(id), + name, + ) + } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitEntity.kt index a784fb5a5c..aae3f30626 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitEntity.kt @@ -1,11 +1,11 @@ package fr.gouv.cacem.monitorenv.domain.entities.controlUnit -// TODO Replace this entity with `FullControlUnitEntity`. It's left for `MissionEntity.units` backward compatibility. +// TODO Replace this entity with `ControlUnitEntity`. It's left for `MissionEntity.units` backward compatibility. data class LegacyControlUnitEntity( val id: Int, val administration: String, val isArchived: Boolean, val name: String, - val resources: List, + val resources: List, val contact: String? = null, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitResourceEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitResourceEntity.kt new file mode 100644 index 0000000000..5f39e0e2d7 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/LegacyControlUnitResourceEntity.kt @@ -0,0 +1,7 @@ +package fr.gouv.cacem.monitorenv.domain.entities.controlUnit + +// TODO Replace this entity with `ControlUnitResourceEntity`. It's left for `MissionEntity.units` backward compatibility. +data class LegacyControlUnitResourceEntity( + val id: Int, + val name: String, +) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/exceptions/ControlResourceOrUnitNotFoundException.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/exceptions/ControlResourceOrUnitNotFoundException.kt deleted file mode 100644 index e62903cc03..0000000000 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/exceptions/ControlResourceOrUnitNotFoundException.kt +++ /dev/null @@ -1,4 +0,0 @@ -package fr.gouv.cacem.monitorenv.domain.exceptions - -class ControlResourceOrUnitNotFoundException(message: String, cause: Throwable? = null) : - Throwable(message, cause) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IControlUnitResourceRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IControlUnitResourceRepository.kt index d510ce62aa..32da7aea63 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IControlUnitResourceRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/repositories/IControlUnitResourceRepository.kt @@ -10,5 +10,7 @@ interface IControlUnitResourceRepository { fun findAll(): List + fun findAllById(controlUnitResourceIds: List): List + fun save(controlUnitResource: ControlUnitResourceEntity): ControlUnitResourceEntity } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitDTO.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitDTO.kt index 9b37fa3f96..41a9657544 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitDTO.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitDTO.kt @@ -20,7 +20,7 @@ data class FullControlUnitDTO( administration = administration.name, isArchived = controlUnit.isArchived, name = controlUnit.name, - resources = controlUnitResources.map { it.toControlUnitResource() }, + resources = controlUnitResources.map { it.toLegacyControlUnitResource() }, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitResourceDTO.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitResourceDTO.kt index af3c205022..58ce840f3e 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitResourceDTO.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/dtos/FullControlUnitResourceDTO.kt @@ -3,22 +3,17 @@ package fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.dtos import fr.gouv.cacem.monitorenv.domain.entities.base.BaseEntity import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitEntity import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity data class FullControlUnitResourceDTO( val base: BaseEntity, val controlUnit: ControlUnitEntity, val controlUnitResource: ControlUnitResourceEntity, ) { - fun toControlUnitResource(): ControlUnitResourceEntity { - return ControlUnitResourceEntity( - id = controlUnitResource.id, - baseId = controlUnitResource.baseId, - controlUnitId = controlUnitResource.controlUnitId, - isArchived = controlUnitResource.isArchived, + fun toLegacyControlUnitResource(): LegacyControlUnitResourceEntity { + return LegacyControlUnitResourceEntity( + id = requireNotNull(controlUnitResource.id), name = controlUnitResource.name, - note = controlUnitResource.note, - photo = controlUnitResource.photo, - type = controlUnitResource.type, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitDataOutput.kt index edd60ef899..36f2357343 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitDataOutput.kt @@ -10,14 +10,15 @@ data class LegacyControlUnitDataOutput( val resources: List, ) { companion object { - fun fromLegacyControlUnit(legacyControlUnit: LegacyControlUnitEntity) = LegacyControlUnitDataOutput( - id = legacyControlUnit.id, - administration = legacyControlUnit.administration, - name = legacyControlUnit.name, - isArchived = legacyControlUnit.isArchived, - resources = legacyControlUnit.resources.map { - LegacyControlUnitResourceDataOutput.fromControlResourceEntity(it) - }, - ) + fun fromLegacyControlUnit(legacyControlUnit: LegacyControlUnitEntity) = + LegacyControlUnitDataOutput( + id = legacyControlUnit.id, + administration = legacyControlUnit.administration, + name = legacyControlUnit.name, + isArchived = legacyControlUnit.isArchived, + resources = legacyControlUnit.resources.map { + LegacyControlUnitResourceDataOutput.fromLegacyControlResourceEntity(it) + }, + ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitResourceDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitResourceDataOutput.kt index ac972907fc..af69bc308c 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitResourceDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/LegacyControlUnitResourceDataOutput.kt @@ -1,16 +1,18 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.bff.outputs -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity data class LegacyControlUnitResourceDataOutput( val id: Int, val name: String, ) { companion object { - fun fromControlResourceEntity(controlUnitResource: ControlUnitResourceEntity) = + fun fromLegacyControlResourceEntity( + legacyControlUnitResource: LegacyControlUnitResourceEntity, + ) = LegacyControlUnitResourceDataOutput( - id = requireNotNull(controlUnitResource.id), - name = controlUnitResource.name, + id = requireNotNull(legacyControlUnitResource.id), + name = legacyControlUnitResource.name, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsController.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsController.kt index d6d027885a..641292c1a3 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsController.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsController.kt @@ -17,6 +17,8 @@ class ApiLegacyControlUnitsController( @GetMapping("") @Operation(summary = "Get legacy control units") fun getControlResourcesController(): List { - return getLegacyControlUnits.execute().map { LegacyControlUnitDataOutput.fromLegacyControlUnit(it) } + return getLegacyControlUnits.execute().map { + LegacyControlUnitDataOutput.fromLegacyControlUnit(it) + } } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitModel.kt index 33b9612710..88aad65d8e 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitModel.kt @@ -80,6 +80,28 @@ data class ControlUnitModel( termsNote = controlUnit.termsNote, ) } + + /** + * @param controlUnitContactModels Return control unit contacts relations when provided. + * @param controlUnitResourceModels Return control unit resources relations when provided. + */ + fun fromFullControlUnit( + fullControlUnit: FullControlUnitDTO, + controlUnitContactModels: List? = null, + controlUnitResourceModels: List? = null, + ): ControlUnitModel { + return ControlUnitModel( + id = fullControlUnit.controlUnit.id, + areaNote = fullControlUnit.controlUnit.areaNote, + administration = AdministrationModel.fromAdministration(fullControlUnit.administration), + controlUnitContacts = controlUnitContactModels, + controlUnitResources = controlUnitResourceModels, + departmentArea = fullControlUnit.departmentArea?.let { DepartmentAreaModel.fromDepartmentArea(it) }, + isArchived = fullControlUnit.controlUnit.isArchived, + name = fullControlUnit.controlUnit.name, + termsNote = fullControlUnit.controlUnit.termsNote, + ) + } } fun toControlUnit(): ControlUnitEntity { @@ -110,7 +132,7 @@ data class ControlUnitModel( administration = administration.name, isArchived, name, - resources = requireNotNull(controlUnitResources).map { it.toControlUnitResource() }, + resources = requireNotNull(controlUnitResources).map { it.toLegacyControlUnitResource() }, contact = "", ) } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitResourceModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitResourceModel.kt index 712bc53ab3..e360faaec5 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitResourceModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/ControlUnitResourceModel.kt @@ -3,6 +3,7 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.model import com.fasterxml.jackson.annotation.JsonBackReference import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceType +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.dtos.FullControlUnitResourceDTO import io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType import jakarta.persistence.* @@ -131,4 +132,11 @@ data class ControlUnitResourceModel( controlUnitResource = toControlUnitResource(), ) } + + fun toLegacyControlUnitResource(): LegacyControlUnitResourceEntity { + return LegacyControlUnitResourceEntity( + id = requireNotNull(id), + name, + ) + } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionControlResourceModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionControlResourceModel.kt index 55ee5a37ae..594a4695d7 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionControlResourceModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionControlResourceModel.kt @@ -17,39 +17,18 @@ data class MissionControlResourceModel( @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = [CascadeType.MERGE]) @JoinColumn(name = "control_resource_id") - var ressource: ControlUnitResourceModel, + var resource: ControlUnitResourceModel, ) { - companion object { - fun fromControlUnitResource( - controlUnitResource: ControlUnitResourceEntity, - baseModel: BaseModel, - missionModel: MissionModel, - controlUnitModel: ControlUnitModel, - ) = MissionControlResourceModel( - ressource = ControlUnitResourceModel( - id = requireNotNull(controlUnitResource.id), - base = baseModel, - controlUnit = controlUnitModel, - isArchived = controlUnitResource.isArchived, - name = controlUnitResource.name, - note = controlUnitResource.note, - photo = controlUnitResource.photo, - type = controlUnitResource.type, - ), - mission = missionModel, - ) - } - fun toControlUnitResource(): ControlUnitResourceEntity { return ControlUnitResourceEntity( - id = ressource.id, - baseId = requireNotNull(ressource.base.id), - controlUnitId = requireNotNull(ressource.controlUnit.id), - isArchived = ressource.isArchived, - name = ressource.name, - note = ressource.note, + id = resource.id, + baseId = requireNotNull(resource.base.id), + controlUnitId = requireNotNull(resource.controlUnit.id), + isArchived = resource.isArchived, + name = resource.name, + note = resource.note, photo = byteArrayOf(), - type = ressource.type, + type = resource.type, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionModel.kt index ef11a1ade8..1719762593 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/MissionModel.kt @@ -14,18 +14,7 @@ import fr.gouv.cacem.monitorenv.utils.mapOrElseEmpty import io.hypersistence.utils.hibernate.type.array.ListArrayType import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType.SQL_ARRAY_TYPE import io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType -import jakarta.persistence.Basic -import jakarta.persistence.CascadeType -import jakarta.persistence.Column -import jakarta.persistence.Entity -import jakarta.persistence.EnumType -import jakarta.persistence.Enumerated -import jakarta.persistence.FetchType -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType -import jakarta.persistence.Id -import jakarta.persistence.OneToMany -import jakarta.persistence.Table +import jakarta.persistence.* import org.hibernate.Hibernate import org.hibernate.annotations.Fetch import org.hibernate.annotations.FetchMode @@ -140,16 +129,11 @@ data class MissionModel( ) { fun toMissionEntity(objectMapper: ObjectMapper): MissionEntity { val controlUnits = controlUnits.mapOrElseEmpty { missionControlUnitModel -> - val maybeMissionControlResourceModels = controlResources - ?.filter { missionControlResourceModel -> - missionControlResourceModel.ressource.controlUnit.id == missionControlUnitModel.unit.id - } - - val controlUnitResources = maybeMissionControlResourceModels.mapOrElseEmpty { it.toControlUnitResource() } + val controlUnitResources = controlResources.mapOrElseEmpty { it.toControlUnitResource() } missionControlUnitModel.unit.toLegacyControlUnit().copy( contact = missionControlUnitModel.contact, - resources = controlUnitResources, + resources = controlUnitResources.map { it.toLegacyControlUnitEntity() }, ) } @@ -186,7 +170,7 @@ data class MissionModel( fun fromMissionEntity( mission: MissionEntity, mapper: ObjectMapper, - baseModelMap: Map, + controlUnitResourceModelMap: Map, ): MissionModel { val missionModel = MissionModel( id = mission.id, @@ -212,20 +196,19 @@ data class MissionModel( } mission.controlUnits.map { - val controlUnitModel = MissionControlUnitModel.fromLegacyControlUnit( + val missionControlUnitModel = MissionControlUnitModel.fromLegacyControlUnit( it, missionModel, ) - missionModel.controlUnits?.add(controlUnitModel) + missionModel.controlUnits?.add(missionControlUnitModel) val missionControlUnitResourceModels = it.resources.map { controlUnitResource -> - val baseModel = requireNotNull(baseModelMap[controlUnitResource.baseId]) + val controlUnitResourceModel = requireNotNull(controlUnitResourceModelMap[controlUnitResource.id]) - MissionControlResourceModel.fromControlUnitResource( - controlUnitResource, - baseModel, - missionModel, - controlUnitModel.unit, + MissionControlResourceModel( + id = mission.id, + resource = controlUnitResourceModel, + mission = missionModel, ) } missionModel.controlResources?.addAll(missionControlUnitResourceModels) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepository.kt index 7f804f5223..990d2ba3c4 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepository.kt @@ -27,6 +27,12 @@ class JpaControlUnitResourceRepository( return dbControlUnitResourceRepository.findAll().map { it.toFullControlUnitResource() } } + override fun findAllById(controlUnitResourceIds: List): List { + return dbControlUnitResourceRepository.findAllById(controlUnitResourceIds).map { + it.toFullControlUnitResource() + } + } + override fun findById(controlUnitResourceId: Int): FullControlUnitResourceDTO { return dbControlUnitResourceRepository.findById(controlUnitResourceId).get().toFullControlUnitResource() } 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 d5b18dbddb..6f080be8f3 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 @@ -3,14 +3,11 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.repositories import com.fasterxml.jackson.databind.ObjectMapper import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum -import fr.gouv.cacem.monitorenv.domain.exceptions.ControlResourceOrUnitNotFoundException import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO -import fr.gouv.cacem.monitorenv.infrastructure.database.model.BaseModel import fr.gouv.cacem.monitorenv.infrastructure.database.model.MissionModel +import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBControlUnitResourceRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBMissionRepository -import org.springframework.dao.DataIntegrityViolationException -import org.springframework.dao.InvalidDataAccessApiUsageException import org.springframework.data.domain.Pageable import org.springframework.stereotype.Repository import org.springframework.transaction.annotation.Transactional @@ -18,7 +15,7 @@ import java.time.Instant @Repository class JpaMissionRepository( - private val dbBaseRepository: JpaBaseRepository, + private val dbControlUnitResourceRepository: IDBControlUnitResourceRepository, private val dbMissionRepository: IDBMissionRepository, private val mapper: ObjectMapper, ) : IMissionRepository { @@ -62,31 +59,22 @@ class JpaMissionRepository( @Transactional override fun save(mission: MissionEntity): MissionDTO { - return try { - // Extract all control units resources unique baseIds - val uniqueBaseIds = mission.controlUnits.flatMap { controlUnit -> - controlUnit.resources.map { it.baseId } - }.distinct() - // Fetch all of them as models - val baseModels = dbBaseRepository.findAllById(uniqueBaseIds).map { BaseModel.fromFullBase(it) } - // Create a `[baseId] → BaseModel` map - val baseModelMap = baseModels.associateBy { requireNotNull(it.id) } + // Extract all control units resources unique control unit resource IDs + val uniqueControlUnitResourceIds = mission.controlUnits.flatMap { controlUnit -> + controlUnit.resources.map { it.id } + }.distinct() + // Fetch all of them as models + val controlUnitResourceModels = dbControlUnitResourceRepository.findAllById(uniqueControlUnitResourceIds) + // Create an `[id] → ControlUnitResourceModel` map + val controlUnitResourceModelMap = controlUnitResourceModels.associateBy { requireNotNull(it.id) } - val missionModel = MissionModel.fromMissionEntity(mission, mapper, baseModelMap) - dbMissionRepository.save(missionModel).toMissionDTO(mapper) - } catch (e: Exception) { - when (e) { - // TODO Is `InvalidDataAccessApiUsageException` necessary? - is DataIntegrityViolationException, is InvalidDataAccessApiUsageException -> { - throw ControlResourceOrUnitNotFoundException( - "Invalid control unit or resource id: not found in referential.", - e, - ) - } + val missionModel = MissionModel.fromMissionEntity(mission, mapper, controlUnitResourceModelMap) - else -> throw e - } - } + val a = dbMissionRepository.save(missionModel) + + val b = a.toMissionDTO(mapper) + + return b } private fun convertToPGArray(array: List?): String { 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 b7d4fdd8cb..44ac99d510 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 @@ -4,9 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper 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.ControlUnitResourceEntity -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceType import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.* import fr.gouv.cacem.monitorenv.domain.entities.reporting.ReportingEntity import fr.gouv.cacem.monitorenv.domain.entities.reporting.ReportingTypeEnum @@ -118,7 +117,7 @@ class MissionsControllerITests { "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 - var point = wktReader.read("POINT (-4.54877816747593 48.305559876971)") as Point + val point = wktReader.read("POINT (-4.54877816747593 48.305559876971)") as Point val expectedFirstMission = MissionDTO( mission = MissionEntity( @@ -130,13 +129,9 @@ class MissionsControllerITests { name = "CU1", administration = "Admin 1", resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 2, - baseId = 3, - isArchived = false, name = "Ressource 2", - type = ControlUnitResourceType.BARGE, - controlUnitId = 1, ), ), isArchived = false, @@ -183,7 +178,7 @@ class MissionsControllerITests { isDeleted = false, openBy = "OpenBy", - ), + ), semaphore = SemaphoreEntity( id = 1, name = "Semaphore 1", diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsControllerITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsControllerITests.kt index c5e71446e3..59879d1073 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsControllerITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ApiLegacyControlUnitsControllerITests.kt @@ -1,9 +1,8 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.endpoints.publicapi import fr.gouv.cacem.monitorenv.config.WebSecurityConfig -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceType import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.GetLegacyControlUnits import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.Test @@ -35,13 +34,9 @@ class ApiLegacyControlUnitsControllerITests { isArchived = false, name = "DF 123", resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 0, - baseId = 0, - controlUnitId = 0, - isArchived = false, name = "Vedette", - type = ControlUnitResourceType.BARGE, ), ), ) 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 9556293a8f..c2ce1730ee 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 @@ -6,16 +6,8 @@ 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.ActionTargetTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.mission.EnvActionControlEntity -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.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.entities.mission.* +import fr.gouv.cacem.monitorenv.domain.use_cases.missions.* import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.CreateOrUpdateMissionDataInput import org.hamcrest.Matchers.equalTo 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 0561ee36d9..258f4bd920 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 @@ -1,11 +1,9 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.repositories import fr.gouv.cacem.monitorenv.domain.entities.VehicleTypeEnum -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceType import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.entities.mission.* -import fr.gouv.cacem.monitorenv.domain.exceptions.ControlResourceOrUnitNotFoundException import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.catchThrowable @@ -14,6 +12,8 @@ import org.locationtech.jts.geom.MultiPoint import org.locationtech.jts.geom.MultiPolygon import org.locationtech.jts.io.WKTReader import org.springframework.beans.factory.annotation.Autowired +import org.springframework.dao.DataIntegrityViolationException +import org.springframework.dao.InvalidDataAccessApiUsageException import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Pageable import org.springframework.transaction.annotation.Transactional @@ -78,7 +78,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { isSafetyEquipmentAndStandardsComplianceControl = true, isSeafarersControl = true, - ), + ), EnvActionSurveillanceEntity( id = UUID.fromString("a6c4bd17-eb45-4504-ab15-7a18ea714a10"), facade = "Facade 2", @@ -97,13 +97,9 @@ class JpaMissionRepositoryITests : AbstractDBTests() { administration = "DDTM", isArchived = false, resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 8, - baseId = 3, - controlUnitId = 10004, - isArchived = false, name = "PAM Jeanne Barret", - type = ControlUnitResourceType.BARGE, ), ), ), @@ -121,7 +117,6 @@ class JpaMissionRepositoryITests : AbstractDBTests() { assertThat(newMissionCreated.mission.controlUnits.first().administration).isEqualTo("DDTM") assertThat(newMissionCreated.mission.controlUnits.first().resources).hasSize(1) assertThat(newMissionCreated.mission.controlUnits.first().resources.first().id).isEqualTo(8) - assertThat(newMissionCreated.mission.controlUnits.first().resources.first().baseId).isEqualTo(3) assertThat(newMissionCreated.mission.controlUnits.first().resources.first().name).isEqualTo("PAM Jeanne Barret") assertThat(newMissionCreated.mission.envActions).hasSize(3) assertThat(newMissionCreated.mission.envActions?.first()?.facade).isEqualTo("Facade 1") @@ -163,13 +158,9 @@ class JpaMissionRepositoryITests : AbstractDBTests() { administration = "DDTM", isArchived = false, resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 8, - baseId = 3, - controlUnitId = 10004, - isArchived = false, name = "PAM Jeanne Barret", - type = ControlUnitResourceType.BARGE, ), ), ), @@ -188,21 +179,13 @@ class JpaMissionRepositoryITests : AbstractDBTests() { administration = "DDTM", isArchived = false, resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 8, - baseId = 3, - controlUnitId = 5, - isArchived = false, name = "PAM Jeanne Barret", - type = ControlUnitResourceType.BARGE, ), - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 5, - baseId = 3, - controlUnitId = 5, - isArchived = false, name = "Voiture", - type = ControlUnitResourceType.BARGE, ), ), ), @@ -217,7 +200,6 @@ class JpaMissionRepositoryITests : AbstractDBTests() { assertThat(newMissionUpdated.mission.controlUnits.first().administration).isEqualTo("DDTM") assertThat(newMissionUpdated.mission.controlUnits.first().resources).hasSize(2) assertThat(newMissionUpdated.mission.controlUnits.first().resources.first().id).isEqualTo(8) - assertThat(newMissionUpdated.mission.controlUnits.first().resources.first().baseId).isEqualTo(3) assertThat(newMissionUpdated.mission.controlUnits.first().resources.first().name).isEqualTo("PAM Jeanne Barret") assertThat(newMissionUpdated.mission.controlUnits.first().resources.last().id).isEqualTo(5) assertThat(newMissionUpdated.mission.controlUnits.first().resources.last().name).isEqualTo("Voiture") @@ -242,13 +224,9 @@ class JpaMissionRepositoryITests : AbstractDBTests() { administration = "DDTM", isArchived = false, resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 123456, - baseId = 1, - controlUnitId = 5, - isArchived = false, name = "PAM Jeanne Barret", - type = ControlUnitResourceType.BARGE, ), ), ), @@ -262,8 +240,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { } // Then - assertThat(throwable).isInstanceOf(ControlResourceOrUnitNotFoundException::class.java) - assertThat(throwable.message).contains("Invalid control unit or resource id: not found in referential") + assertThat(throwable).isInstanceOf(InvalidDataAccessApiUsageException::class.java) } @Test @@ -296,8 +273,7 @@ class JpaMissionRepositoryITests : AbstractDBTests() { } // Then - assertThat(throwable).isInstanceOf(ControlResourceOrUnitNotFoundException::class.java) - assertThat(throwable.message).contains("Invalid control unit or resource id: not found in referential") + assertThat(throwable).isInstanceOf(DataIntegrityViolationException::class.java) } @Test @@ -532,29 +508,17 @@ class JpaMissionRepositoryITests : AbstractDBTests() { isArchived = false, name = "DML 2A", resources = listOf( - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 3, - baseId = 2, - controlUnitId = 10002, - isArchived = false, name = "Semi-rigide 1", - type = ControlUnitResourceType.BARGE, ), - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 4, - baseId = 2, - controlUnitId = 10002, - isArchived = false, name = "Semi-rigide 2", - type = ControlUnitResourceType.BARGE, ), - ControlUnitResourceEntity( + LegacyControlUnitResourceEntity( id = 5, - baseId = 3, - controlUnitId = 10002, - isArchived = false, name = "Voiture", - type = ControlUnitResourceType.CAR, ), ), ),