2019-04-15 03:56:55 +00:00
|
|
|
package repositories
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/aws/aws-sdk-go-v2/aws/external"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb/dynamodbattribute"
|
|
|
|
"github.com/mitchell/selfpass/credentials/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewDynamoTable(name string) DynamoTable {
|
|
|
|
cfg, err := external.LoadDefaultAWSConfig()
|
|
|
|
if err != nil {
|
|
|
|
panic(err.Error())
|
|
|
|
}
|
|
|
|
return DynamoTable{
|
|
|
|
name: name,
|
|
|
|
svc: dynamodb.New(cfg),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type DynamoTable struct {
|
|
|
|
name string
|
|
|
|
svc *dynamodb.DynamoDB
|
|
|
|
}
|
|
|
|
|
2019-05-06 00:56:27 +00:00
|
|
|
func (t DynamoTable) GetAllMetadata(ctx context.Context, sourceHost string, errch chan<- error) (output <-chan types.Metadata) {
|
2019-04-15 03:56:55 +00:00
|
|
|
mdch := make(chan types.Metadata, 1)
|
|
|
|
in := &dynamodb.ScanInput{TableName: &t.name}
|
|
|
|
|
2019-05-06 00:56:27 +00:00
|
|
|
if sourceHost != "" {
|
2019-04-15 03:56:55 +00:00
|
|
|
filterExpr := "SourceHost = :sh"
|
|
|
|
in.FilterExpression = &filterExpr
|
|
|
|
in.ExpressionAttributeValues = map[string]dynamodb.AttributeValue{
|
2019-05-06 00:56:27 +00:00
|
|
|
":sh": {S: &sourceHost},
|
2019-04-15 03:56:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
req := t.svc.ScanRequest(in)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
defer close(mdch)
|
|
|
|
|
|
|
|
pgr := req.Paginate()
|
|
|
|
for pgr.Next() {
|
|
|
|
mds := []types.Metadata{}
|
|
|
|
out := pgr.CurrentPage()
|
|
|
|
if err := dynamodbattribute.UnmarshalListOfMaps(out.Items, &mds); err != nil {
|
|
|
|
errch <- err
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, md := range mds {
|
|
|
|
mdch <- md
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := pgr.Err(); err != nil {
|
|
|
|
errch <- err
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return mdch
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t DynamoTable) Get(ctx context.Context, id string) (output types.Credential, err error) {
|
|
|
|
req := t.svc.GetItemRequest(&dynamodb.GetItemInput{
|
|
|
|
TableName: &t.name,
|
|
|
|
Key: map[string]dynamodb.AttributeValue{
|
|
|
|
"ID": {S: &id},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
out, err := req.Send()
|
|
|
|
if err != nil {
|
|
|
|
return output, err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = dynamodbattribute.UnmarshalMap(out.Item, &output)
|
|
|
|
return output, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t DynamoTable) Put(ctx context.Context, c types.Credential) (err error) {
|
|
|
|
item, err := dynamodbattribute.MarshalMap(c)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
req := t.svc.PutItemRequest(&dynamodb.PutItemInput{
|
|
|
|
TableName: &t.name,
|
|
|
|
Item: item,
|
|
|
|
})
|
|
|
|
req.SetContext(ctx)
|
|
|
|
|
|
|
|
_, err = req.Send()
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t DynamoTable) Delete(ctx context.Context, id string) (err error) {
|
|
|
|
req := t.svc.DeleteItemRequest(&dynamodb.DeleteItemInput{
|
|
|
|
TableName: &t.name,
|
|
|
|
Key: map[string]dynamodb.AttributeValue{
|
|
|
|
"ID": {S: &id},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
_, err = req.Send()
|
|
|
|
return err
|
|
|
|
}
|