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
Expand Up @@ -40,5 +40,15 @@ data class MissionCrewEntity(
updatedAt = crew.updatedAt
)
}

fun fromAgentServiceEntity(agentService: AgentServiceEntity, missionId: Int? = null, missionIdUUID: UUID? = null): MissionCrewEntity {
return MissionCrewEntity(
missionId = missionId,
missionIdUUID = missionIdUUID,
comment = null,
agent = agentService.agent,
role = agentService.role,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class CreateApiKey(

val saved = repo.save(ApiKeyModel.fromApiKeyEntity(apiKey))

logger.info("Created new API key for owner='{}', publicId='{}'", owner, publicId)
logger.info("Created new API key for owner='{}', publicId='{}'", owner, publicId)

return saved?.toApiKeyEntity() to rawKey
} catch (ex: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import fr.gouv.dgampa.rapportnav.domain.repositories.mission.crew.IMissionCrewRe
import java.util.*

@UseCase
class GetAgentsCrewByMissionId(private val agentCrewRepository: IMissionCrewRepository) {
class GetAgentsCrewByMissionId(private val missionCrewRepository: IMissionCrewRepository) {
val rolePriority = listOf(
"Commandant",
"Second capitaine",
Expand All @@ -25,13 +25,13 @@ class GetAgentsCrewByMissionId(private val agentCrewRepository: IMissionCrewRepo
)

fun execute(missionId: Int, commentDefaultsToString: Boolean? = false): List<MissionCrewEntity> {
return agentCrewRepository.findByMissionId(missionId = missionId)
return missionCrewRepository.findByMissionId(missionId = missionId)
.map { MissionCrewEntity.fromMissionCrewModel(it) }
.sortedBy { rolePriority.indexOf(it.role?.title) } //TODO replace by it.role.prority
}

fun execute(missionIdUUID: UUID, commentDefaultsToString: Boolean? = false): List<MissionCrewEntity> {
return agentCrewRepository.findByMissionIdUUID(missionIdUUID = missionIdUUID)
return missionCrewRepository.findByMissionIdUUID(missionIdUUID = missionIdUUID)
.map { MissionCrewEntity.fromMissionCrewModel(it) }
.sortedBy { rolePriority.indexOf(it.role?.title) } //TODO replace by it.role.prority
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,65 @@
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionCrewEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.generalInfo.IMissionGeneralInfoRepository
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.MissionGeneralInfo2
import fr.gouv.dgampa.rapportnav.infrastructure.database.repositories.mission.crew.JPAMissionCrewRepository
import org.slf4j.LoggerFactory
import java.util.*

@UseCase
class CreateGeneralInfos(
private val generalInfosRepository: IMissionGeneralInfoRepository
private val generalInfoRepository: IMissionGeneralInfoRepository,
private val crewRepository: JPAMissionCrewRepository
) {

private val logger = LoggerFactory.getLogger(CreateGeneralInfos::class.java)

fun execute(
missionId: Int? = null,
missionIdUUID: UUID? = null,
generalInfo2: MissionGeneralInfo2
): MissionGeneralInfoEntity2 {
val generalInfoModel = generalInfosRepository.save(
generalInfo2.toMissionGeneralInfoEntity(
missionId = missionId,
missionIdUUID = missionIdUUID
): MissionGeneralInfoEntity2? {
return try {
// Try saving main general info
val savedGeneralInfo = generalInfoRepository.save(
generalInfo2.toMissionGeneralInfoEntity(
missionId = missionId,
missionIdUUID = missionIdUUID
)
)
)
return MissionGeneralInfoEntity2(
data = MissionGeneralInfoEntity(
id = generalInfoModel.id,
missionId = generalInfoModel.missionId,
missionIdUUID = generalInfoModel.missionIdUUID,
missionReportType = generalInfo2.missionReportType

// Save related crew safely (if any)
val savedCrew = generalInfo2.crew?.mapNotNull { crew ->
try {
val crewEntity = crew.toMissionCrewEntity(missionId = missionId, missionIdUUID = missionIdUUID)
crewRepository.save(crewEntity)
} catch (e: Exception) {
// Log and skip crew member if saving fails
logger.info("Failed to save crew member: '{}'", e.message)
null
}
}

// Return fully composed entity
MissionGeneralInfoEntity2(
data = MissionGeneralInfoEntity(
id = savedGeneralInfo.id,
missionId = savedGeneralInfo.missionId,
missionIdUUID = savedGeneralInfo.missionIdUUID,
missionReportType = generalInfo2.missionReportType
),
crew = savedCrew?.map { MissionCrewEntity.fromMissionCrewModel(it) }
)
)

} catch (e: Exception) {
// Log top-level failure
logger.info("Failed to create general info: '{}'", e.message)
null
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@ class CreateMission(
generalInfo2 = generalInfo2,
serviceId = serviceId
) ?: return null
val generalInfosEntity = createGeneralInfos.execute(missionIdUUID = missionNav.id, generalInfo2 = generalInfo2)
val generalInfosEntity = createGeneralInfos.execute(
missionId = null,
missionIdUUID = missionNav.id,
generalInfo2 = generalInfo2,
)

return MissionEntity2(
idUUID = missionNav.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2
import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources.LegacyControlUnitEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.ServiceEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.AgentServiceEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionCrewEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgentsByServiceId
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgentsCrewByMissionId
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetServiceByControlUnit
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.generalInfo.GetMissionGeneralInfoByMissionId
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.crew.MissionCrew
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.MissionGeneralInfo2
import org.slf4j.LoggerFactory
import java.util.*
Expand All @@ -18,7 +21,8 @@ class GetGeneralInfo2(
private val createGeneralInfos: CreateGeneralInfos,
private val getServiceByControlUnit: GetServiceByControlUnit,
private val getAgentsCrewByMissionId: GetAgentsCrewByMissionId,
private val getMissionGeneralInfoByMissionId: GetMissionGeneralInfoByMissionId
private val getMissionGeneralInfoByMissionId: GetMissionGeneralInfoByMissionId,
private val getAgentsByServiceId: GetAgentsByServiceId,
) {
private val logger = LoggerFactory.getLogger(GetGeneralInfo2::class.java)

Expand All @@ -30,7 +34,7 @@ class GetGeneralInfo2(
return MissionGeneralInfoEntity2(
services = services,
crew = fetchCrew(missionId),
data = fetchGeneralInfo(missionId = missionId, serviceId = services.first().id)
data = fetchGeneralInfo(missionId = missionId, serviceId = services.firstOrNull()?.id)
)
}

Expand All @@ -48,10 +52,13 @@ class GetGeneralInfo2(

private fun fetchGeneralInfo(missionId: Int, serviceId: Int? = null): MissionGeneralInfoEntity? {
return try {
getMissionGeneralInfoByMissionId.execute(missionId = missionId) ?: createGeneralInfos(
missionId = missionId,
serviceId = serviceId
)
val entity: MissionGeneralInfoEntity? = getMissionGeneralInfoByMissionId.execute(missionId = missionId)
entity
?: createGeneralInfosRow(
missionId = missionId,
serviceId = serviceId
)

} catch (e: Exception) {
logger.error("Error fetching Nav general info for missionId: {}", missionId, e)
throw e
Expand All @@ -60,8 +67,12 @@ class GetGeneralInfo2(

private fun fetchGeneralInfoUUID(missionIdUUID: UUID, serviceId: Int? = null): MissionGeneralInfoEntity? {
return try {
getMissionGeneralInfoByMissionId.execute(missionIdUUID = missionIdUUID)
?: createGeneralInfos(missionIdUUID = missionIdUUID, serviceId = serviceId)
val entity: MissionGeneralInfoEntity? = getMissionGeneralInfoByMissionId.execute(missionIdUUID = missionIdUUID)
entity
?: createGeneralInfosRow(
missionIdUUID = missionIdUUID,
serviceId = serviceId
)
} catch (e: Exception) {
logger.error("Error fetching Nav general info for missionId: {}", missionIdUUID, e)
throw e
Expand Down Expand Up @@ -95,15 +106,36 @@ class GetGeneralInfo2(
}
}

private fun createGeneralInfos(
private fun createGeneralInfosRow(
missionId: Int? = null,
missionIdUUID: UUID? = null,
serviceId: Int? = null
): MissionGeneralInfoEntity? {
return createGeneralInfos.execute(
missionId = missionId,
missionIdUUID = missionIdUUID,
generalInfo2 = MissionGeneralInfo2(serviceId = serviceId)
).data
generalInfo2 = MissionGeneralInfo2(
serviceId = serviceId,
crew = createMissionCrew(
missionId = missionId,
missionIdUUID = missionIdUUID,
serviceId = serviceId
)?.map { MissionCrew.fromMissionCrewEntity(it) }
),
)?.data
}

private fun createMissionCrew(missionId: Int? = null, missionIdUUID: UUID? = null, serviceId: Int? = null): List<MissionCrewEntity>? {
return serviceId?.let { serviceId ->
val serviceAgents: List<AgentServiceEntity> = getAgentsByServiceId.execute(serviceId)
val crew: List<MissionCrewEntity>? = serviceAgents.map {
MissionCrewEntity.fromAgentServiceEntity(
agentService = it,
missionId = missionId,
missionIdUUID = missionIdUUID
)
}
crew
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package fr.gouv.dgampa.rapportnav.infrastructure.api.bff.v2

import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgents
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgentsByServiceId
import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetUserFromToken
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.crew.Agent
Expand All @@ -18,7 +17,6 @@ import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/v2/agents")
class AgentRestController(
private val getAgents: GetAgents,
private val getUserFromToken: GetUserFromToken,
private val getAgentsByServiceId: GetAgentsByServiceId,
) {
Expand Down
Loading
Loading