Skip to content
This repository has been archived by the owner on Apr 29, 2024. It is now read-only.

Commit

Permalink
[CKO] Add balance transfer code to the CheckoutCom client (#272)
Browse files Browse the repository at this point in the history
  • Loading branch information
darshit-bolt committed Feb 15, 2024
1 parent 2010968 commit c0f1345
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
55 changes: 55 additions & 0 deletions gateways/checkoutcom/checkoutcom.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package checkoutcom

import (
"context"
"errors"
"net/http"
"strconv"

"github.com/checkout/checkout-sdk-go/transfers"

"github.com/checkout/checkout-sdk-go/configuration"
"github.com/checkout/checkout-sdk-go/payments/nas"

Expand All @@ -30,6 +33,7 @@ type CheckoutComClient struct {
}

const AcceptedStatusCode = 202
const CreatedStatusCode = 201

// NewClient creates a CheckoutComClient
// Note: PCID is optional to support legacy checkout.com merchants whose PCID is linked to their API key.
Expand Down Expand Up @@ -66,6 +70,18 @@ func (client *CheckoutComClient) generateCheckoutDCClient() (*nas.Client, error)
return api.Payments, nil
}

func (client *CheckoutComClient) generateCheckoutTransfersClient() (*transfers.Client, error) {
api, err := checkout.Builder().
StaticKeys().
WithEnvironment(client.env).
WithSecretKey(client.apiKey).
Build()
if err != nil {
return nil, err
}
return api.Transfers, nil
}

// Authorize a transaction for specified amount
func (client *CheckoutComClient) Authorize(request *sleet.AuthorizationRequest) (*sleet.AuthorizationResponse, error) {
return client.AuthorizeWithContext(context.TODO(), request)
Expand Down Expand Up @@ -228,3 +244,42 @@ func (client *CheckoutComClient) VoidWithContext(ctx context.Context, request *s
}, nil
}
}

// BalanceTransfer transfers funds from a source account to a destination account
func (client *CheckoutComClient) BalanceTransfer(request *BalanceTransferRequest) (*BalanceTransferResponse, error) {
return client.BalanceTransferWithContext(context.TODO(), request)
}

// BalanceTransferWithContext transfers funds from a source account to a destination account
// NOTE -- checkout's SDK does not support context...
func (client *CheckoutComClient) BalanceTransferWithContext(ctx context.Context, request *BalanceTransferRequest) (*BalanceTransferResponse, error) {
checkoutComClient, err := client.generateCheckoutTransfersClient()
if err != nil {
return nil, err
}
if request == nil {
return nil, errors.New("balance transfer request are missing")
}
if request.IdempotencyKey == nil {
return nil, errors.New("idempotency key is required")
}
input, err := buildBalanceTransferParams(*request)
if err != nil {
return nil, err
}

response, err := checkoutComClient.InitiateTransferOfFounds(*input, request.IdempotencyKey)
if err != nil {
return &BalanceTransferResponse{Success: false, ErrorCode: common.SPtr(err.Error())}, err
}

if response.HttpMetadata.StatusCode == AcceptedStatusCode || response.HttpMetadata.StatusCode == CreatedStatusCode {
return &BalanceTransferResponse{Success: true, TransferID: &response.Id}, nil
} else {
return &BalanceTransferResponse{
Success: false,
ErrorCode: common.SPtr(strconv.Itoa(response.HttpMetadata.StatusCode)),
TransferID: &response.Id,
}, nil
}
}
20 changes: 20 additions & 0 deletions gateways/checkoutcom/request_builder.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package checkoutcom

import (
"errors"

checkout_com_common "github.com/checkout/checkout-sdk-go/common"
"github.com/checkout/checkout-sdk-go/payments"
"github.com/checkout/checkout-sdk-go/payments/abc/sources"
"github.com/checkout/checkout-sdk-go/payments/nas"
"github.com/checkout/checkout-sdk-go/transfers"

"github.com/BoltApp/sleet"
"github.com/BoltApp/sleet/common"
Expand Down Expand Up @@ -124,3 +127,20 @@ func buildVoidParams(voidRequest *sleet.VoidRequest) (*payments.VoidRequest, err

return request, nil
}

func buildBalanceTransferParams(transferRequest BalanceTransferRequest) (*transfers.TransferRequest, error) {
if transferRequest.TransferType == nil {
return nil, errors.New("transfer type must be provided")
}
return &transfers.TransferRequest{
Source: &transfers.TransferSourceRequest{
Id: transferRequest.Source,
Amount: transferRequest.Amount,
},
Destination: &transfers.TransferDestinationRequest{
Id: transferRequest.Destination,
},
TransferType: transfers.TransferType(*transferRequest.TransferType),
Reference: transferRequest.MerchantOrderReference,
}, nil
}
16 changes: 16 additions & 0 deletions gateways/checkoutcom/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,19 @@ const (
AVSResponseCardholderNameAndStreetAndPostalMatch AVSResponseCode = "AE6"
AVSResponseCardholderNameAndStreetMatch AVSResponseCode = "AE7"
)

type BalanceTransferRequest struct {
Source string
Destination string
Amount int64
MerchantOrderReference string
TransferType *string
IdempotencyKey *string
}

// BalanceTransferResponse indicating a successful balance transfers properties
type BalanceTransferResponse struct {
Success bool
ErrorCode *string
TransferID *string
}

0 comments on commit c0f1345

Please sign in to comment.