Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backoffice - Correction d'erreurs dans le formulaire d'édition des segments #4052

Merged
merged 3 commits into from
Jan 28, 2025
Merged
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
Expand Up @@ -19,6 +19,9 @@ enum class BackendUsageErrorCode {
/** Thrown when a resource is expected to exist but doesn't. */
NOT_FOUND,

/** Thrown when a resource could not be updated. */
COULD_NOT_UPDATE,

/** Thrown when a resource does not found, but it may happen. */
NOT_FOUND_BUT_OK,
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ package fr.gouv.cnsp.monitorfish.domain.exceptions
open class BackendUsageException(
val code: BackendUsageErrorCode,
final override val message: String? = null,
final override val cause: Throwable? = null,
val data: Any? = null,
) : Throwable(code.name)
) : Throwable(code.name, cause)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.gouv.cnsp.monitorfish.domain.exceptions

@Deprecated("Use BackendUsageException with COULD_NOT_UPDATE code")
class CouldNotUpdateBeaconMalfunctionException(
message: String,
cause: Throwable? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.gouv.cnsp.monitorfish.domain.exceptions

@Deprecated("Use BackendUsageException with COULD_NOT_UPDATE code")
class CouldNotUpdateControlObjectiveException(
message: String,
cause: Throwable? = null,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package fr.gouv.cnsp.monitorfish.domain.repositories

import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.use_cases.dtos.CreateOrUpdateFleetSegmentFields

interface FleetSegmentRepository {
// For test purpose
Expand All @@ -11,8 +10,7 @@ interface FleetSegmentRepository {

fun update(
segment: String,
fields: CreateOrUpdateFleetSegmentFields,
year: Int,
updatedSegment: FleetSegment,
): FleetSegment

fun delete(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,10 @@ package fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment
import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.repositories.FleetSegmentRepository
import fr.gouv.cnsp.monitorfish.domain.use_cases.dtos.CreateOrUpdateFleetSegmentFields

@UseCase
class CreateFleetSegment(
private val fleetSegmentRepository: FleetSegmentRepository,
) {
fun execute(fields: CreateOrUpdateFleetSegmentFields): FleetSegment {
require(fields.segment != null) {
"`segment` must be provided"
}

require(fields.year != null) {
"`year` must be provided"
}

require(fields.priority != null) {
"`priority` must be provided"
}

require(fields.vesselTypes != null) {
"`vesselTypes` must be provided"
}

val newSegment =
fields.let {
FleetSegment(
segment = it.segment!!,
segmentName = it.segmentName ?: "",
gears = it.gears ?: listOf(),
faoAreas = it.faoAreas ?: listOf(),
targetSpecies = it.targetSpecies ?: listOf(),
impactRiskFactor = it.impactRiskFactor ?: 0.0,
year = it.year!!,
mainScipSpeciesType = fields.mainScipSpeciesType,
maxMesh = fields.maxMesh,
minMesh = fields.minMesh,
minShareOfTargetSpecies = fields.minShareOfTargetSpecies,
priority = fields.priority,
vesselTypes = fields.vesselTypes,
)
}

return fleetSegmentRepository.save(newSegment)
}
fun execute(newSegment: FleetSegment): FleetSegment = fleetSegmentRepository.save(newSegment)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,16 @@ package fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment

import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.exceptions.CouldNotUpdateFleetSegmentException
import fr.gouv.cnsp.monitorfish.domain.exceptions.BackendUsageException
import fr.gouv.cnsp.monitorfish.domain.repositories.FleetSegmentRepository
import fr.gouv.cnsp.monitorfish.domain.use_cases.dtos.CreateOrUpdateFleetSegmentFields

@UseCase
class UpdateFleetSegment(
private val fleetSegmentRepository: FleetSegmentRepository,
) {
@Throws(CouldNotUpdateFleetSegmentException::class, IllegalArgumentException::class)
@Throws(BackendUsageException::class, IllegalArgumentException::class)
fun execute(
segment: String,
fields: CreateOrUpdateFleetSegmentFields,
year: Int,
): FleetSegment {
require(
fields.segment != null ||
fields.segmentName != null ||
fields.faoAreas != null ||
fields.gears != null ||
fields.impactRiskFactor != null ||
fields.targetSpecies != null,
) {
"No value to update"
}

return fleetSegmentRepository.update(segment, fields, year)
}
updatedSegment: FleetSegment,
): FleetSegment = fleetSegmentRepository.update(segment, updatedSegment)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ class PatchMissionAction(

missionActionsRepository.save(updatedMissionAction)
} catch (e: Exception) {
throw BackendUsageException(BackendUsageErrorCode.NOT_FOUND, "Action $id not found", e)
throw BackendUsageException(BackendUsageErrorCode.NOT_FOUND, message = "Action $id not found", cause = e)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ class GetVesselVoyage(
} catch (e: IllegalArgumentException) {
throw BackendUsageException(
BackendUsageErrorCode.NOT_FOUND_BUT_OK,
"Could not fetch voyage for request \"${voyageRequest}\"",
e,
message = "Could not fetch voyage for request \"${voyageRequest}\"",
cause = e,
)
} catch (e: NoLogbookFishingTripFound) {
throw BackendUsageException(
BackendUsageErrorCode.NOT_FOUND_BUT_OK,
"Could not fetch voyage for request \"${voyageRequest}\"",
e,
message = "Could not fetch voyage for request \"${voyageRequest}\"",
cause = e,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,18 +82,6 @@ class ControllersExceptionHandler(
return ApiError(IllegalArgumentException(e.message.toString(), e))
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(CouldNotUpdateFleetSegmentException::class)
fun handleCouldNotUpdateFleetSegmentException(e: Exception): ApiError {
logger.error(e.message, e.cause)

if (sentryConfig.enabled == true) {
Sentry.captureException(e)
}

return ApiError(e)
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MissingServletRequestParameterException::class)
fun handleNoParameter(e: MissingServletRequestParameterException): MissingParameterApiError {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@ class FleetSegmentAdminController(
@PutMapping(value = [""], consumes = ["application/json"])
@Operation(summary = "Update a fleet segment")
fun updateFleetSegment(
@Parameter(description = "Year")
@RequestParam(name = "year")
year: Int,
@Parameter(description = "Segment")
@RequestParam(name = "segment")
segment: String,
Expand All @@ -35,8 +32,7 @@ class FleetSegmentAdminController(
val updatedFleetSegment =
updateFleetSegment.execute(
segment = segment,
fields = createOrUpdateFleetSegmentData.toCreateOrUpdateFleetSegmentFields(),
year = year,
updatedSegment = createOrUpdateFleetSegmentData.toFleetSegment(),
)

return FleetSegmentDataOutput.fromFleetSegment(updatedFleetSegment)
Expand All @@ -63,7 +59,7 @@ class FleetSegmentAdminController(
@RequestBody
newFleetSegmentData: CreateOrUpdateFleetSegmentDataInput,
): FleetSegmentDataOutput {
val createdFleetSegment = createFleetSegment.execute(newFleetSegmentData.toCreateOrUpdateFleetSegmentFields())
val createdFleetSegment = createFleetSegment.execute(newFleetSegmentData.toFleetSegment())

return FleetSegmentDataOutput.fromFleetSegment(createdFleetSegment)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package fr.gouv.cnsp.monitorfish.infrastructure.api.input

import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.ScipSpeciesType
import fr.gouv.cnsp.monitorfish.domain.use_cases.dtos.CreateOrUpdateFleetSegmentFields

data class CreateOrUpdateFleetSegmentDataInput(
val segment: String?,
val segment: String,
val segmentName: String?,
val gears: List<String>?,
val faoAreas: List<String>?,
Expand All @@ -16,22 +16,22 @@ data class CreateOrUpdateFleetSegmentDataInput(
val priority: Double,
val vesselTypes: List<String>,
val impactRiskFactor: Double?,
val year: Int?,
val year: Int,
) {
fun toCreateOrUpdateFleetSegmentFields() =
CreateOrUpdateFleetSegmentFields(
segment = segment,
segmentName = segmentName,
gears = gears,
faoAreas = faoAreas,
targetSpecies = targetSpecies,
mainScipSpeciesType = mainScipSpeciesType,
maxMesh = maxMesh,
minMesh = minMesh,
minShareOfTargetSpecies = minShareOfTargetSpecies,
priority = priority,
vesselTypes = vesselTypes,
impactRiskFactor = impactRiskFactor,
year = year,
fun toFleetSegment() =
FleetSegment(
segment = this.segment,
segmentName = this.segmentName ?: "",
gears = this.gears ?: listOf(),
faoAreas = this.faoAreas ?: listOf(),
targetSpecies = this.targetSpecies ?: listOf(),
impactRiskFactor = this.impactRiskFactor ?: 0.0,
year = this.year,
mainScipSpeciesType = this.mainScipSpeciesType,
maxMesh = this.maxMesh,
minMesh = this.minMesh,
minShareOfTargetSpecies = this.minShareOfTargetSpecies,
priority = this.priority,
vesselTypes = this.vesselTypes,
)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package fr.gouv.cnsp.monitorfish.infrastructure.database.repositories

import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.exceptions.BackendUsageErrorCode
import fr.gouv.cnsp.monitorfish.domain.exceptions.BackendUsageException
import fr.gouv.cnsp.monitorfish.domain.exceptions.CouldNotDeleteException
import fr.gouv.cnsp.monitorfish.domain.exceptions.CouldNotUpdateFleetSegmentException
import fr.gouv.cnsp.monitorfish.domain.repositories.FleetSegmentRepository
import fr.gouv.cnsp.monitorfish.domain.use_cases.dtos.CreateOrUpdateFleetSegmentFields
import fr.gouv.cnsp.monitorfish.infrastructure.database.entities.FleetSegmentEntity
import fr.gouv.cnsp.monitorfish.infrastructure.database.repositories.interfaces.DBFleetSegmentRepository
import fr.gouv.cnsp.monitorfish.infrastructure.database.repositories.utils.toSqlArrayString
Expand Down Expand Up @@ -34,65 +34,37 @@ class JpaFleetSegmentRepository(
@Transactional
override fun update(
segment: String,
fields: CreateOrUpdateFleetSegmentFields,
year: Int,
updatedSegment: FleetSegment,
): FleetSegment {
val fleetSegmentEntity = FleetSegmentEntity.fromFleetSegment(updatedSegment)

// The list properties needs to be formatted
val escapedFleetSegmentEntity =
fleetSegmentEntity.copy(
vesselTypes = toSqlArrayString(fleetSegmentEntity.vesselTypes)?.let { listOf(it) },
gears = toSqlArrayString(fleetSegmentEntity.gears)?.let { listOf(it) },
faoAreas = toSqlArrayString(fleetSegmentEntity.faoAreas)?.let { listOf(it) },
targetSpecies = toSqlArrayString(fleetSegmentEntity.targetSpecies)?.let { listOf(it) },
)

try {
fields.segmentName?.let {
dbFleetSegmentRepository.updateSegmentName(segment, it, year)
}

fields.gears?.let {
dbFleetSegmentRepository.updateGears(segment, it.toArrayString(), year)
}

fields.faoAreas?.let {
dbFleetSegmentRepository.updateFAOAreas(segment, it.toArrayString(), year)
}

fields.targetSpecies?.let {
dbFleetSegmentRepository.updateTargetSpecies(segment, it.toArrayString(), year)
}

fields.mainScipSpeciesType?.let {
dbFleetSegmentRepository.updateMainScipSpeciesType(segment, it.name, year)
}

fields.maxMesh?.let {
dbFleetSegmentRepository.updateMaxMesh(segment, it, year)
}

fields.minMesh?.let {
dbFleetSegmentRepository.updateMinMesh(segment, it, year)
}

fields.minShareOfTargetSpecies?.let {
dbFleetSegmentRepository.updateMinShareOfTargetSpecies(segment, it, year)
}

fields.priority?.let {
dbFleetSegmentRepository.updatePriority(segment, it, year)
}

fields.vesselTypes?.let {
dbFleetSegmentRepository.updateVesselTypes(segment, it, year)
}

fields.impactRiskFactor?.let {
dbFleetSegmentRepository.updateImpactRiskFactor(segment, it, year)
}

fields.segment?.let {
dbFleetSegmentRepository.updateSegment(segment, it, year)
}

return fields.segment?.let {
dbFleetSegmentRepository.findBySegmentAndYearEquals(it, year).toFleetSegment()
} ?: run {
dbFleetSegmentRepository.findBySegmentAndYearEquals(segment, year).toFleetSegment()
}
dbFleetSegmentRepository.updateFleetSegment(segment, escapedFleetSegmentEntity)
} catch (e: Throwable) {
throw BackendUsageException(
code = BackendUsageErrorCode.COULD_NOT_UPDATE,
message = "Could not update fleet segment",
cause = e,
)
}

return try {
dbFleetSegmentRepository
.findBySegmentAndYearEquals(
updatedSegment.segment,
updatedSegment.year,
).toFleetSegment()
} catch (e: Throwable) {
throw CouldNotUpdateFleetSegmentException("Could not update fleet segment: ${e.message}", e)
throw BackendUsageException(BackendUsageErrorCode.NOT_FOUND)
}
}

Expand Down
Loading
Loading