/
payment.go
78 lines (66 loc) · 1.93 KB
/
payment.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package datastore
import (
"os"
"github.com/genki-sano/money-maneger-server/package/domains"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
// PaymentDatastore は支払情報関連のデータストアです
type PaymentDatastore interface {
GetAll() ([]*domains.Payment, error)
}
// PaymentDatabase は支払情報関連のデータストアの構造体です
type PaymentDatabase struct{}
// NewPaymentDatastore はPaymentDatabaseを返します
func NewPaymentDatastore() PaymentDatastore {
return &PaymentDatabase{}
}
// GetAll は支払情報を全件取得します
func (d *PaymentDatabase) GetAll() (payments []*domains.Payment, err error) {
email := os.Getenv("GOOGLE_SERVICE_ACCOUNT_EMAIL")
key := os.Getenv("GOOGLE_SERVICE_ACCOUNT_PLIVATE_KEY")
srv, err := newSheetService(email, key)
if err != nil {
return nil, err
}
spreadsheetID := os.Getenv("GOOGLE_SPREDSHEET_ID")
valueRange := os.Getenv("GOOGLE_SPREDSHEET_RANGE")
resp, err := srv.Spreadsheets.Values.Get(spreadsheetID, valueRange).Do()
if err != nil {
return nil, err
}
return generatePayment(resp)
}
func newSheetService(email string, key string) (*sheets.Service, error) {
scopes := []string{
"https://www.googleapis.com/auth/spreadsheets.readonly",
}
conf := &jwt.Config{
Email: email,
PrivateKey: []byte(key),
TokenURL: google.JWTTokenURL,
Scopes: scopes,
}
client := conf.Client(oauth2.NoContext)
return sheets.New(client)
}
func generatePayment(r *sheets.ValueRange) (payments []*domains.Payment, err error) {
payments = make([]*domains.Payment, 0)
if len(r.Values) == 0 {
return payments, nil
}
for _, items := range r.Values {
payment := domains.NewPayment(
items[0].(string),
items[1].(string),
items[2].(string),
items[3].(string),
items[4].(string),
items[5].(string),
)
payments = append(payments, payment)
}
return payments, nil
}