Skip to content

Commit

Permalink
PIN-4073 RiskAnalysisForm conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
nttdata-rtorsoli committed Oct 3, 2023
1 parent 8cf68dc commit eaed88b
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 111 deletions.
43 changes: 11 additions & 32 deletions src/main/resources/interface-specification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1262,42 +1262,21 @@ components:
$ref: '#/components/schemas/EServiceRiskAnalysisFormSeed'
EServiceRiskAnalysisFormSeed:
type: object
required:
- version
- singleAnswers
- multiAnswers
properties:
version:
type: string
singleAnswers:
type: array
items:
$ref: '#/components/schemas/EServiceRiskAnalysisSingleAnswerSeed'
multiAnswers:
type: array
items:
$ref: '#/components/schemas/EServiceRiskAnalysisMultiAnswerSeed'
EServiceRiskAnalysisSingleAnswerSeed:
type: object
required:
- key
properties:
key:
type: string
value:
type: string
EServiceRiskAnalysisMultiAnswerSeed:
type: object
minLength: 1
maxLength: 250
answers:
additionalProperties:
type: array
items:
type: string
minLength: 1
maxLength: 250
required:
- key
- values
properties:
key:
type: string
values:
type: array
items:
type: string
- version
- answers
EService:
type: object
required:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import it.pagopa.interop.catalogprocess.model._
import it.pagopa.interop.catalogprocess.common.readmodel.Consumers
import it.pagopa.interop.tenantmanagement.model.tenant.PersistentTenantKind
import it.pagopa.interop.catalogmanagement.model.{Deliver, Receive}
import it.pagopa.interop.commons.riskanalysis.api.impl.RiskAnalysisValidation
import it.pagopa.interop.catalogprocess.errors.CatalogProcessErrors.RiskAnalysisValidationFailed

import java.util.UUID

Expand Down Expand Up @@ -102,23 +104,44 @@ object Converter {
}

implicit class EServiceRiskAnalysisSeedWrapper(private val seed: EServiceRiskAnalysisSeed) extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisSeed = CatalogManagementDependency.RiskAnalysisSeed(
name = seed.name,
riskAnalysisForm = seed.riskAnalysisForm.toDependency
)
}

implicit class EServiceRiskAnalysisFormSeedWrapper(private val seed: EServiceRiskAnalysisFormSeed) extends AnyVal {
def toDependency(schemaOnlyValidation: Boolean)(
kind: PersistentTenantKind
): Either[RiskAnalysisValidationFailed, CatalogManagementDependency.RiskAnalysisSeed] = for {
riskAnalysisFormSeed <-
RiskAnalysisValidation
.validate(seed.riskAnalysisForm.toTemplate, schemaOnlyValidation)(kind.toTemplate)
.leftMap(RiskAnalysisValidationFailed(_))
.toEither
.map(_.toDependency)
} yield CatalogManagementDependency.RiskAnalysisSeed(name = seed.name, riskAnalysisForm = riskAnalysisFormSeed)
}

implicit class TemplateRiskAnalysisFormSeedWrapper(private val riskAnalysis: Commons.RiskAnalysisFormSeed)
extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisFormSeed =
CatalogManagementDependency.RiskAnalysisFormSeed(
version = seed.version,
singleAnswers = seed.singleAnswers.map(_.toDependency),
multiAnswers = seed.multiAnswers.map(_.toDependency)
version = riskAnalysis.version,
singleAnswers = riskAnalysis.singleAnswers.map(_.toDependency),
multiAnswers = riskAnalysis.multiAnswers.map(_.toDependency)
)
def toTemplate: Commons.RiskAnalysisForm = Commons.RiskAnalysisForm(
version = seed.version,
answers = (seed.singleAnswers.map(_.toTemplate).flatten ++ seed.multiAnswers.map(_.toTemplate).flatten).toMap
)
}

implicit class RiskAnalysisSingleAnswerValidatedWrapper(
private val singleAnswers: Commons.RiskAnalysisSingleAnswerValidated
) extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisSingleAnswerSeed =
CatalogManagementDependency.RiskAnalysisSingleAnswerSeed(key = singleAnswers.key, value = singleAnswers.value)
}

implicit class RiskAnalysisMultiAnswerValidatedWrapper(
private val multiAnswers: Commons.RiskAnalysisMultiAnswerValidated
) extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisMultiAnswerSeed =
CatalogManagementDependency.RiskAnalysisMultiAnswerSeed(key = multiAnswers.key, values = multiAnswers.values)
}

implicit class EServiceRiskAnalysisFormSeedWrapper(private val seed: EServiceRiskAnalysisFormSeed) extends AnyVal {
def toTemplate: Commons.RiskAnalysisForm = Commons.RiskAnalysisForm(version = seed.version, answers = seed.answers)
}

implicit class PersistentTenantKindrapper(private val kind: PersistentTenantKind) extends AnyVal {
Expand All @@ -129,20 +152,6 @@ object Converter {
}
}

implicit class EServiceRiskAnalysisSingleAnswerSeedWrapper(private val seed: EServiceRiskAnalysisSingleAnswerSeed)
extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisSingleAnswerSeed =
CatalogManagementDependency.RiskAnalysisSingleAnswerSeed(key = seed.key, value = seed.value)
def toTemplate: Map[String, Seq[String]] = Map(seed.key -> seed.value.toSeq)
}

implicit class EServiceRiskAnalysisMultiAnswerSeedWrapper(private val seed: EServiceRiskAnalysisMultiAnswerSeed)
extends AnyVal {
def toDependency: CatalogManagementDependency.RiskAnalysisMultiAnswerSeed =
CatalogManagementDependency.RiskAnalysisMultiAnswerSeed(key = seed.key, values = seed.values)
def toTemplate: Map[String, Seq[String]] = Map(seed.key -> seed.values)
}

implicit class EServiceDescriptorDocumentSeedWrapper(private val seed: UpdateEServiceDescriptorDocumentSeed)
extends AnyVal {
def toDependency: CatalogManagementDependency.UpdateEServiceDescriptorDocumentSeed =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -688,8 +688,8 @@ final case class ProcessApiServiceImpl(
_ <- assertRequesterAllowed(catalogItem.producerId)(organizationId)
tenant <- tenantManagementService.getTenantById(organizationId)
tenantKind <- tenant.kind.toFuture(TenantKindNotFound(tenant.id))
_ <- isRiskAnalysisFormValid(seed.riskAnalysisForm.toTemplate, schemaOnlyValidation = true)(tenantKind.toTemplate)
_ <- catalogManagementService.createRiskAnalysis(eServiceUuid, seed.toDependency)
depSeed <- seed.toDependency(schemaOnlyValidation = true)(tenantKind).toFuture
_ <- catalogManagementService.createRiskAnalysis(eServiceUuid, depSeed)
} yield ()

onComplete(result) {
Expand All @@ -714,8 +714,8 @@ final case class ProcessApiServiceImpl(
_ <- assertRequesterAllowed(catalogItem.producerId)(organizationId)
tenant <- tenantManagementService.getTenantById(organizationId)
tenantKind <- tenant.kind.toFuture(TenantKindNotFound(tenant.id))
_ <- isRiskAnalysisFormValid(seed.riskAnalysisForm.toTemplate, schemaOnlyValidation = true)(tenantKind.toTemplate)
_ <- catalogManagementService.updateRiskAnalysis(eServiceUuid, riskAnalysisUuid, seed.toDependency)
depSeed <- seed.toDependency(schemaOnlyValidation = true)(tenantKind).toFuture
_ <- catalogManagementService.updateRiskAnalysis(eServiceUuid, riskAnalysisUuid, depSeed)
} yield ()

onComplete(result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ object ResponseHandlers extends AkkaResponses {
success: T => Route
)(result: Try[T])(implicit contexts: Seq[(String, String)], logger: LoggerTakingImplicit[ContextFieldsToLog]): Route =
result match {
case Success(s) => success(s)
case Failure(ex: OperationForbidden.type) => forbidden(ex, logMessage)
case Failure(ex: EServiceNotFound) => notFound(ex, logMessage)
case Failure(ex: EServiceNotInDraftState) => badRequest(ex, logMessage)
case Failure(ex: EServiceNotInReceiveMode) => badRequest(ex, logMessage)
case Failure(ex: RiskAnalysisNotValid.type) => badRequest(ex, logMessage)
case Failure(ex) => internalServerError(ex, logMessage)
case Success(s) => success(s)
case Failure(ex: OperationForbidden.type) => forbidden(ex, logMessage)
case Failure(ex: EServiceNotFound) => notFound(ex, logMessage)
case Failure(ex: EServiceNotInDraftState) => badRequest(ex, logMessage)
case Failure(ex: EServiceNotInReceiveMode) => badRequest(ex, logMessage)
case Failure(ex: RiskAnalysisValidationFailed) => badRequest(ex, logMessage)
case Failure(ex) => internalServerError(ex, logMessage)
}

def updateRiskAnalysisResponse[T](logMessage: String)(
Expand All @@ -71,7 +71,7 @@ object ResponseHandlers extends AkkaResponses {
case Failure(ex: EServiceRiskAnalysisNotFound) => notFound(ex, logMessage)
case Failure(ex: EServiceNotInDraftState) => badRequest(ex, logMessage)
case Failure(ex: EServiceNotInReceiveMode) => badRequest(ex, logMessage)
case Failure(ex: RiskAnalysisNotValid.type) => badRequest(ex, logMessage)
case Failure(ex: RiskAnalysisValidationFailed) => badRequest(ex, logMessage)
case Failure(ex) => internalServerError(ex, logMessage)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,7 @@ package object impl extends SprayJsonSupport with DefaultJsonProtocol {
implicit val createEServiceDescriptorDocumentSeedFormat: RootJsonFormat[CreateEServiceDescriptorDocumentSeed] =
jsonFormat8(CreateEServiceDescriptorDocumentSeed)

implicit val riskAnalysisMultiAnswerSeedFormat: RootJsonFormat[EServiceRiskAnalysisMultiAnswerSeed] = jsonFormat2(
EServiceRiskAnalysisMultiAnswerSeed
)
implicit val riskAnalysisSingleAnswerSeedFormat: RootJsonFormat[EServiceRiskAnalysisSingleAnswerSeed] = jsonFormat2(
EServiceRiskAnalysisSingleAnswerSeed
)
implicit val riskAnalysisFormSeedFormat: RootJsonFormat[EServiceRiskAnalysisFormSeed] = jsonFormat3(
implicit val riskAnalysisFormSeedFormat: RootJsonFormat[EServiceRiskAnalysisFormSeed] = jsonFormat2(
EServiceRiskAnalysisFormSeed
)
implicit val riskAnalysisSeedFormat: RootJsonFormat[EServiceRiskAnalysisSeed] = jsonFormat2(EServiceRiskAnalysisSeed)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package it.pagopa.interop.catalogprocess.errors

import cats.data.NonEmptyChain
import it.pagopa.interop.commons.utils.errors.ComponentError
import it.pagopa.interop.commons.riskanalysis.error
import java.util.UUID

object CatalogProcessErrors {
Expand Down Expand Up @@ -63,4 +65,13 @@ object CatalogProcessErrors {

final case class EServiceRiskAnalysisIsRequired(eServiceId: UUID)
extends ComponentError("0018", s"At least one Risk Analysis is required for EService $eServiceId")

final case class RiskAnalysisValidationFailed(reason: String)
extends ComponentError("0019", s"Risk analysis validation failed. Reasons: $reason")

final object RiskAnalysisValidationFailed {
def apply(failures: NonEmptyChain[error.RiskAnalysisValidationError]): RiskAnalysisValidationFailed =
RiskAnalysisValidationFailed(failures.map(_.message).distinct.iterator.mkString("[", ", ", "]"))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2435,8 +2435,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2492,8 +2491,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2525,8 +2523,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2558,8 +2555,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2591,8 +2587,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "key1", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose1" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand All @@ -2612,7 +2607,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
status shouldEqual StatusCodes.BadRequest
val problem = responseAs[Problem]
problem.status shouldBe StatusCodes.BadRequest.intValue
problem.errors.head.code shouldBe "009-0016"
problem.errors.head.code shouldBe "009-0019"
}
}
}
Expand Down Expand Up @@ -2657,8 +2652,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2760,8 +2754,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2820,8 +2813,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2857,8 +2849,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2894,8 +2885,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "purpose", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand Down Expand Up @@ -2931,8 +2921,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
name = "newName",
riskAnalysisForm = EServiceRiskAnalysisFormSeed(
version = "3.0",
singleAnswers = Seq(EServiceRiskAnalysisSingleAnswerSeed(key = "key1", value = Some("INSTITUTIONAL"))),
multiAnswers = Seq(EServiceRiskAnalysisMultiAnswerSeed(key = "personalDataTypes", values = Seq("OTHER")))
answers = Map("purpose1" -> Seq("INSTITUTIONAL"), "personalDataTypes" -> Seq("OTHER"))
)
)

Expand All @@ -2956,7 +2945,7 @@ class CatalogProcessSpec extends SpecHelper with AnyWordSpecLike with ScalatestR
status shouldEqual StatusCodes.BadRequest
val problem = responseAs[Problem]
problem.status shouldBe StatusCodes.BadRequest.intValue
problem.errors.head.code shouldBe "009-0016"
problem.errors.head.code shouldBe "009-0019"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,10 +211,8 @@ class ProcessApiAuthzSpec extends AnyWordSpecLike with BeforeAndAfterAll with Au

"accept authorized roles for createRiskAnalysis" in {
val endpoint = AuthorizedRoutes.endpoints("createRiskAnalysis")
val fakeSeed = EServiceRiskAnalysisSeed(
"test",
EServiceRiskAnalysisFormSeed(version = "fake", singleAnswers = Seq.empty, multiAnswers = Seq.empty)
)
val fakeSeed =
EServiceRiskAnalysisSeed("test", EServiceRiskAnalysisFormSeed(version = "fake", answers = Map.empty))
validateAuthorization(
endpoint,
{ implicit c: Seq[(String, String)] => service.createRiskAnalysis(UUID.randomUUID().toString, fakeSeed) }
Expand All @@ -223,10 +221,8 @@ class ProcessApiAuthzSpec extends AnyWordSpecLike with BeforeAndAfterAll with Au

"accept authorized roles for updateRiskAnalysis" in {
val endpoint = AuthorizedRoutes.endpoints("updateRiskAnalysis")
val fakeSeed = EServiceRiskAnalysisSeed(
"test",
EServiceRiskAnalysisFormSeed(version = "fake", singleAnswers = Seq.empty, multiAnswers = Seq.empty)
)
val fakeSeed =
EServiceRiskAnalysisSeed("test", EServiceRiskAnalysisFormSeed(version = "fake", answers = Map.empty))
validateAuthorization(
endpoint,
{ implicit c: Seq[(String, String)] =>
Expand Down

0 comments on commit eaed88b

Please sign in to comment.