diff --git a/src/main/scala/it/pagopa/interop/purposeprocess/api/impl/PurposeApiServiceImpl.scala b/src/main/scala/it/pagopa/interop/purposeprocess/api/impl/PurposeApiServiceImpl.scala index 25bf16d..1882a8d 100644 --- a/src/main/scala/it/pagopa/interop/purposeprocess/api/impl/PurposeApiServiceImpl.scala +++ b/src/main/scala/it/pagopa/interop/purposeprocess/api/impl/PurposeApiServiceImpl.scala @@ -39,6 +39,7 @@ import it.pagopa.interop.purposeprocess.service._ import java.util.UUID import scala.concurrent.{ExecutionContext, Future} import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter final case class PurposeApiServiceImpl( agreementManagementService: AgreementManagementService, @@ -56,6 +57,8 @@ final case class PurposeApiServiceImpl( private implicit val logger: LoggerTakingImplicit[ContextFieldsToLog] = Logger.takingImplicit[ContextFieldsToLog](this.getClass) + private val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss") + private[this] val purposeVersionActivation = PurposeVersionActivation( agreementManagementService, authorizationManagementService, @@ -605,6 +608,17 @@ final case class PurposeApiServiceImpl( singleAnswers = riskAnalysis.singleAnswers.map(singleAnswerToSeed), multiAnswers = riskAnalysis.multiAnswers.map(multiAnswerToSeed) ) + def generateTitle(title: String): String = { + val dots: String = "..." + val suffix: String = s" - clone - ${dateTimeSupplier.get().format(dtf)}" + val maxTitleLength: Int = 60 + val prefixLengthAllowance: Int = maxTitleLength - suffix.length - dots.length + + if ((title.length + suffix.length) <= maxTitleLength) + s"${title}${suffix}" + else + s"${title.substring(0, prefixLengthAllowance)}${dots}${suffix}" + } def createPurposeSeed( purpose: PersistentPurpose, @@ -615,7 +629,7 @@ final case class PurposeApiServiceImpl( eserviceId = eserviceId, consumerId = purpose.consumerId, riskAnalysisForm = purpose.riskAnalysisForm.map(riskAnalysisToSeed), - title = s"${purpose.title} - clone", + title = generateTitle(purpose.title), description = purpose.description, isFreeOfCharge = purpose.isFreeOfCharge, freeOfChargeReason = purpose.freeOfChargeReason, diff --git a/src/test/scala/it/pagopa/interop/purposeprocess/PurposeApiServiceSpec.scala b/src/test/scala/it/pagopa/interop/purposeprocess/PurposeApiServiceSpec.scala index 25e728d..87b682b 100644 --- a/src/test/scala/it/pagopa/interop/purposeprocess/PurposeApiServiceSpec.scala +++ b/src/test/scala/it/pagopa/interop/purposeprocess/PurposeApiServiceSpec.scala @@ -84,6 +84,8 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate val purposeCloneSeed = PurposeCloneSeed(eserviceId = eServiceId) + (() => mockDateTimeSupplier.get()).expects().returning(SpecData.timestamp).once() + val purposeCloned = PurposeManagementDependency.Purpose( id = UUID.randomUUID(), eserviceId = eServiceId, @@ -91,7 +93,7 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate versions = Seq(SpecData.dependencyPurposeVersion), suspendedByConsumer = None, suspendedByProducer = None, - title = "title - clone", + title = s"${purposeToClone} - clone - ${SpecData.timestamp.format(SpecData.dtf)}", description = "description", riskAnalysisForm = Some(SpecData.validManagementRiskAnalysis(PersistentTenantKind.PRIVATE)), createdAt = SpecData.timestamp, @@ -169,6 +171,8 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate freeOfChargeReason = None ) + (() => mockDateTimeSupplier.get()).expects().returning(SpecData.timestamp).once() + val purposeCloned = PurposeManagementDependency.Purpose( id = UUID.randomUUID(), eserviceId = eServiceId, @@ -197,7 +201,7 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate ), suspendedByConsumer = None, suspendedByProducer = None, - title = "title - clone", + title = s"${purposeToClone} - clone - ${SpecData.timestamp.format(SpecData.dtf)}", description = "description", riskAnalysisForm = Some(SpecData.validManagementRiskAnalysis(PersistentTenantKind.PRIVATE)), createdAt = SpecData.timestamp, @@ -275,6 +279,8 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate freeOfChargeReason = None ) + (() => mockDateTimeSupplier.get()).expects().returning(SpecData.timestamp).once() + val purposeCloned = PurposeManagementDependency.Purpose( id = UUID.randomUUID(), eserviceId = eServiceId, @@ -303,7 +309,7 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate ), suspendedByConsumer = None, suspendedByProducer = None, - title = "title - clone", + title = s"${purposeToClone} - clone - ${SpecData.timestamp.format(SpecData.dtf)}", description = "description", riskAnalysisForm = Some(SpecData.validManagementRiskAnalysis(PersistentTenantKind.PA)), createdAt = SpecData.timestamp, @@ -369,6 +375,8 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate freeOfChargeReason = None ) + (() => mockDateTimeSupplier.get()).expects().returning(SpecData.timestamp).once() + val purposeCloned = PurposeManagementDependency.Purpose( id = UUID.randomUUID(), eserviceId = eServiceId, @@ -388,7 +396,7 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate ), suspendedByConsumer = None, suspendedByProducer = None, - title = "title - clone", + title = s"${purposeToClone.title} - clone - ${SpecData.timestamp.format(SpecData.dtf)}", description = "description", riskAnalysisForm = None, createdAt = SpecData.timestamp, @@ -400,7 +408,7 @@ class PurposeApiServiceSpec extends AnyWordSpecLike with SpecHelper with Scalate eserviceId = purposeToClone.eserviceId, consumerId = purposeToClone.consumerId, riskAnalysisForm = None, - title = s"${purposeToClone.title} - clone", + title = s"${purposeToClone.title} - clone - ${SpecData.timestamp.format(SpecData.dtf)}", description = purposeToClone.description, isFreeOfCharge = false, dailyCalls = 500 diff --git a/src/test/scala/it/pagopa/interop/purposeprocess/SpecData.scala b/src/test/scala/it/pagopa/interop/purposeprocess/SpecData.scala index d0c656a..a5f7c1d 100644 --- a/src/test/scala/it/pagopa/interop/purposeprocess/SpecData.scala +++ b/src/test/scala/it/pagopa/interop/purposeprocess/SpecData.scala @@ -32,6 +32,7 @@ import it.pagopa.interop.agreementmanagement.model.agreement.{Active, Persistent import it.pagopa.interop.tenantmanagement.model.tenant.{PersistentTenantKind, PersistentTenant, PersistentExternalId} import it.pagopa.interop.purposeprocess.api.Adapters._ import java.time.{OffsetDateTime, ZoneOffset} +import java.time.format.DateTimeFormatter import java.util.UUID object SpecData { @@ -324,6 +325,8 @@ object SpecData { ) } + val dtf: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss") + val purpose: PersistentPurpose = PersistentPurpose( id = UUID.randomUUID(), eserviceId = UUID.randomUUID(),