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
}