in handlers/new-product-api/src/main/scala/com/gu/newproduct/api/addsubscription/Handler.scala [89:217]
def operationForEffects(
response: Request => Response,
stage: Stage,
fetchString: StringFromS3,
awsSQSSend: QueueName => AwsSQSSend.Payload => Future[Unit],
currentDatetime: () => LocalDateTime,
): ApiGatewayOp[Operation] =
for {
zuoraIds <- ZuoraIds.zuoraIdsForStage(stage).toApiGatewayOp(ApiGatewayResponse.internalServerError _)
loadConfig = LoadConfigModule(stage, fetchString)
zuoraConfig <- loadConfig.load[ZuoraRestConfig].toApiGatewayOp("load zuora config")
zuoraClient = ZuoraRestRequestMaker(response, zuoraConfig)
currentDate = () => currentDatetime().toLocalDate
paperRoundConfig <- loadConfig.load[PaperRoundConfig].toApiGatewayOp("load zuora config")
paperRoundClient = PaperRoundRestRequestMaker(response, paperRoundConfig)
getAgents = GetAgents(paperRoundClient)
validatorFor = DateValidator.validatorFor(currentDate, _: DateRule)
zuoraEnv = ZuoraEnvironment.EnvForStage(stage)
plansWithPrice <- PricesFromZuoraCatalog(zuoraEnv, fetchString, zuoraIds.rateplanIdToApiId.get)
.toApiGatewayOp("get prices from zuora catalog")
getPricesForPlan = (planId: PlanId) => plansWithPrice.getOrElse(planId, Map.empty)
startDateFromProductType <- StartDateFromFulfilmentFiles(stage, fetchString, currentDate())
.toApiGatewayOp("get fulfilment date files")
catalog = NewProductApi.catalog(getPricesForPlan, startDateFromProductType, currentDate())
isValidStartDateForPlan = Function.uncurried(
catalog andThen { plan =>
StartDateValidator.fromRule(validatorFor, plan.startDateRules)
},
)
createSubscription = CreateSubscription(zuoraClient.post[WireCreateRequest, WireSubscription], currentDate) _
supporterPlusSteps = AddSupporterPlus.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
createSubscription,
awsSQSSend,
EmailQueueName,
currentDate,
)
contributionSteps = AddContribution.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
createSubscription,
awsSQSSend,
EmailQueueName,
currentDate,
)
paperSteps = AddPaperSub.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
PaperAddressValidator.apply,
createSubscription,
awsSQSSend,
EmailQueueName,
getAgents,
)
digipackSteps = AddDigipackSub.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
DigipackAddressValidator.apply,
createSubscription,
awsSQSSend,
EmailQueueName,
currentDate,
)
guardianWeeklyDomesticStep = AddGuardianWeeklySub.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
GuardianWeeklyDomesticAddressValidator.apply,
createSubscription,
awsSQSSend,
EmailQueueName,
)
guardianWeeklyROWStep = AddGuardianWeeklySub.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
GuardianWeeklyROWAddressValidator.apply,
createSubscription,
awsSQSSend,
EmailQueueName,
)
tierThreeStep = AddTierThree.wireSteps(
catalog,
zuoraIds,
zuoraClient,
isValidStartDateForPlan,
GuardianWeeklyDomesticAddressValidator.apply,
createSubscription,
awsSQSSend,
EmailQueueName,
)
addSubSteps = new handleRequest(
addSupporterPlus = supporterPlusSteps,
addContribution = contributionSteps,
addPaperSub = paperSteps,
addDigipackSub = digipackSteps,
addGuardianWeeklyDomesticSub = guardianWeeklyDomesticStep,
addGuardianWeeklyROWSub = guardianWeeklyROWStep,
addTierThree = tierThreeStep,
)
configuredOp = Operation.async(
steps = addSubSteps.apply,
healthcheck =
() => HealthCheck(GetAccount(zuoraClient.get[ZuoraAccount]), AccountIdentitys.accountIdentitys(stage)),
)
} yield configuredOp