def operationForEffects()

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