Skip to content

Commit

Permalink
Add mission including in ids endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
louptheron committed Oct 24, 2023
1 parent cca48f8 commit 2636c51
Show file tree
Hide file tree
Showing 11 changed files with 118 additions and 76 deletions.
47 changes: 0 additions & 47 deletions backend/lib/build.gradle.kts

This file was deleted.

10 changes: 0 additions & 10 deletions backend/lib/src/main/kotlin/monitorenv/Library.kt

This file was deleted.

14 changes: 0 additions & 14 deletions backend/lib/src/test/kotlin/monitorenv/LibraryTest.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ interface IMissionRepository {
pageable: Pageable,
): List<MissionDTO>

fun findAllIncludedIn(ids: List<Int>): List<MissionEntity>

fun findByControlUnitId(controlUnitId: Int): List<MissionEntity>

fun findById(missionId: Int): MissionDTO
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@file:Suppress("ktlint:standard:package-name")

package fr.gouv.cacem.monitorenv.domain.use_cases.missions

import fr.gouv.cacem.monitorenv.config.UseCase
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository

@UseCase
class GetMissionsIncludedIn(private val missionRepository: IMissionRepository) {
fun execute(ids: List<Int>): List<MissionEntity> {
return missionRepository.findAllIncludedIn(ids)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.outputs

import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO
Expand Down Expand Up @@ -53,5 +54,31 @@ data class MissionDataOutput(
isGeometryComputedFromControls = dto.mission.isGeometryComputedFromControls,
)
}

fun fromMissionEntity(mission: MissionEntity): MissionDataOutput {
requireNotNull(mission.id) {
"a mission must have an id"
}

return MissionDataOutput(
id = mission.id,
missionTypes = mission.missionTypes,
controlUnits = mission.controlUnits,
openBy = mission.openBy,
closedBy = mission.closedBy,
observationsCacem = mission.observationsCacem,
observationsCnsp = mission.observationsCnsp,
facade = mission.facade,
geom = mission.geom,
startDateTimeUtc = mission.startDateTimeUtc,
endDateTimeUtc = mission.endDateTimeUtc,
envActions = mission.envActions,
missionSource = mission.missionSource,
isClosed = mission.isClosed,
hasMissionOrder = mission.hasMissionOrder,
isUnderJdp = mission.isUnderJdp,
isGeometryComputedFromControls = mission.isGeometryComputedFromControls,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class ApiMissionsController(
private val getMissionById: GetMissionById,
private val deleteMission: DeleteMission,
private val getEngagedControlUnits: GetEngagedControlUnits,
private val getMissionsIncludedIn: GetMissionsIncludedIn
) {

@GetMapping("")
Expand Down Expand Up @@ -67,6 +68,17 @@ class ApiMissionsController(
return missions.map { MissionDataOutput.fromMissionDTO(it) }
}

@GetMapping("/find")
@Operation(summary = "Get missions of specified identifiers")
fun getMissionsOfIdsController(
@Parameter(description = "Requested identifiers")
@RequestParam(name = "ids")
ids: List<Int>,
): List<MissionDataOutput> {
val missions = getMissionsIncludedIn.execute(ids)
return missions.map { MissionDataOutput.fromMissionEntity(it) }
}

@PostMapping("", consumes = ["application/json"])
@Operation(summary = "Create a new mission")
fun createMissionController(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ class JpaMissionRepository(
).map { it.toMissionDTO(mapper) }
}

override fun findAllIncludedIn(ids: List<Int>): List<MissionEntity> {
return dbMissionRepository.findAllIncludedIn(ids).map { it.toMissionEntity(mapper) }
}

override fun findByControlUnitId(controlUnitId: Int): List<MissionEntity> {
return dbMissionRepository.findByControlUnitId(controlUnitId).map { it.toMissionEntity(mapper) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,19 @@ interface IDBMissionRepository : JpaRepository<MissionModel, Int> {
pageable: Pageable,
): List<MissionModel>

@Query(
value = """
SELECT *
FROM missions
WHERE
deleted IS FALSE AND
id IN :ids
ORDER BY start_datetime_utc DESC
""",
nativeQuery = true,
)
fun findAllIncludedIn(ids: List<Int>): List<MissionModel>

@Query("SELECT mm FROM MissionModel mm JOIN mm.controlUnits mmcu WHERE mmcu.unit.id = :controlUnitId")
fun findByControlUnitId(controlUnitId: Int): List<MissionModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,7 @@ import fr.gouv.cacem.monitorenv.domain.entities.mission.EnvActionControlEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.CreateOrUpdateMission
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.DeleteMission
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetEngagedControlUnits
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissionById
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.GetMissions
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.*
import fr.gouv.cacem.monitorenv.domain.use_cases.missions.dtos.MissionDTO
import fr.gouv.cacem.monitorenv.infrastructure.api.adapters.publicapi.inputs.CreateOrUpdateMissionDataInput
import org.hamcrest.Matchers.equalTo
Expand Down Expand Up @@ -56,6 +52,9 @@ class ApiMissionsControllerITests {
@MockBean
private lateinit var deleteMission: DeleteMission

@MockBean
private lateinit var getMissionsIncludedIn: GetMissionsIncludedIn

@MockBean
private lateinit var getEngagedControlUnits: GetEngagedControlUnits

Expand Down Expand Up @@ -163,6 +162,40 @@ class ApiMissionsControllerITests {
.andExpect(status().isOk)
}

@Test
fun `Should get all missions included in ids`() {
// Given
val wktReader = WKTReader()
val multipolygonString =
"MULTIPOLYGON (((-4.54877817 48.30555988, -4.54997332 48.30597601, -4.54998501 48.30718823, -4.5487929 48.30677461, -4.54877817 48.30555988)))"
val polygon = wktReader.read(multipolygonString) as MultiPolygon

val expectedFirstMission = MissionEntity(
id = 10,
missionTypes = listOf(MissionTypeEnum.SEA),
facade = "Outre-Mer",
geom = polygon,
observationsCnsp = null,
startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"),
endDateTimeUtc = ZonedDateTime.parse("2022-01-23T20:29:03Z"),
isDeleted = false,
missionSource = MissionSourceEnum.MONITORFISH,
isClosed = false,
hasMissionOrder = false,
isUnderJdp = false,
isGeometryComputedFromControls = false,
)
given(
getMissionsIncludedIn.execute(any()),
).willReturn(listOf(expectedFirstMission))

// When
mockMvc.perform(get("/api/v1/missions/find?ids=55,52"))
// Then
.andDo(MockMvcResultHandlers.print())
.andExpect(status().isOk)
}

@Test
fun `Should get specific mission when requested by Id`() {
// Given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -739,4 +739,12 @@ class JpaMissionRepositoryITests : AbstractDBTests() {
)
assertThat(nextMissionList).hasSize(20)
}

@Test
@Transactional
fun `findAllIncludedIn() should find the matching missions`() {
val foundMissions = jpaMissionRepository.findAllIncludedIn(listOf(50, 51, 52))

assertThat(foundMissions).hasSize(3)
}
}

0 comments on commit 2636c51

Please sign in to comment.