You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
2.5 KiB

package db
import (
"context"
"errors"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func Create(i DbItem) error {
i.buildKeys()
av, err := attributevalue.MarshalMap(i)
if err != nil {
return err
}
_, err = handle.client.PutItem(context.TODO(), &dynamodb.PutItemInput{
TableName: aws.String(handle.table),
Item: av,
})
if err != nil {
return err
}
return nil
}
// out must be a non-nil pointer
func Fetch(i DbItem, out interface{}) error {
i.buildKeys()
o, err := handle.client.GetItem(context.TODO(), &dynamodb.GetItemInput{
TableName: aws.String(handle.table),
Key: i.getKey(),
})
if err != nil {
return err
} else if o.Item == nil {
return NotFoundError(errors.New("item not found"))
}
err = attributevalue.UnmarshalMap(o.Item, out)
if err != nil {
return err
}
return nil
}
func FetchByGsi(i DbItem, out interface{}) error {
i.buildKeys()
o, err := handle.client.Query(context.TODO(), &dynamodb.QueryInput{
TableName: aws.String(handle.table),
IndexName: aws.String(handle.gsiName),
KeyConditionExpression: aws.String(fmt.Sprintf("%s = :%s", handle.gsiAttr, handle.gsiAttr)),
ExpressionAttributeValues: i.getGsi(),
})
if err != nil {
return err
}
if o.Count > 1 {
return MultipleItemsError(errors.New("multiple items found"))
} else if o.Count < 1 {
return NotFoundError(errors.New("item not found"))
}
err = attributevalue.UnmarshalMap(o.Items[0], out)
if err != nil {
return err
}
return nil
}
func Update(i DbItem, key string, value interface{}) error {
val, err := attributevalue.Marshal(value)
if err != nil {
return err
}
_, err = handle.client.UpdateItem(context.TODO(), &dynamodb.UpdateItemInput{
TableName: aws.String(handle.table),
Key: i.getKey(),
UpdateExpression: aws.String(fmt.Sprintf("set %s = :val", key)),
ExpressionAttributeValues: map[string]types.AttributeValue{
":val": val,
},
})
if err != nil {
return err
}
return nil
}
func MultiUpdate(i DbItem, keys []string, values []interface{}) error {
// TODO implement this
return errors.New("not implemented")
}
func Delete(i DbItem) error {
k := i.getKey()
_, err := handle.client.DeleteItem(context.TODO(), &dynamodb.DeleteItemInput{
TableName: aws.String(handle.table),
Key: k,
})
if err != nil {
return err
}
return nil
}