in lambda/src/main/scala/pricemigrationengine/handlers/AmendmentHandler.scala [28:65]
private def amend(
cohortSpec: CohortSpec,
catalogue: ZuoraProductCatalogue,
item: CohortItem
): ZIO[CohortTable with Zuora with Logging, Failure, AmendmentResult] =
doAmendment(cohortSpec, catalogue, item).foldZIO(
failure = {
case _: CancelledSubscriptionFailure => {
// `CancelledSubscriptionFailure` happens when the subscription was cancelled in Zuora
// in which case we simply update the processing state for this item in the database
// Although it was given to us as a failure of `doAmendment`, the only effect of the database update, if it
// is not recorded as a failure of `amend`, is to allow the processing to continue.
val result = CancelledAmendmentResult(item.subscriptionName)
CohortTable
.update(
CohortItem.fromCancelledAmendmentResult(result, "(cause: 99727bf9) subscription was cancelled in Zuora")
)
.as(result)
}
case _: ExpiringSubscriptionFailure => {
// `ExpiringSubscriptionFailure` happens when the subscription's end of effective period is before the
// intended startDate (the price increase date). Alike `CancelledSubscriptionFailure` we cancel the amendment
// and the only effect is an updated cohort item in the database
val result = ExpiringSubscriptionResult(item.subscriptionName)
CohortTable.update(CohortItem.fromExpiringSubscriptionResult(result)).as(result)
}
case e: ZuoraUpdateFailure => {
// We are only interested in the ZuoraUpdateFailures corresponding to message
// "Operation failed due to a lock competition"
// We succeed them without cohort item update to be done later.
if (e.reason.contains("lock competition")) {
ZIO.succeed(AmendmentPreventedDueToLockResult(subscriptionNumber = item.subscriptionName))
} else {
ZIO.fail(e)
}
}
case e => ZIO.fail(e)
},