Test Setup Failed
Push — main ( ca941c...e4ed3b )
by Acho
02:26
created

mtnmomo.*collectionService.refreshToken   A

Complexity

Conditions 3

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 11
nop 1
dl 0
loc 17
rs 9.85
c 0
b 0
f 0
1
package mtnmomo
2
3
import (
4
	"context"
5
	"encoding/json"
6
	"net/http"
7
	"time"
8
)
9
10
// collectionService is the API client for the `/collection` endpoint
11
type collectionService service
12
13
// Token is used to create an access token which can then be used to authorize and authenticate towards the other end-points of the API.
14
//
15
// API Docs: https://momodeveloper.mtn.com/docs/services/collection/operations/token-POST
16
func (service *collectionService) Token(ctx context.Context) (*AuthToken, *Response, error) {
17
	request, err := service.client.newRequest(ctx, http.MethodPost, "/collection/token/", nil)
18
	if err != nil {
19
		return nil, nil, err
20
	}
21
22
	service.client.addBasicAuth(request)
23
24
	response, err := service.client.do(request)
25
	if err != nil {
26
		return nil, nil, err
27
	}
28
29
	authToken := new(AuthToken)
30
	if err = json.Unmarshal(*response.Body, authToken); err != nil {
31
		return nil, response, err
32
	}
33
34
	return authToken, response, err
35
}
36
37
// RequestToPay is used to request a payment from a consumer (Payer).
38
//
39
// API Docs: https://momodeveloper.mtn.com/docs/services/collection/operations/requesttopay-POST
40
func (service *collectionService) RequestToPay(
41
	ctx context.Context,
42
	referenceID string,
43
	params *RequestToPayParams,
44
	callbackURL *string,
45
) (*Response, error) {
46
	err := service.refreshToken(ctx)
47
	if err != nil {
48
		return nil, err
49
	}
50
51
	request, err := service.client.newRequest(ctx, http.MethodPost, "/collection/v1_0/requesttopay", params)
52
	if err != nil {
53
		return nil, err
54
	}
55
56
	if callbackURL != nil && len(*callbackURL) != 0 {
57
		service.client.addCallbackURL(request, *callbackURL)
58
	}
59
60
	service.client.addTargetEnvironment(request)
61
	service.client.addReferenceID(request, referenceID)
62
	service.client.addCollectionAccessToken(request)
63
64
	response, err := service.client.do(request)
65
	return response, err
66
}
67
68
func (service *collectionService) tokenIsValid() bool {
69
	return time.Now().UTC().Unix() < service.client.collectionAccessTokenExpiresAt
70
}
71
72
func (service *collectionService) refreshToken(ctx context.Context) error {
73
	service.client.collectionLock.Lock()
74
	defer service.client.collectionLock.Unlock()
75
76
	if service.tokenIsValid() {
77
		return nil
78
	}
79
80
	token, _, err := service.Token(ctx)
81
	if err != nil {
82
		return err
83
	}
84
85
	service.client.collectionAccessToken = token.AccessToken
86
	service.client.collectionAccessTokenExpiresAt = time.Now().UTC().Unix() + token.ExpiresIn - 100
87
88
	return nil
89
}
90