security-c4po/security-c4po-api/src/main/kotlin/com/securityc4po/api/pentest/PentestDeletionService.kt

64 lines
2.9 KiB
Kotlin

package com.securityc4po.api.pentest
import com.securityc4po.api.configuration.BC_BAD_CAST_TO_ABSTRACT_COLLECTION
import com.securityc4po.api.configuration.MESSAGE_BAD_CAST_TO_ABSTRACT_COLLECTION
import com.securityc4po.api.configuration.error.handler.Errorcode
import com.securityc4po.api.configuration.error.handler.TransactionInterruptedException
import com.securityc4po.api.extensions.getLoggerFor
import com.securityc4po.api.pentest.comment.CommentRepository
import com.securityc4po.api.pentest.finding.FindingRepository
import com.securityc4po.api.project.Project
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings
import org.springframework.stereotype.Service
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono
@Service
class PentestDeletionService(
private val pentestRepository: PentestRepository,
private val findingRepository: FindingRepository,
private val commentRepository: CommentRepository
) {
var logger = getLoggerFor<PentestDeletionService>()
@SuppressFBWarnings(BC_BAD_CAST_TO_ABSTRACT_COLLECTION, MESSAGE_BAD_CAST_TO_ABSTRACT_COLLECTION)
fun deletePentestsAndAllAssociatedFindingsAndComments(project: Project): Flux<Project> {
val pentestIds = project.projectPentests.map { it.pentestId }
return pentestRepository.findPentestsByIds(pentestIds).collectList()
.flatMapMany { pentestEntityList -> Flux.fromIterable(pentestEntityList) }.flatMap { pentestEntity ->
this.pentestRepository.deletePentestById(pentestEntity.data.id).flatMap {
// Delete all associated findings of the pentest
val findingsDeletionResult =
this.findingRepository.deleteFindingsByIds(pentestEntity.data.findingIds).onErrorMap {
TransactionInterruptedException(
"Finding could not be deleted.",
Errorcode.FindingDeletionFailed
)
}
// Delete all associated comments of the pentest
val commentsDeletionResult =
this.commentRepository.deleteCommentsByIds(pentestEntity.data.commentIds).onErrorMap {
TransactionInterruptedException(
"Comments could not be deleted.",
Errorcode.CommentDeletionFailed
)
}
// Hack to map result together
findingsDeletionResult.flatMap {
commentsDeletionResult.flatMap {
Mono.just(project)
}
}
}.onErrorMap {
TransactionInterruptedException(
"Pentest deletion failed",
Errorcode.PentestDeletionFailed
)
}
}.flatMap {
Mono.just(project)
}
}
}