/
dynamo.go
118 lines (105 loc) · 2.69 KB
/
dynamo.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package facebook
import (
"errors"
"bitbucket.org/backend/core/entities"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
type dynamo struct {
svc *dynamodb.DynamoDB
}
// NewFacebook isntanciates a session dynamo session to query information
// about users' Facebook accounts
func NewFacebook(sess *session.Session) Storage {
return &dynamo{
svc: dynamodb.New(sess),
}
}
const (
// TableName is the table used to store the data
TableName = "trinacia"
)
var (
// ErrorMissingUserID missing user ID
ErrorMissingUserID = errors.New("Missing User ID")
// ErrorMissingFacebook nil pointer reference to facebook
ErrorMissingFacebook = errors.New("Nil pointer reference passed as Facebook entitie")
// ErrorMissingFacebookAccessToken missing facebook access token
ErrorMissingFacebookAccessToken = errors.New("Missing facebook access token")
)
func (d *dynamo) StoreFacebook(userID string, f *entities.Facebook) error {
if userID == "" {
return ErrorMissingUserID
}
if f == nil {
return ErrorMissingFacebook
}
if f.AccessToken == "" {
return ErrorMissingFacebookAccessToken
}
pages, err := dynamodbattribute.Marshal(f.Pages)
if err != nil {
return err
}
adAccounts, err := dynamodbattribute.Marshal(f.AdAccounts)
if err != nil {
return err
}
in := &dynamodb.UpdateItemInput{
TableName: aws.String(TableName),
Key: map[string]*dynamodb.AttributeValue{
"partition": {
S: aws.String(userID),
},
"key": {
S: aws.String("facebook"),
},
},
ExpressionAttributeNames: map[string]*string{
"#accessToken": aws.String("access_token"),
"#pages": aws.String("pages"),
"#adAccounts": aws.String("ad_accounts"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":accessToken": {
S: aws.String(f.AccessToken),
},
":pages": pages,
":adAccounts": adAccounts,
},
UpdateExpression: aws.String("set #accessToken=:accessToken, #pages=:pages, #adAccounts=:adAccounts"),
}
_, err = d.svc.UpdateItem(in)
if err != nil {
return err
}
return nil
}
func (d *dynamo) GetFacebook(userID string) (*entities.Facebook, error) {
if userID == "" {
return nil, ErrorMissingUserID
}
f := &entities.Facebook{}
in := &dynamodb.GetItemInput{
TableName: aws.String(TableName),
Key: map[string]*dynamodb.AttributeValue{
"partition": {
S: aws.String(userID),
},
"key": {
S: aws.String("facebook"),
},
},
}
out, err := d.svc.GetItem(in)
if err != nil {
return nil, err
}
err = dynamodbattribute.UnmarshalMap(out.Item, f)
if err != nil {
return nil, err
}
return f, nil
}