Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
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,
val isArchived: Boolean,
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
Expand All @@ -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
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fr.gouv.cacem.monitorenv.domain.entities.controlUnit

import java.util.Optional

data class PatchableControlUnitResourceEntity(
val radioFrequency: Optional<String>?,
val registrationId: Optional<String>?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand All @@ -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
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ControlUnitResourceEntity, PatchableControlUnitResourceEntity>,
) {
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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class PatchMission(
private val patchEntity: PatchEntity<MissionEntity, PatchableMissionEntity>,
private val missionWithEnvActionsValidator: MissionWithEnvActionsValidator,
) {
private val logger = LoggerFactory.getLogger(GetFullMissionWithFishAndRapportNavActions::class.java)
private val logger = LoggerFactory.getLogger(PatchMission::class.java)

fun execute(
id: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ data class ControlUnitResourceDataInput(
isArchived = false,
note = null,
photo = null,
radioFrequency = null,
registrationId = null,
stationId = null,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
) {
Expand All @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -14,17 +13,6 @@ data class LegacyControlUnitDataInput(
val resources: List<LegacyControlUnitResourceDataInput>,
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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -29,6 +22,8 @@ data class LegacyControlUnitResourceDataInput(
isArchived = false,
note = null,
photo = null,
radioFrequency = null,
registrationId = null,
// TODO: ???
stationId = 1,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String>?,
val registrationId: Optional<String>?,
) {
fun toControlUnitResourceEntity(): PatchableControlUnitResourceEntity =
PatchableControlUnitResourceEntity(radioFrequency = radioFrequency, registrationId = registrationId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
) {
Expand All @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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")
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(),
),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -39,16 +42,17 @@ 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,
@Column(name = "type", nullable = false, columnDefinition = "control_unit_resource_type")
@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,
Expand Down Expand Up @@ -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,
)
Expand All @@ -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 =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE control_unit_resources
ADD COLUMN registration_id VARCHAR,
ADD COLUMN radio_frequency VARCHAR;
Loading
Loading