diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/dashboard/DashboardEntity.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/dashboard/DashboardEntity.kt index bb6d98666..0476196c2 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/dashboard/DashboardEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/dashboard/DashboardEntity.kt @@ -11,5 +11,7 @@ data class DashboardEntity( val amps: List, val vigilanceAreas: List, val regulatoryAreas: List, + val controlUnits: List, val inseeCode: String?, + val comments: String?, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/dashboards/DashboardDataInput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/dashboards/DashboardDataInput.kt index 1d8d2e746..d5f325da7 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/dashboards/DashboardDataInput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/inputs/dashboards/DashboardDataInput.kt @@ -12,6 +12,8 @@ class DashboardDataInput( val regulatoryAreas: List, val amps: List, val vigilanceAreas: List, + val controlUnits: List, + val comments: String?, val inseeCode: String?, ) { fun toDashboardEntity(): DashboardEntity { @@ -24,6 +26,8 @@ class DashboardDataInput( amps = amps, vigilanceAreas = vigilanceAreas, inseeCode = inseeCode, + comments = comments, + controlUnits = controlUnits, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/dashboards/DashboardDataOutput.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/dashboards/DashboardDataOutput.kt index 701c134ad..81c0ed666 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/dashboards/DashboardDataOutput.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/bff/outputs/dashboards/DashboardDataOutput.kt @@ -12,7 +12,9 @@ class DashboardDataOutput( val regulatoryAreas: List, val amps: List, val vigilanceAreas: List, + val controlUnits: List, val inseeCode: String?, + val comments: String?, ) { companion object { fun fromDashboardEntity(dashboardEntity: DashboardEntity): DashboardDataOutput { @@ -24,7 +26,9 @@ class DashboardDataOutput( amps = dashboardEntity.amps, regulatoryAreas = dashboardEntity.regulatoryAreas, vigilanceAreas = dashboardEntity.vigilanceAreas, + controlUnits = dashboardEntity.controlUnits, inseeCode = dashboardEntity.inseeCode, + comments = dashboardEntity.comments, ) } } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/BriefingModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardDatasModel.kt similarity index 87% rename from backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/BriefingModel.kt rename to backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardDatasModel.kt index 9a234858d..ba3272e32 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/BriefingModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardDatasModel.kt @@ -14,8 +14,8 @@ import jakarta.persistence.Table import java.util.UUID @Entity -@Table(name = "briefing") -data class BriefingModel( +@Table(name = "dashboard_datas") +data class DashboardDatasModel( @Id @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.UUID) @@ -35,6 +35,9 @@ data class BriefingModel( @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "regulations_cacem_id") val regulatoryAreaModel: RegulatoryAreaModel?, + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "control_unit_id") + val controlUnitModel: ControlUnitModel?, @Column(name = "insee_code") val inseeCode: String?, ) diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardModel.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardModel.kt index cfe063d8e..e8d554b1b 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardModel.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/model/DashboardModel.kt @@ -22,42 +22,49 @@ data class DashboardModel( val id: UUID?, val name: String, val geom: Geometry, + val comments: String?, @OneToMany( mappedBy = "dashboard", fetch = FetchType.LAZY, cascade = [CascadeType.ALL], ) - val briefings: MutableList, + val dashboardDatas: MutableList, ) { fun toDashboardEntity(): DashboardEntity { val amps: MutableList = mutableListOf() val regulatoryAreas: MutableList = mutableListOf() val vigilanceAreas: MutableList = mutableListOf() val reportings: MutableList = mutableListOf() + val controlUnits: MutableList = mutableListOf() var inseeCode: String? = null - briefings.forEach { briefing -> - briefing.amp.let { + dashboardDatas.forEach { datas -> + datas.amp.let { if (it?.id != null) { amps.add(it.id) } } - briefing.regulatoryAreaModel.let { + datas.regulatoryAreaModel.let { if (it?.id != null) { regulatoryAreas.add(it.id) } } - briefing.vigilanceAreaModel.let { + datas.vigilanceAreaModel.let { if (it?.id != null) { vigilanceAreas.add(it.id) } } - briefing.reportingModel.let { + datas.reportingModel.let { if (it?.id != null) { reportings.add(it.id) } } - if (briefing.inseeCode != null) { - inseeCode = briefing.inseeCode + datas.controlUnitModel.let { + if (it?.id != null) { + controlUnits.add(it.id) + } + } + if (datas.inseeCode != null) { + inseeCode = datas.inseeCode } } return DashboardEntity( @@ -69,27 +76,30 @@ data class DashboardModel( regulatoryAreas = regulatoryAreas, vigilanceAreas = vigilanceAreas, reportings = reportings, + controlUnits = controlUnits, + comments = comments, ) } - fun addBriefing(briefing: BriefingModel) { - briefing.dashboard = this - briefings.add(briefing) + fun addBriefing(dashboardDatasModel: DashboardDatasModel) { + dashboardDatasModel.dashboard = this + this.dashboardDatas.add(dashboardDatasModel) } companion object { fun fromDashboardEntity( dashboardEntity: DashboardEntity, - briefings: List, + dashboardDatasModels: List, ): DashboardModel { val dashboardModel = DashboardModel( id = dashboardEntity.id, name = dashboardEntity.name, geom = dashboardEntity.geom, - briefings = mutableListOf(), + comments = dashboardEntity.comments, + dashboardDatas = mutableListOf(), ) - briefings.forEach { + dashboardDatasModels.forEach { dashboardModel.addBriefing(it) } return dashboardModel diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepository.kt index 9c2f2ace9..f7e89b98a 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepository.kt @@ -2,10 +2,11 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.repositories import fr.gouv.cacem.monitorenv.domain.entities.dashboard.DashboardEntity import fr.gouv.cacem.monitorenv.domain.repositories.IDashboardRepository -import fr.gouv.cacem.monitorenv.infrastructure.database.model.BriefingModel +import fr.gouv.cacem.monitorenv.infrastructure.database.model.DashboardDatasModel import fr.gouv.cacem.monitorenv.infrastructure.database.model.DashboardModel.Companion.fromDashboardEntity import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBAMPRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBBriefingRepository +import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBControlUnitRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBDashboardRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBRegulatoryAreaRepository import fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces.IDBReportingRepository @@ -18,6 +19,7 @@ class JpaDashboardRepository( private val dashboardRepository: IDBDashboardRepository, private val briefingRepository: IDBBriefingRepository, private val ampRepository: IDBAMPRepository, + private val controlUnitRepository: IDBControlUnitRepository, private val regulatoryAreaRepository: IDBRegulatoryAreaRepository, private val reportingRepository: IDBReportingRepository, private val vigilanceAreaRepository: IDBVigilanceAreaRepository, @@ -26,23 +28,24 @@ class JpaDashboardRepository( @Transactional override fun save(dashboard: DashboardEntity): DashboardEntity { dashboard.id?.let { briefingRepository.deleteAllByDashboardId(dashboardId = it) } - val briefingsToSave: MutableList = mutableListOf() + val briefingsToSave: MutableList = mutableListOf() addAmps(dashboard, briefingsToSave) addInseeCode(dashboard, briefingsToSave) addReportings(dashboard, briefingsToSave) addVigilanceAreas(dashboard, briefingsToSave) addRegulatoryAreas(dashboard, briefingsToSave) + addControlUnits(dashboard, briefingsToSave) val dashboardModel = dashboardRepository.save(fromDashboardEntity(dashboard, briefingsToSave)) return dashboardModel.toDashboardEntity() } private fun addRegulatoryAreas( dashboard: DashboardEntity, - briefingsToSave: MutableList, + briefingsToSave: MutableList, ) { dashboard.regulatoryAreas.forEach { briefingsToSave.add( - BriefingModel( + DashboardDatasModel( id = null, dashboard = null, amp = null, @@ -50,6 +53,7 @@ class JpaDashboardRepository( vigilanceAreaModel = null, reportingModel = null, regulatoryAreaModel = regulatoryAreaRepository.getReferenceById(it), + controlUnitModel = null, ), ) } @@ -57,11 +61,11 @@ class JpaDashboardRepository( private fun addVigilanceAreas( dashboard: DashboardEntity, - briefingsToSave: MutableList, + briefingsToSave: MutableList, ) { dashboard.vigilanceAreas.forEach { briefingsToSave.add( - BriefingModel( + DashboardDatasModel( id = null, dashboard = null, amp = null, @@ -69,6 +73,7 @@ class JpaDashboardRepository( vigilanceAreaModel = vigilanceAreaRepository.getReferenceById(it), reportingModel = null, regulatoryAreaModel = null, + controlUnitModel = null, ), ) } @@ -76,11 +81,11 @@ class JpaDashboardRepository( private fun addReportings( dashboard: DashboardEntity, - briefingsToSave: MutableList, + briefingsToSave: MutableList, ) { dashboard.reportings.forEach { briefingsToSave.add( - BriefingModel( + DashboardDatasModel( id = null, dashboard = null, amp = null, @@ -88,6 +93,7 @@ class JpaDashboardRepository( vigilanceAreaModel = null, reportingModel = reportingRepository.getReferenceById(it), regulatoryAreaModel = null, + controlUnitModel = null, ), ) } @@ -95,11 +101,11 @@ class JpaDashboardRepository( private fun addInseeCode( dashboard: DashboardEntity, - briefingsToSave: MutableList, + briefingsToSave: MutableList, ) { dashboard.inseeCode?.let { briefingsToSave.add( - BriefingModel( + DashboardDatasModel( id = null, dashboard = null, amp = null, @@ -107,6 +113,7 @@ class JpaDashboardRepository( vigilanceAreaModel = null, reportingModel = null, regulatoryAreaModel = null, + controlUnitModel = null, ), ) } @@ -114,11 +121,11 @@ class JpaDashboardRepository( private fun addAmps( dashboard: DashboardEntity, - briefingsToSave: MutableList, + briefingsToSave: MutableList, ) { dashboard.amps.forEach { briefingsToSave.add( - BriefingModel( + DashboardDatasModel( id = null, dashboard = null, amp = ampRepository.getReferenceById(it), @@ -126,6 +133,27 @@ class JpaDashboardRepository( vigilanceAreaModel = null, reportingModel = null, regulatoryAreaModel = null, + controlUnitModel = null, + ), + ) + } + } + + private fun addControlUnits( + dashboard: DashboardEntity, + briefingsToSave: MutableList, + ) { + dashboard.controlUnits.forEach { + briefingsToSave.add( + DashboardDatasModel( + id = null, + dashboard = null, + amp = null, + inseeCode = null, + vigilanceAreaModel = null, + reportingModel = null, + regulatoryAreaModel = null, + controlUnitModel = controlUnitRepository.getReferenceById(it), ), ) } diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBBriefingRepository.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBBriefingRepository.kt index 21e45a2bd..22061553a 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBBriefingRepository.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/interfaces/IDBBriefingRepository.kt @@ -1,9 +1,9 @@ package fr.gouv.cacem.monitorenv.infrastructure.database.repositories.interfaces -import fr.gouv.cacem.monitorenv.infrastructure.database.model.BriefingModel +import fr.gouv.cacem.monitorenv.infrastructure.database.model.DashboardDatasModel import org.springframework.data.jpa.repository.JpaRepository import java.util.UUID -interface IDBBriefingRepository : JpaRepository { +interface IDBBriefingRepository : JpaRepository { fun deleteAllByDashboardId(dashboardId: UUID) } diff --git a/backend/src/main/resources/db/migration/internal/V0.154__create_dashboard_table.sql b/backend/src/main/resources/db/migration/internal/V0.154__create_dashboard_table.sql index 9bc5c60dc..737b3ea6f 100644 --- a/backend/src/main/resources/db/migration/internal/V0.154__create_dashboard_table.sql +++ b/backend/src/main/resources/db/migration/internal/V0.154__create_dashboard_table.sql @@ -1,11 +1,12 @@ CREATE TABLE dashboard ( - id uuid PRIMARY KEY, - name VARCHAR(255) NOT NULL, - geom geometry(geometry, 4326) NOT NULL + id uuid PRIMARY KEY, + name VARCHAR(255) NOT NULL, + geom geometry(geometry, 4326) NOT NULL, + comments VARCHAR(255) ); -CREATE TABLE briefing +CREATE TABLE dashboard_datas ( id uuid PRIMARY KEY, dashboard_id uuid NOT NULL, @@ -13,14 +14,15 @@ CREATE TABLE briefing amp_cacem_id integer, regulations_cacem_id integer, vigilance_area_id integer, - control_units_id integer, + control_unit_id integer, --department code has 3 char max : https://www.insee.fr/fr/information/7766585 insee_code varchar(3), CONSTRAINT fk_dashboard_id FOREIGN KEY (dashboard_id) REFERENCES dashboard (id), CONSTRAINT fk_reportings FOREIGN KEY (reportings_id) REFERENCES reportings (id), CONSTRAINT fk_regulatory_cacem FOREIGN KEY (regulations_cacem_id) REFERENCES regulations_cacem (id), CONSTRAINT fk_vigilance_area FOREIGN KEY (vigilance_area_id) REFERENCES vigilance_areas (id), - CONSTRAINT fk_control_units FOREIGN KEY (control_units_id) REFERENCES control_units (id) + CONSTRAINT fk_control_units FOREIGN KEY (control_unit_id) REFERENCES control_units (id), + CONSTRAINT fk_amp_cacem FOREIGN KEY (amp_cacem_id) REFERENCES amp_cacem (id) ); diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/dashboard/fixtures/DashboardFixture.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/dashboard/fixtures/DashboardFixture.kt index 30c05c280..2a1b2fbfa 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/dashboard/fixtures/DashboardFixture.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/domain/use_cases/dashboard/fixtures/DashboardFixture.kt @@ -10,22 +10,26 @@ class DashboardFixture { fun aDashboard( id: UUID? = null, name: String = "", + comments: String = "", geom: Geometry = WKTReader().read("MULTIPOINT ((-1.548 44.315),(-1.245 44.305))"), amps: List = listOf(), regulatoryAreas: List = listOf(), reportings: List = listOf(), vigilanceAreas: List = listOf(), + controlUnits: List = listOf(), inseeCode: String? = null, ): DashboardEntity { return DashboardEntity( id = id, name = name, geom = geom, + comments = comments, amps = amps, regulatoryAreas = regulatoryAreas, inseeCode = inseeCode, reportings = reportings, vigilanceAreas = vigilanceAreas, + controlUnits = controlUnits, ) } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/DashboardITest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/DashboardITest.kt index 8a19f7664..802a27bb3 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/DashboardITest.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/endpoints/bff/v1/DashboardITest.kt @@ -137,33 +137,39 @@ class DashboardITest { // Given val id = UUID.randomUUID() val name = "dashboard1" + val comments = "comments" val geometry = WKTReader().read("MULTIPOINT ((-1.548 44.315),(-1.245 44.305))") val amps = listOf(1) val regulatoryAreas = listOf(2) val vigilanceAreas = listOf(3) val reportings = listOf(4) + val controlUnits = listOf(4) val inseeCode = "94" val input = DashboardDataInput( id = id, name = name, + comments = comments, geom = geometry, inseeCode = inseeCode, amps = amps, regulatoryAreas = regulatoryAreas, vigilanceAreas = vigilanceAreas, reportings = reportings, + controlUnits = controlUnits, ) val dashboard = aDashboard( id = id, name = name, + comments = comments, geom = geometry, amps = amps, vigilanceAreas = vigilanceAreas, reportings = reportings, regulatoryAreas = regulatoryAreas, inseeCode = inseeCode, + controlUnits = controlUnits, ) given(saveDashboard.execute(dashboard)).willReturn(dashboard) @@ -177,11 +183,13 @@ class DashboardITest { .andExpect(status().isOk) .andExpect(jsonPath("$.id", equalTo(id.toString()))) .andExpect(jsonPath("$.name", equalTo(name))) + .andExpect(jsonPath("$.comments", equalTo(comments))) .andExpect(jsonPath("$.geom.type", equalTo(geometry.geometryType))) .andExpect(jsonPath("$.inseeCode", equalTo(inseeCode))) .andExpect(jsonPath("$.amps", equalTo(amps))) .andExpect(jsonPath("$.regulatoryAreas", equalTo(regulatoryAreas))) .andExpect(jsonPath("$.reportings", equalTo(reportings))) .andExpect(jsonPath("$.vigilanceAreas", equalTo(vigilanceAreas))) + .andExpect(jsonPath("$.controlUnits", equalTo(controlUnits))) } } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepositoryITest.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepositoryITest.kt index f751db580..a3450ed1e 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepositoryITest.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/database/repositories/JpaDashboardRepositoryITest.kt @@ -78,6 +78,20 @@ class JpaDashboardRepositoryITest : AbstractDBTests() { assertThat(savedDashboard.vigilanceAreas).isEqualTo(vigilanceAreas) } + @Test + fun `save should save a dashboard with controlUnits and return saved entity when dashboard doesnt exist`() { + // Given + val controlUnits = listOf(10000) + val dashboard = aDashboard(controlUnits = controlUnits) + + // When + val savedDashboard = jpaDashboardRepository.save(dashboard) + + // Then + assertThat(savedDashboard.id).isNotNull() + assertThat(savedDashboard.controlUnits).isEqualTo(controlUnits) + } + @Test fun `save should save a dashboard with an insee code and return saved entity when dashboard doesnt exist`() { // Given @@ -101,23 +115,29 @@ class JpaDashboardRepositoryITest : AbstractDBTests() { assertThat(createdDashboard.amps).isEmpty() assertThat(createdDashboard.reportings).isEmpty() assertThat(createdDashboard.regulatoryAreas).isEmpty() + assertThat(createdDashboard.controlUnits).isEmpty() val name = "updatedDashboard" + val comments = "updated comments" val geom = WKTReader().read("MULTIPOINT ((-1.555 44.315),(-1.555 44.305))") val inseeCode = "94" - val amps = listOf(1) - val reportings = listOf(1) - val regulatoryAreas = listOf(523) - val vigilanceAreas = listOf(1) + val amps = listOf(1, 2) + val reportings = listOf(1, 2) + val regulatoryAreas = listOf(522, 523) + val vigilanceAreas = listOf(1, 2) + val controlUnits = listOf(10000, 10001) + createdDashboard = createdDashboard.copy( name = name, + comments = comments, geom = geom, inseeCode = inseeCode, amps = amps, reportings = reportings, regulatoryAreas = regulatoryAreas, vigilanceAreas = vigilanceAreas, + controlUnits = controlUnits, ) // When @@ -126,11 +146,13 @@ class JpaDashboardRepositoryITest : AbstractDBTests() { // Then assertThat(updatedDashboard.id).isEqualTo(createdDashboard.id) assertThat(updatedDashboard.name).isEqualTo(name) + assertThat(updatedDashboard.comments).isEqualTo(comments) assertThat(updatedDashboard.geom).isEqualTo(geom) assertThat(updatedDashboard.inseeCode).isEqualTo(inseeCode) assertThat(updatedDashboard.amps).isEqualTo(amps) assertThat(updatedDashboard.reportings).isEqualTo(reportings) assertThat(updatedDashboard.regulatoryAreas).isEqualTo(regulatoryAreas) assertThat(updatedDashboard.vigilanceAreas).isEqualTo(vigilanceAreas) + assertThat(updatedDashboard.controlUnits).isEqualTo(controlUnits) } }