def stepsToCreate()

in handlers/holiday-stop-api/src/main/scala/com/gu/holiday_stops/Handler.scala [333:399]


  def stepsToCreate(
      getAccessToken: () => Either[ApiFailure, AccessToken],
      getSubscription: (AccessToken, SubscriptionName) => Either[ApiFailure, Subscription],
      getAccount: (AccessToken, String) => Either[ApiFailure, ZuoraAccount],
  )(req: ApiGatewayRequest, sfClient: SfClient): ApiResponse =
    stepsToCreate(
      getAccessToken,
      getSubscription,
      getAccount,
      req.bodyAsCaseClass[HolidayStopRequestPartial](),
    )(req, sfClient)

  def stepsToBulkCreate(
      getAccessToken: () => Either[ApiFailure, AccessToken],
      getSubscription: (AccessToken, SubscriptionName) => Either[ApiFailure, Subscription],
      getAccount: (AccessToken, String) => Either[ApiFailure, ZuoraAccount],
  )(req: ApiGatewayRequest, sfClient: SfClient): ApiResponse =
    stepsToCreate(
      getAccessToken,
      getSubscription,
      getAccount,
      req.bodyAsCaseClass[BulkHolidayStopRequestPartial](),
    )(req, sfClient)

  private def stepsToCreate(
      getAccessToken: () => Either[ApiFailure, AccessToken],
      getSubscription: (AccessToken, SubscriptionName) => Either[ApiFailure, Subscription],
      getAccount: (AccessToken, String) => Either[ApiFailure, ZuoraAccount],
      requestBodyOp: ApiGatewayOp[HolidayStopRequestPartialTrait],
  )(req: ApiGatewayRequest, sfClient: SfClient): ApiResponse = {

    val verifyContactOwnsSubOp =
      SalesforceSFSubscription.SubscriptionForSubscriptionNameAndContact(sfClient.wrapWith(JsonHttp.getWithParams))
    val createOp = new SalesforceHolidayStopRequest.CreateHolidayStopRequestWithDetail(sfClient.wrapWith(JsonHttp.post))

    (for {
      requestBody <- requestBodyOp
      contact <- extractContactFromHeaders(req.headers)
      maybeMatchingSfSub <- verifyContactOwnsSubOp(requestBody.subscriptionName, contact).toDisjunction
        .toApiGatewayOp(
          s"fetching subscriptions for contact $contact",
        )
      matchingSfSub <- maybeMatchingSfSub.toApiGatewayOp(
        s"contact $contact does not own ${requestBody.subscriptionName.value}",
      )
      accessToken <- getAccessToken().toApiGatewayOp(s"get zuora access token")
      subscription <- getSubscription(accessToken, requestBody.subscriptionName)
        .toApiGatewayOp(s"get subscription ${requestBody.subscriptionName}")
      account <- getAccount(accessToken, subscription.accountNumber)
        .toApiGatewayOp(s"get account ${subscription.accountNumber}")
      issuesData <- SubscriptionData(subscription, account)
        .map(_.issueDataForPeriod(requestBody.startDate, requestBody.endDate))
        .toApiGatewayOp(s"calculating publication dates")
      createBody = CreateHolidayStopRequestWithDetail.buildBody(
        requestBody.startDate,
        requestBody.endDate,
        issuesData,
        matchingSfSub,
        requestBody.bulkSuspensionReason,
      )
      sfErrorExposer = new SFErrorExposer(
        s"create new Holiday Stop Request for subscription ${requestBody.subscriptionName} (contact $contact)",
        Some(createBody),
      )
      _ <- createOp.run(createBody).toDisjunction.toApiGatewayOp(sfErrorExposer.parseFailureTo500ApiResponse _)
    } yield ApiGatewayResponse.successfulExecution).apiResponse
  }