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

[Tech] Ajout de la validation métier des cas d'usage côté serveur #2014

Merged
merged 14 commits into from
Jan 28, 2025
Merged
6 changes: 3 additions & 3 deletions backend/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ plugins {
`java-library`
`maven-publish`
id("org.springframework.boot") version "3.4.1"
id("org.jetbrains.kotlin.plugin.spring") version "2.1.0"
id("org.jlleitschuh.gradle.ktlint") version "12.1.2"
kotlin("jvm") version "2.1.0"
id("org.jetbrains.kotlin.plugin.allopen") version "2.1.0"
kotlin("plugin.spring") version "2.1.0"
kotlin("plugin.allopen") version "2.1.0"
kotlin("plugin.noarg") version "2.1.0"
kotlin("plugin.jpa") version "2.1.0"
id("org.jlleitschuh.gradle.ktlint") version "12.1.2"
kotlin("plugin.serialization") version "2.1.0"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ data class VigilanceAreaEntity(
val links: List<LinkEntity>? = null,
val linkedAMPs: List<Int>? = listOf(),
val linkedRegulatoryAreas: List<Int>? = listOf(),
val name: String? = null,
val name: String,
val seaFront: String? = null,
val source: String? = null,
val startDatePeriod: ZonedDateTime? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import fr.gouv.cacem.monitorenv.domain.repositories.IDepartmentAreaRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IPostgisFunctionRepository
import fr.gouv.cacem.monitorenv.domain.validators.UseCaseValidation
import fr.gouv.cacem.monitorenv.domain.validators.mission.MissionValidator
import org.slf4j.LoggerFactory

@UseCase
Expand All @@ -24,6 +26,7 @@ class CreateOrUpdateEnvActions(

@Throws(IllegalArgumentException::class)
fun execute(
@UseCaseValidation<MissionEntity>(validator = MissionValidator::class)
mission: MissionEntity,
envActions: List<EnvActionEntity>?,
): MissionEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IPostgisFunctionRepository
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.events.UpdateMissionEvent
import fr.gouv.cacem.monitorenv.domain.validators.UseCaseValidation
import fr.gouv.cacem.monitorenv.domain.validators.mission.MissionValidator
import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationEventPublisher

Expand All @@ -19,7 +21,9 @@ class CreateOrUpdateMission(
private val logger = LoggerFactory.getLogger(CreateOrUpdateMission::class.java)

@Throws(IllegalArgumentException::class)
fun execute(mission: MissionEntity): MissionEntity {
fun execute(
@UseCaseValidation<MissionEntity>(validator = MissionValidator::class) mission: MissionEntity,
): MissionEntity {
logger.info("Attempt to CREATE or UPDATE mission ${mission.id}")

val normalizedMission =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.missions

import fr.gouv.cacem.monitorenv.config.UseCase
import fr.gouv.cacem.monitorenv.domain.entities.mission.*
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.exceptions.ReportingAlreadyAttachedException
import fr.gouv.cacem.monitorenv.domain.repositories.IReportingRepository
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.EnvActionAttachedToReportingIds
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDetailsDTO
import fr.gouv.cacem.monitorenv.domain.validators.UseCaseValidation
import fr.gouv.cacem.monitorenv.domain.validators.mission.MissionValidator
import org.slf4j.LoggerFactory
import java.util.*
import java.util.UUID

@UseCase
class CreateOrUpdateMissionWithActionsAndAttachedReporting(
Expand All @@ -26,6 +28,7 @@ class CreateOrUpdateMissionWithActionsAndAttachedReporting(

@Throws(IllegalArgumentException::class)
fun execute(
@UseCaseValidation<MissionEntity>(validator = MissionValidator::class)
mission: MissionEntity,
attachedReportingIds: List<Int>,
envActionsAttachedToReportingIds: List<EnvActionAttachedToReportingIds>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import fr.gouv.cacem.monitorenv.domain.exceptions.ReportingAlreadyAttachedExcept
import fr.gouv.cacem.monitorenv.domain.repositories.*
import fr.gouv.cacem.monitorenv.domain.use_cases.reportings.dtos.ReportingDetailsDTO
import fr.gouv.cacem.monitorenv.domain.use_cases.reportings.events.UpdateReportingEvent
import fr.gouv.cacem.monitorenv.domain.validators.UseCaseValidation
import fr.gouv.cacem.monitorenv.domain.validators.reporting.ReportingValidator
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationEventPublisher
Expand All @@ -20,7 +22,10 @@ class CreateOrUpdateReporting(
private val logger: Logger = LoggerFactory.getLogger(CreateOrUpdateReporting::class.java)

@Throws(IllegalArgumentException::class)
fun execute(reporting: ReportingEntity): ReportingDetailsDTO {
fun execute(
@UseCaseValidation<ReportingEntity>(validator = ReportingValidator::class)
reporting: ReportingEntity,
): ReportingDetailsDTO {
logger.info("Attempt to CREATE or UPDATE reporting ${reporting.id}")
reporting.validate()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException
import fr.gouv.cacem.monitorenv.domain.repositories.IFacadeAreasRepository
import fr.gouv.cacem.monitorenv.domain.repositories.IVigilanceAreaRepository
import fr.gouv.cacem.monitorenv.domain.use_cases.dashboard.SaveDashboard
import fr.gouv.cacem.monitorenv.domain.validators.UseCaseValidation
import fr.gouv.cacem.monitorenv.domain.validators.vigilance_area.VigilanceAreaValidator
import org.slf4j.LoggerFactory

@UseCase
Expand All @@ -16,7 +18,10 @@ class CreateOrUpdateVigilanceArea(
) {
private val logger = LoggerFactory.getLogger(SaveDashboard::class.java)

fun execute(vigilanceArea: VigilanceAreaEntity): VigilanceAreaEntity {
fun execute(
@UseCaseValidation<VigilanceAreaEntity>(validator = VigilanceAreaValidator::class) vigilanceArea:
VigilanceAreaEntity,
): VigilanceAreaEntity {
logger.info("Attempt to CREATE or UPDATE vigilance area ${vigilanceArea.id}")
try {
val seaFront =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fr.gouv.cacem.monitorenv.domain.validators

import kotlin.reflect.KClass

@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
annotation class UseCaseValidation<T>(
val validator: KClass<out Validator<T>>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package fr.gouv.cacem.monitorenv.domain.validators

import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.reflect.MethodSignature
import org.springframework.stereotype.Component

@Component
@Aspect
class UseCaseValidationAspect {
@Before("execution(* fr.gouv.cacem.monitorenv.domain.use_cases..*.execute(..))")
fun before(joinPoint: JoinPoint) {
val method = (joinPoint.signature as MethodSignature).method

// Parcourir les paramètres de la méthode
method.parameters.forEachIndexed { index, parameter ->
val annotation = parameter.getAnnotation(UseCaseValidation::class.java)
if (annotation != null) {
// Récupérer l'argument associé à ce paramètre
val arg = joinPoint.args[index]

// Instancier et exécuter le validateur spécifié dans l'annotation
val validator =
annotation.validator.objectInstance
?: annotation.validator.java.getDeclaredConstructor().newInstance()
(validator as Validator<Any>).validate(arg) // Valide l'objet
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package fr.gouv.cacem.monitorenv.domain.validators

fun interface Validator<T> {
fun validate(obj: T)
}
Loading
Loading