/
builder_putitem.go
83 lines (64 loc) · 1.97 KB
/
builder_putitem.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
package ddb
import (
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
//go:generate mockery --name PutItemBuilder
type PutItemBuilder interface {
WithCondition(cond expression.ConditionBuilder) PutItemBuilder
ReturnNone() PutItemBuilder
ReturnAllOld() PutItemBuilder
Build(item interface{}) (*dynamodb.PutItemInput, error)
}
type putItemBuilder struct {
metadata *Metadata
condition *expression.ConditionBuilder
returnType types.ReturnValue
}
func NewPutItemBuilder(metadata *Metadata) PutItemBuilder {
return &putItemBuilder{
metadata: metadata,
}
}
func (b *putItemBuilder) WithCondition(cond expression.ConditionBuilder) PutItemBuilder {
b.condition = &cond
return b
}
func (b *putItemBuilder) ReturnNone() PutItemBuilder {
b.returnType = types.ReturnValueNone
return b
}
func (b *putItemBuilder) ReturnAllOld() PutItemBuilder {
b.returnType = types.ReturnValueAllOld
return b
}
func (b *putItemBuilder) Build(item interface{}) (*dynamodb.PutItemInput, error) {
if b.returnType != "" && b.returnType != types.ReturnValueNone && !isPointer(item) {
return nil, fmt.Errorf("the provided old value has to be a pointer")
}
var err error
expr := expression.Expression{}
if b.condition != nil {
expr, err = expression.NewBuilder().WithCondition(*b.condition).Build()
}
if err != nil {
return nil, fmt.Errorf("could not build condition: %w", err)
}
input := &dynamodb.PutItemInput{
TableName: aws.String(b.metadata.TableName),
ExpressionAttributeNames: expr.Names(),
ExpressionAttributeValues: expr.Values(),
ConditionExpression: expr.Condition(),
ReturnConsumedCapacity: types.ReturnConsumedCapacityIndexes,
ReturnValues: b.returnType,
}
marshalled, err := MarshalMap(item)
if err != nil {
return nil, err
}
input.Item = marshalled
return input, err
}