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 880a63deb0..bcc59a5846 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 @@ -1,5 +1,7 @@ package fr.gouv.cacem.monitorenv.domain.entities.controlUnit +import fr.gouv.cacem.monitorenv.domain.entities.Patchable + data class ControlUnitResourceEntity( val id: Int? = null, val controlUnitId: Int, @@ -7,26 +9,28 @@ data class ControlUnitResourceEntity( val name: String, val note: String? = null, val photo: ByteArray? = null, + @Patchable + var radioFrequency: String?, + @Patchable + var registrationId: String?, val stationId: Int?, val type: ControlUnitResourceType, ) { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false + other as ControlUnitResourceEntity if (id != other.id) return false if (controlUnitId != other.controlUnitId) return false if (isArchived != other.isArchived) return false + if (stationId != other.stationId) return false if (name != other.name) return false if (note != other.note) return false - if (photo != null) { - if (other.photo == null) return false - if (!photo.contentEquals(other.photo)) return false - } else if (other.photo != null) { - return false - } - if (stationId != other.stationId) return false + if (!photo.contentEquals(other.photo)) return false + if (radioFrequency != other.radioFrequency) return false + if (registrationId != other.registrationId) return false if (type != other.type) return false return true @@ -36,12 +40,14 @@ data class ControlUnitResourceEntity( var result = id ?: 0 result = 31 * result + controlUnitId result = 31 * result + isArchived.hashCode() + result = 31 * result + stationId result = 31 * result + name.hashCode() result = 31 * result + (note?.hashCode() ?: 0) result = 31 * result + (photo?.contentHashCode() ?: 0) + result = 31 * result + (radioFrequency?.hashCode() ?: 0) + result = 31 * result + (registrationId?.hashCode() ?: 0) result = 31 * result + (stationId ?: 0) result = 31 * result + type.hashCode() - return result } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/PatchableControlUnitResourceEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/PatchableControlUnitResourceEntity.kt new file mode 100644 index 0000000000..e4063eb4e9 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/controlUnit/PatchableControlUnitResourceEntity.kt @@ -0,0 +1,8 @@ +package fr.gouv.cacem.monitorenv.domain.entities.controlUnit + +import java.util.Optional + +data class PatchableControlUnitResourceEntity( + val radioFrequency: Optional?, + val registrationId: Optional?, +) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResource.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResource.kt index a91afdd632..67164b5576 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResource.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResource.kt @@ -16,6 +16,9 @@ class CreateOrUpdateControlUnitResource( fun execute(controlUnitResource: ControlUnitResourceEntity): ControlUnitResourceEntity { try { logger.info("Attempt to CREATE or UPDATE control unit resource ${controlUnitResource.id}") + if (controlUnitResource.id != null) { + mergeExistingData(id = controlUnitResource.id, controlUnitResource = controlUnitResource) + } val controlUnitResourceEntity = controlUnitResourceRepository.save(controlUnitResource) logger.info("Control unit resource ${controlUnitResourceEntity.id} created or updated") @@ -27,4 +30,15 @@ class CreateOrUpdateControlUnitResource( throw BackendUsageException(BackendUsageErrorCode.ENTITY_NOT_SAVED, errorMessage) } } + + private fun mergeExistingData( + id: Int, + controlUnitResource: ControlUnitResourceEntity, + ): ControlUnitResourceEntity? = + controlUnitResourceRepository.findById(id)?.let { existingResource -> + controlUnitResource.apply { + radioFrequency = existingResource.controlUnitResource.radioFrequency + registrationId = existingResource.controlUnitResource.registrationId + } + } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResource.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResource.kt new file mode 100644 index 0000000000..034b4db22d --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResource.kt @@ -0,0 +1,35 @@ +package fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit + +import fr.gouv.cacem.monitorenv.config.UseCase +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.PatchableControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageErrorCode +import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException +import fr.gouv.cacem.monitorenv.domain.mappers.PatchEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IControlUnitResourceRepository +import org.slf4j.LoggerFactory + +@UseCase +class PatchControlUnitResource( + private val controlUnitRepository: IControlUnitResourceRepository, + private val patchEntity: PatchEntity, +) { + private val logger = LoggerFactory.getLogger(PatchControlUnitResource::class.java) + + fun execute( + id: Int, + patchableControlUnitResource: PatchableControlUnitResourceEntity, + ): ControlUnitResourceEntity { + logger.info("Attempt to PATCH control unit resource $id") + controlUnitRepository.findById(id)?.let { + val resourceToPatch = it.controlUnitResource + patchEntity.execute(resourceToPatch, patchableControlUnitResource) + val patchedControlUnitResource = controlUnitRepository.save(resourceToPatch) + logger.info("Control unit resource $id patched") + return patchedControlUnitResource + } + val errorMessage = "Control unit resource $id not found" + logger.error(errorMessage) + throw BackendUsageException(BackendUsageErrorCode.ENTITY_NOT_FOUND, errorMessage) + } +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/PatchMission.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/PatchMission.kt index a31c0568da..dfb9873669 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/PatchMission.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/missions/PatchMission.kt @@ -17,7 +17,7 @@ class PatchMission( private val patchEntity: PatchEntity, private val missionWithEnvActionsValidator: MissionWithEnvActionsValidator, ) { - private val logger = LoggerFactory.getLogger(GetFullMissionWithFishAndRapportNavActions::class.java) + private val logger = LoggerFactory.getLogger(PatchMission::class.java) fun execute( id: Int, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/controlUnits/ControlUnitResourceDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/controlUnits/ControlUnitResourceDataInput.kt index 9374623ca3..692701eeb4 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/controlUnits/ControlUnitResourceDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/controlUnits/ControlUnitResourceDataInput.kt @@ -18,6 +18,8 @@ data class ControlUnitResourceDataInput( isArchived = false, note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = null, ) } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/CreateOrUpdateControlUnitResourceDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/CreateOrUpdateControlUnitResourceDataInput.kt index 649ac2859a..fa067a4905 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/CreateOrUpdateControlUnitResourceDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/CreateOrUpdateControlUnitResourceDataInput.kt @@ -10,6 +10,8 @@ data class CreateOrUpdateControlUnitResourceDataInput( val name: String, val note: String? = null, val photo: ByteArray? = null, + val radioFrequency: String?, + val registrationId: String?, val stationId: Int, val type: ControlUnitResourceType, ) { @@ -21,6 +23,8 @@ data class CreateOrUpdateControlUnitResourceDataInput( name = this.name, note = this.note, photo = this.photo, + radioFrequency = this.radioFrequency, + registrationId = this.registrationId, stationId = this.stationId, type = this.type, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitDataInput.kt index e5b015cab0..94d2f3d251 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitDataInput.kt @@ -1,7 +1,6 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitEntity -import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity data class LegacyControlUnitDataInput( val id: Int, @@ -14,17 +13,6 @@ data class LegacyControlUnitDataInput( val resources: List, val contact: String? = null, ) { - @Deprecated(message = "TO REMOVE", level = DeprecationLevel.ERROR) - fun toLegacyControlUnit() = - LegacyControlUnitEntity( - id = id, - administration = administration, - isArchived = isArchived, - name = name, - resources = resources.map { it.toLegacyControlUnitResource() }, - contact = contact, - ) - fun toControlUnitEntity() = ControlUnitEntity( id = id, diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitResourceDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitResourceDataInput.kt index 0c7f2f634a..44e6bc4ba1 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitResourceDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/LegacyControlUnitResourceDataInput.kt @@ -2,7 +2,6 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.co 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 data class LegacyControlUnitResourceDataInput( val id: Int, @@ -11,15 +10,9 @@ data class LegacyControlUnitResourceDataInput( val name: String, // TODO(16/06/2026): to remove ? useless as input since this obj is only used to map mission <-> control unit val type: ControlUnitResourceType, + val radioFrequency: String?, + val registrationId: String?, ) { - fun toLegacyControlUnitResource() = - LegacyControlUnitResourceEntity( - id = id, - controlUnitId = controlUnitId, - name = name, - type = type, - ) - fun toControlUnitResource() = ControlUnitResourceEntity( id = id, @@ -29,6 +22,8 @@ data class LegacyControlUnitResourceDataInput( isArchived = false, note = null, photo = null, + radioFrequency = null, + registrationId = null, // TODO: ??? stationId = 1, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/PatchableControlUnitResourceDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/PatchableControlUnitResourceDataInput.kt new file mode 100644 index 0000000000..9d113ae1de --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/inputs/controlUnits/PatchableControlUnitResourceDataInput.kt @@ -0,0 +1,12 @@ +package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits + +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.PatchableControlUnitResourceEntity +import java.util.Optional + +data class PatchableControlUnitResourceDataInput( + val radioFrequency: Optional?, + val registrationId: Optional?, +) { + fun toControlUnitResourceEntity(): PatchableControlUnitResourceEntity = + PatchableControlUnitResourceEntity(radioFrequency = radioFrequency, registrationId = registrationId) +} diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/controlUnits/ControlUnitResourceDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/controlUnits/ControlUnitResourceDataOutput.kt index cd4ab97673..e9c95695e3 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/controlUnits/ControlUnitResourceDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/publicapi/outputs/controlUnits/ControlUnitResourceDataOutput.kt @@ -9,6 +9,8 @@ data class ControlUnitResourceDataOutput( val name: String, val note: String? = null, val photo: ByteArray? = null, + val radioFrequency: String?, + val registrationId: String?, val stationId: Int?, val type: String, ) { @@ -21,6 +23,8 @@ data class ControlUnitResourceDataOutput( name = controlUnitResource.name, note = controlUnitResource.note, photo = controlUnitResource.photo, + radioFrequency = controlUnitResource.radioFrequency, + registrationId = controlUnitResource.registrationId, stationId = controlUnitResource.stationId, type = controlUnitResource.type.name, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v1/ControlUnitResources.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v1/ControlUnitResources.kt index c7ba884e50..3703b161b7 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v1/ControlUnitResources.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v1/ControlUnitResources.kt @@ -6,7 +6,9 @@ import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.CreateOrUpdateContr import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.DeleteControlUnitResource import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.GetControlUnitResourceById import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.GetControlUnitResources +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.PatchControlUnitResource import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits.CreateOrUpdateControlUnitResourceDataInput +import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits.PatchableControlUnitResourceDataInput import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.outputs.BooleanDataOutput import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.outputs.controlUnits.ControlUnitResourceDataOutput import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.outputs.controlUnits.FullControlUnitResourceDataOutput @@ -16,6 +18,7 @@ import jakarta.websocket.server.PathParam import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PatchMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping @@ -34,6 +37,7 @@ class ControlUnitResources( private val deleteControlUnitResource: DeleteControlUnitResource, private val getControlUnitResources: GetControlUnitResources, private val getControlUnitResourceById: GetControlUnitResourceById, + private val patchControlUnitResource: PatchControlUnitResource, ) { @PutMapping("/{controlUnitResourceId}/archive") @Operation(summary = "Archive a control unit resource") @@ -69,8 +73,7 @@ class ControlUnitResources( @DeleteMapping("/{controlUnitResourceId}") @Operation(summary = "Delete a control unit resource") fun delete( - @PathParam("Control unit resource ID") - @PathVariable(name = "controlUnitResourceId") + @PathVariable @PathParam("Control unit resource ID") controlUnitResourceId: Int, ) { deleteControlUnitResource.execute(controlUnitResourceId) @@ -114,4 +117,21 @@ class ControlUnitResources( return ControlUnitResourceDataOutput.fromControlUnitResource(updatedControlUnitResource) } + + @PatchMapping(value = ["/{controlUnitResourceId}"]) + @Operation( + summary = "Patch an existing controlUnitResource", + description = "Retrieve the controlUnitResource with given id and patch it with input data", + ) + fun patch( + @PathVariable(name = "controlUnitResourceId") + id: Int, + @RequestBody patchableControlUnitResourceDataInput: PatchableControlUnitResourceDataInput, + ): ControlUnitResourceDataOutput = + ControlUnitResourceDataOutput.fromControlUnitResource( + patchControlUnitResource.execute( + id, + patchableControlUnitResourceDataInput.toControlUnitResourceEntity(), + ), + ) } 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 7496892a50..0605dfca75 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 @@ -28,6 +28,9 @@ data class ControlUnitResourceModel( @Column(name = "id", nullable = false, unique = true) @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Int? = null, + @Column(name = "created_at_utc", nullable = false, updatable = false) + @CreationTimestamp + val createdAtUtc: Instant? = null, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "control_unit_id", nullable = false) val controlUnit: ControlUnitModel, @@ -39,6 +42,10 @@ data class ControlUnitResourceModel( val note: String? = null, @Column(name = "photo") val photo: ByteArray? = null, + @Column + val radioFrequency: String?, + @Column + val registrationId: String?, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "base_id", nullable = false) val station: StationModel, @@ -46,9 +53,6 @@ data class ControlUnitResourceModel( @Enumerated(EnumType.STRING) @JdbcType(PostgreSQLEnumJdbcType::class) val type: ControlUnitResourceType, - @Column(name = "created_at_utc", nullable = false, updatable = false) - @CreationTimestamp - val createdAtUtc: Instant? = null, @Column(name = "updated_at_utc", nullable = false) @UpdateTimestamp val updatedAtUtc: Instant? = null, @@ -91,6 +95,8 @@ data class ControlUnitResourceModel( name = controlUnitResource.name, note = controlUnitResource.note, photo = controlUnitResource.photo, + radioFrequency = controlUnitResource.radioFrequency, + registrationId = controlUnitResource.registrationId, station = stationModel, type = controlUnitResource.type, ) @@ -113,14 +119,16 @@ data class ControlUnitResourceModel( fun toControlUnitResource(): ControlUnitResourceEntity = ControlUnitResourceEntity( - id, + id = id, controlUnitId = requireNotNull(controlUnit.id), - isArchived, - name, - note, - photo, + isArchived = isArchived, + name = name, + note = note, + photo = photo, + radioFrequency = radioFrequency, + registrationId = registrationId, stationId = requireNotNull(station.id), - type, + type = type, ) fun toFullControlUnitResource(): FullControlUnitResourceDTO = 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 5ec77e82f2..c5ad00dbeb 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 @@ -56,6 +56,15 @@ class JpaControlUnitResourceRepository( ) } val stationModel = dbStationRepository.getReferenceById(controlUnitResource.stationId) + if (controlUnitResource.id != null && + (controlUnitResource.radioFrequency.isNullOrEmpty() || controlUnitResource.registrationId.isNullOrEmpty()) + ) { + val existingResource = dbControlUnitResourceRepository.findByIdOrNull(controlUnitResource.id) + existingResource?.let { + controlUnitResource.registrationId = existingResource.registrationId + controlUnitResource.radioFrequency = existingResource.radioFrequency + } + } val controlUnitResourceModel = ControlUnitResourceModel.fromControlUnitResource( controlUnitResource, diff --git a/backend/src/main/resources/db/migration/internal/V0.228__add_control_unit_resources_registrationid_and_radiofrequency.sql b/backend/src/main/resources/db/migration/internal/V0.228__add_control_unit_resources_registrationid_and_radiofrequency.sql new file mode 100644 index 0000000000..bc35bb5d2d --- /dev/null +++ b/backend/src/main/resources/db/migration/internal/V0.228__add_control_unit_resources_registrationid_and_radiofrequency.sql @@ -0,0 +1,3 @@ +ALTER TABLE control_unit_resources + ADD COLUMN registration_id VARCHAR, + ADD COLUMN radio_frequency VARCHAR; diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/mappers/PatchControlUnitResourceEntityUTest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/mappers/PatchControlUnitResourceEntityUTest.kt new file mode 100644 index 0000000000..2c464681df --- /dev/null +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/mappers/PatchControlUnitResourceEntityUTest.kt @@ -0,0 +1,116 @@ +package fr.gouv.cacem.monitorenv.domain.mappers + +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.PatchableControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures.ControlUnitResourceFixture.Companion.aControlUnitResource +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.util.Optional + +class PatchControlUnitResourceEntityUTest { + private val patchEntity: PatchEntity = PatchEntity() + + @Test + fun `execute() should return controlUnitResource with radioFrequency modified if its present`() { + // Given + val radioFrequency = "radioFrequency" + val controlUnitResource = aControlUnitResource() + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = Optional.of(radioFrequency), + registrationId = null, + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.radioFrequency).isEqualTo(radioFrequency) + } + + @Test + fun `execute() should return controlUnitResource with radioFrequency null if its empty`() { + // Given + val controlUnitResource = aControlUnitResource() + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = Optional.empty(), + registrationId = null, + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.radioFrequency).isNull() + } + + @Test + fun `execute() should return controlUnitResource with old radioFrequency if its null`() { + // Given + val controlUnitResource = aControlUnitResource(radioFrequency = "old radio frequency") + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = null, + registrationId = null, + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.radioFrequency).isEqualTo("old radio frequency") + } + + @Test + fun `execute() should return controlUnitResource with registrationId modified if its present`() { + // Given + val registrationId = "registrationId" + val controlUnitResource = aControlUnitResource() + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = null, + registrationId = Optional.of(registrationId), + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.registrationId).isEqualTo(registrationId) + } + + @Test + fun `execute() should return controlUnitResource with registrationId null if its empty`() { + // Given + val controlUnitResource = aControlUnitResource() + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = null, + registrationId = Optional.empty(), + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.registrationId).isNull() + } + + @Test + fun `execute() should return controlUnitResource with old registrationId if its null`() { + // Given + val controlUnitResource = aControlUnitResource(registrationId = "old registrationId") + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = null, + registrationId = null, + ) + + // When + patchEntity.execute(controlUnitResource, patchableControlUnitResource) + + // Then + assertThat(controlUnitResource.registrationId).isEqualTo("old registrationId") + } +} diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResourceUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResourceUTests.kt index 5d4c633f13..47298844f4 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResourceUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/CreateOrUpdateControlUnitResourceUTests.kt @@ -1,11 +1,13 @@ package fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit +import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.given import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceType import fr.gouv.cacem.monitorenv.domain.repositories.IControlUnitResourceRepository +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures.ControlUnitResourceFixture.Companion.aFullControlUnitResourcesDTO import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -32,6 +34,8 @@ class CreateOrUpdateControlUnitResourceUTests { photo = null, stationId = 2, type = ControlUnitResourceType.BARGE, + radioFrequency = null, + registrationId = null, ) val expectedControlUnitResource = newControlUnitResource.copy(id = 0) @@ -45,4 +49,82 @@ class CreateOrUpdateControlUnitResourceUTests { assertThat(log.out).contains("Attempt to CREATE or UPDATE control unit resource ${newControlUnitResource.id}") assertThat(log.out).contains("Control unit resource ${result.id} created or updated") } + + @Test + fun `execute should merge external information before saving it`(log: CapturedOutput) { + val newControlUnitResource = + ControlUnitResourceEntity( + id = 10, + controlUnitId = 3, + isArchived = false, + name = "Control Unit Resource Name", + note = null, + photo = null, + stationId = 2, + type = ControlUnitResourceType.BARGE, + radioFrequency = null, + registrationId = null, + ) + + val expectedControlUnitResource = newControlUnitResource.copy(id = 0) + + val existingControlUnitResource = aFullControlUnitResourcesDTO() + given(controlUnitResourceRepository.findById(newControlUnitResource.id!!)).willReturn( + existingControlUnitResource, + ) + given( + controlUnitResourceRepository.save( + newControlUnitResource.apply { + radioFrequency = expectedControlUnitResource.radioFrequency + registrationId = existingControlUnitResource.controlUnitResource.registrationId + }, + ), + ).willReturn(expectedControlUnitResource) + + val result = CreateOrUpdateControlUnitResource(controlUnitResourceRepository).execute(newControlUnitResource) + + verify(controlUnitResourceRepository, times(1)).findById(newControlUnitResource.id) + verify(controlUnitResourceRepository, times(1)).save(newControlUnitResource) + assertThat(result).isEqualTo(expectedControlUnitResource) + assertThat(log.out).contains("Attempt to CREATE or UPDATE control unit resource ${newControlUnitResource.id}") + assertThat(log.out).contains("Control unit resource ${result.id} created or updated") + } + + @Test + fun `execute should not merge external information when it is creation before saving it`(log: CapturedOutput) { + val newControlUnitResource = + ControlUnitResourceEntity( + id = null, + controlUnitId = 3, + isArchived = false, + name = "Control Unit Resource Name", + note = null, + photo = null, + stationId = 2, + type = ControlUnitResourceType.BARGE, + radioFrequency = null, + registrationId = null, + ) + + val expectedControlUnitResource = newControlUnitResource.copy(id = 0) + + val existingControlUnitResource = aFullControlUnitResourcesDTO() + + given( + controlUnitResourceRepository.save( + newControlUnitResource.apply { + radioFrequency = expectedControlUnitResource.radioFrequency + registrationId = existingControlUnitResource.controlUnitResource.registrationId + }, + ), + ).willReturn(expectedControlUnitResource) + + val result = CreateOrUpdateControlUnitResource(controlUnitResourceRepository).execute(newControlUnitResource) + + verify(controlUnitResourceRepository, times(0)).findById(any()) + verify(controlUnitResourceRepository, times(1)).save(newControlUnitResource) + assertThat(result).isEqualTo(expectedControlUnitResource) + assertThat(log.out).contains("Attempt to CREATE or UPDATE control unit resource ${newControlUnitResource.id}") + assertThat(log.out).contains("Control unit resource ${result.id} created or updated") + } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResourceUTest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResourceUTest.kt new file mode 100644 index 0000000000..fef281ee1d --- /dev/null +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/PatchControlUnitResourceUTest.kt @@ -0,0 +1,73 @@ +package fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit + +import com.nhaarman.mockitokotlin2.given +import com.nhaarman.mockitokotlin2.mock +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.ControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.PatchableControlUnitResourceEntity +import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException +import fr.gouv.cacem.monitorenv.domain.mappers.PatchEntity +import fr.gouv.cacem.monitorenv.domain.repositories.IControlUnitResourceRepository +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures.ControlUnitResourceFixture.Companion.aControlUnitResource +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures.ControlUnitResourceFixture.Companion.aFullControlUnitResourcesDTO +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.boot.test.system.CapturedOutput +import org.springframework.boot.test.system.OutputCaptureExtension +import java.util.Optional +import kotlin.random.Random + +@ExtendWith(OutputCaptureExtension::class) +class PatchControlUnitResourceUTest { + private val controlUnitRepository: IControlUnitResourceRepository = mock() + val patchEntity: PatchEntity = PatchEntity() + private val patchControlUnitResource = PatchControlUnitResource(controlUnitRepository, patchEntity) + + @Test + fun `execute() should return the patched entity`(log: CapturedOutput) { + // Given + val id = Random.nextInt() + val radioFrequency = "RadioFrequency" + val registrationId = "registrationId" + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = Optional.of(radioFrequency), + registrationId = Optional.of(registrationId), + ) + val controlUnitFromDatabase = aFullControlUnitResourcesDTO() + val controlUnitResourcePatched = + aControlUnitResource().copy(radioFrequency = radioFrequency, registrationId = registrationId) + + given(controlUnitRepository.findById(id)).willReturn(controlUnitFromDatabase) + given(controlUnitRepository.save(controlUnitResourcePatched)).willReturn(controlUnitResourcePatched) + + // When + val savedControlUnitResource = patchControlUnitResource.execute(id, patchableControlUnitResource) + + // Then + assertThat(savedControlUnitResource.radioFrequency).isEqualTo(controlUnitResourcePatched.radioFrequency) + assertThat(savedControlUnitResource.registrationId).isEqualTo(controlUnitResourcePatched.registrationId) + assertThat(log.out).contains("Attempt to PATCH control unit resource $id") + assertThat(log.out).contains("Control unit resource $id patched") + } + + @Test + fun `execute() should throw BackendUsageException with message when the entity does not exist`() { + // Given + val id = Random.nextInt() + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + radioFrequency = null, + registrationId = null, + ) + + given(controlUnitRepository.findById(id)).willReturn(null) + + // When & Then + val exception = + assertThrows { patchControlUnitResource.execute(id, patchableControlUnitResource) } + + assertThat(exception.message).isEqualTo("Control unit resource $id not found") + } +} diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/fixtures/ControlUnitResourceFixture.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/fixtures/ControlUnitResourceFixture.kt index 42dd245c00..94d0ac40af 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/fixtures/ControlUnitResourceFixture.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/controlUnit/fixtures/ControlUnitResourceFixture.kt @@ -2,26 +2,32 @@ package fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures 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 fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.fixtures.ControlUnitFixture.Companion.aControlUnit +import fr.gouv.cacem.monitorenv.domain.use_cases.station.fixtures.StationFixture.Companion.aStationEntity class ControlUnitResourceFixture { companion object { - fun aLegacyControlUnitResource(): LegacyControlUnitResourceEntity = - LegacyControlUnitResourceEntity( - id = 1, - controlUnitId = 0, - name = "Control Unit Contact Name", - type = ControlUnitResourceType.PATROL_BOAT, - ) - - fun aControlUnitResource(): ControlUnitResourceEntity = + fun aControlUnitResource( + radioFrequency: String? = "radio", + registrationId: String? = "12345E", + ): ControlUnitResourceEntity = ControlUnitResourceEntity( id = 1, controlUnitId = 0, isArchived = false, name = "Control Unit Contact Name", type = ControlUnitResourceType.PATROL_BOAT, + radioFrequency = radioFrequency, + registrationId = registrationId, stationId = 1, ) + + fun aFullControlUnitResourcesDTO(): FullControlUnitResourceDTO = + FullControlUnitResourceDTO( + controlUnit = aControlUnit(), + controlUnitResource = aControlUnitResource(), + station = aStationEntity(), + ) } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/station/CanDeleteStationUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/station/CanDeleteStationUTests.kt index 3c602ee630..84197451de 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/station/CanDeleteStationUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/station/CanDeleteStationUTests.kt @@ -70,6 +70,8 @@ class CanDeleteStationUTests { name = "Control Unit Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ), diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/MissionsITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/MissionsITests.kt index ce13e139a5..80f873c35b 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/MissionsITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/MissionsITests.kt @@ -275,6 +275,8 @@ class MissionsITests { type = ControlUnitResourceType.FAST_BOAT, stationId = 1, isArchived = false, + radioFrequency = null, + registrationId = null, ), ), completedBy = "CompletedBy", @@ -503,6 +505,8 @@ class MissionsITests { type = ControlUnitResourceType.FAST_BOAT, stationId = 1, isArchived = false, + radioFrequency = null, + registrationId = null, ), ), completedBy = "CompletedBy", diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ControlUnitResourcesITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ControlUnitResourcesITests.kt index ed84bfaa9e..5a8a434250 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ControlUnitResourcesITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/ControlUnitResourcesITests.kt @@ -6,6 +6,7 @@ import fr.gouv.cacem.monitorenv.config.SentryConfig 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.ControlUnitResourceType +import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.PatchableControlUnitResourceEntity import fr.gouv.cacem.monitorenv.domain.entities.station.StationEntity import fr.gouv.cacem.monitorenv.domain.use_cases.administration.fixtures.AdministrationFixture.Companion.anAdministration import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.ArchiveControlUnitResource @@ -14,8 +15,10 @@ import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.CreateOrUpdateContr import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.DeleteControlUnitResource import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.GetControlUnitResourceById import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.GetControlUnitResources +import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.PatchControlUnitResource import fr.gouv.cacem.monitorenv.domain.use_cases.controlUnit.dtos.FullControlUnitResourceDTO import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits.CreateOrUpdateControlUnitResourceDataInput +import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.controlUnits.PatchableControlUnitResourceDataInput import fr.gouv.cacem.monitorenv.infrastructure.api.endpoints.publicapi.v1.ControlUnitResources import org.hamcrest.Matchers import org.junit.jupiter.api.Test @@ -31,12 +34,14 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put import org.springframework.test.web.servlet.result.MockMvcResultHandlers import org.springframework.test.web.servlet.result.MockMvcResultMatchers import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import tools.jackson.databind.json.JsonMapper +import java.util.Optional @Import(SentryConfig::class, MapperConfiguration::class) @AutoConfigureMockMvc(addFilters = false) @@ -63,6 +68,9 @@ class ControlUnitResourcesITests { @MockitoBean private val getControlUnitResources: GetControlUnitResources = mock() + @MockitoBean + private val patchControlUnitResource: PatchControlUnitResource = mock() + @Autowired private lateinit var jsonMapper: JsonMapper @@ -102,6 +110,8 @@ class ControlUnitResourcesITests { name = "Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ) @@ -113,6 +123,8 @@ class ControlUnitResourcesITests { name = "Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ) @@ -166,6 +178,8 @@ class ControlUnitResourcesITests { name = "Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ), @@ -213,6 +227,8 @@ class ControlUnitResourcesITests { name = "Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ), @@ -244,6 +260,8 @@ class ControlUnitResourcesITests { name = "Resource Name 2", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ), @@ -277,6 +295,8 @@ class ControlUnitResourcesITests { name = "Updated Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ) @@ -289,6 +309,8 @@ class ControlUnitResourcesITests { name = "Updated Resource Name", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 0, type = ControlUnitResourceType.BARGE, ) @@ -306,4 +328,51 @@ class ControlUnitResourcesITests { ).andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk) } + + @Test + fun `patch should patch a control unit resource given its id`() { + val id = 1 + val expectedUpdatedControlUnitResource = + ControlUnitResourceEntity( + id = id, + controlUnitId = 0, + isArchived = false, + name = "Updated Resource Name", + note = null, + photo = null, + radioFrequency = null, + registrationId = null, + stationId = 0, + type = ControlUnitResourceType.BARGE, + ) + + val patchableControlUnitResourceInput = + PatchableControlUnitResourceDataInput( + registrationId = Optional.of("registrationId"), + radioFrequency = Optional.of("radioFrequency"), + ) + val patchableControlUnitResource = + PatchableControlUnitResourceEntity( + registrationId = Optional.of("registrationId"), + radioFrequency = Optional.of("radioFrequency"), + ) + val requestBody = jsonMapper.writeValueAsString(patchableControlUnitResourceInput) + + given( + patchControlUnitResource.execute( + id = id, + patchableControlUnitResource = patchableControlUnitResource, + ), + ).willReturn( + expectedUpdatedControlUnitResource, + ) + + mockMvc + .perform( + patch("/api/v1/control_unit_resources/$id") + .content(requestBody) + .contentType(MediaType.APPLICATION_JSON), + ).andDo(MockMvcResultHandlers.print()) + .andExpect(status().isOk) + } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v2/MissionsITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v2/MissionsITests.kt index 460981c409..060a2241b9 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v2/MissionsITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/publicapi/v2/MissionsITests.kt @@ -93,6 +93,8 @@ class MissionsITest { controlUnitId = 2, name = "Vedette", type = ControlUnitResourceType.FAST_BOAT, + radioFrequency = null, + registrationId = null, ), ), ), @@ -117,6 +119,8 @@ class MissionsITest { type = ControlUnitResourceType.FAST_BOAT, stationId = 1, isArchived = false, + radioFrequency = null, + registrationId = null, ), ) val isUnderJdp = false diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitRepositoryITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitRepositoryITests.kt index 7bfd6d0693..7ce799196d 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitRepositoryITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitRepositoryITests.kt @@ -117,6 +117,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .BARGE, @@ -157,6 +159,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "Semi-rigide 2", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .BARGE, @@ -197,6 +201,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { note = null, photo = null, stationId = 1, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .CAR, @@ -237,6 +243,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { note = null, photo = null, stationId = 2, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .DRONE, @@ -308,6 +316,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "PAM Jeanne Barret", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .FRIGATE, @@ -401,6 +411,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .BARGE, @@ -441,6 +453,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "Semi-rigide 2", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .BARGE, @@ -474,6 +488,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { note = null, photo = null, stationId = 1, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType .CAR, @@ -513,6 +529,8 @@ class JpaControlUnitRepositoryITests : AbstractDBTests() { name = "Drone", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 2, type = ControlUnitResourceType diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepositoryITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepositoryITests.kt index a92dc89505..8828644f99 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepositoryITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaControlUnitResourceRepositoryITests.kt @@ -68,6 +68,8 @@ class JpaControlUnitResourceRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ), @@ -102,6 +104,8 @@ class JpaControlUnitResourceRepositoryITests : AbstractDBTests() { name = "ARIOLA", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ), @@ -142,6 +146,8 @@ class JpaControlUnitResourceRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ), @@ -162,6 +168,8 @@ class JpaControlUnitResourceRepositoryITests : AbstractDBTests() { name = "Resource Name", note = "Resource Note", photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ) @@ -181,6 +189,8 @@ class JpaControlUnitResourceRepositoryITests : AbstractDBTests() { name = "Updated Resource Name", note = "Updated Resource Note", photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ) 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 040394df2a..ced3e55963 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 @@ -512,6 +512,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { isArchived = false, // TODO: find out why did I had to change type (iso-test-data) type = ControlUnitResourceType.BARGE, + radioFrequency = null, + registrationId = null, stationId = 2, ), ControlUnitResourceEntity( @@ -523,6 +525,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { // TODO: find out why did I had to change type (iso-test-data) type = ControlUnitResourceType.BARGE, isArchived = false, + radioFrequency = null, + registrationId = null, stationId = 2, ), ControlUnitResourceEntity( @@ -531,6 +535,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { name = "Voiture", isArchived = false, type = ControlUnitResourceType.CAR, + radioFrequency = null, + registrationId = null, stationId = 3, ), ), @@ -692,6 +698,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { controlUnitId = 10121, isArchived = false, name = "PAM Jeanne Barret", + radioFrequency = null, + registrationId = null, stationId = 2, type = ControlUnitResourceType.PATROL_BOAT, ), @@ -822,6 +830,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { controlUnitId = 10004, name = "PAM Jeanne Barret", type = ControlUnitResourceType.PATROL_BOAT, + radioFrequency = null, + registrationId = null, stationId = 1, isArchived = false, ), @@ -861,6 +871,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { controlUnitId = 10002, name = "Semi-rigide 1", type = ControlUnitResourceType.SEMI_RIGID, + radioFrequency = null, + registrationId = null, stationId = 1, isArchived = false, ), @@ -869,6 +881,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { controlUnitId = 10002, name = "Voiture", type = ControlUnitResourceType.CAR, + radioFrequency = null, + registrationId = null, stationId = 1, isArchived = false, ), @@ -1017,6 +1031,8 @@ class JpaMissionRepositoryITests : AbstractDBTests() { controlUnitId = 5, name = "PAM Jeanne Barret", type = ControlUnitResourceType.PATROL_BOAT, + radioFrequency = null, + registrationId = null, stationId = 1, isArchived = false, ), diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaStationRepositoryITests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaStationRepositoryITests.kt index 478f21dce0..f434f9b598 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaStationRepositoryITests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaStationRepositoryITests.kt @@ -38,6 +38,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ControlUnitResourceEntity( @@ -48,6 +50,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Semi-rigide 2", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ControlUnitResourceEntity( @@ -57,6 +61,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Voiture", note = null, photo = null, + radioFrequency = null, + registrationId = null, stationId = 1, type = ControlUnitResourceType.CAR, ), @@ -83,6 +89,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Voiture", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.CAR, ), ControlUnitResourceEntity( @@ -93,6 +101,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Semi-rigide", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ControlUnitResourceEntity( @@ -103,6 +113,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "PAM Jeanne Barret", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ControlUnitResourceEntity( @@ -113,6 +125,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "PAM Themis", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ControlUnitResourceEntity( @@ -123,6 +137,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "ALTAIR", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ControlUnitResourceEntity( @@ -133,6 +149,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "PHEROUSA", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ControlUnitResourceEntity( @@ -143,6 +161,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "ARIOLA", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ), @@ -174,6 +194,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Semi-rigide 1", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ControlUnitResourceEntity( @@ -184,6 +206,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "Semi-rigide 2", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.BARGE, ), ControlUnitResourceEntity( @@ -194,6 +218,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { name = "AR VECHEN", note = null, photo = null, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.FRIGATE, ), ControlUnitResourceEntity( @@ -204,6 +230,8 @@ class JpaStationRepositoryITests : AbstractDBTests() { note = null, photo = null, stationId = 2, + radioFrequency = null, + registrationId = null, type = ControlUnitResourceType.DRONE, ), ),