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.
74 lines
2.1 KiB
74 lines
2.1 KiB
package main |
|
|
|
import ( |
|
"github.com/aws/aws-sdk-go/aws" |
|
d "github.com/aws/aws-sdk-go/service/dynamodb" |
|
da "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" |
|
"github.com/aws/aws-sdk-go/service/dynamodb/expression" |
|
) |
|
|
|
// GetDevice is to get a device from id |
|
func GetDevice(svc *d.DynamoDB, deviceID string) (Device, error) { |
|
var device Device |
|
input := &d.GetItemInput{ |
|
Key: map[string]*d.AttributeValue{ |
|
"device": { |
|
S: aws.String(deviceID), |
|
}, |
|
}, |
|
TableName: aws.String("iot-item"), |
|
} |
|
result, err := svc.GetItem(input) |
|
if err != nil { |
|
return device, err |
|
} |
|
err = da.UnmarshalMap(result.Item, &device) |
|
if err != nil { |
|
return device, err |
|
} |
|
return device, nil |
|
} |
|
|
|
// GetDevices is to get all devices we know |
|
func GetDevices(svc *d.DynamoDB) (*d.ScanOutput, error) { |
|
|
|
proj := expression.NamesList( |
|
expression.Name("device"), |
|
expression.Name("group"), |
|
expression.Name("name")) |
|
|
|
expr, _ := expression.NewBuilder().WithProjection(proj).Build() |
|
|
|
// Build the query input parameters |
|
params := &d.ScanInput{ |
|
ExpressionAttributeNames: expr.Names(), |
|
ExpressionAttributeValues: expr.Values(), |
|
ProjectionExpression: expr.Projection(), |
|
TableName: aws.String("iot-item"), |
|
} |
|
return svc.Scan(params) |
|
} |
|
|
|
// GetHistory is a query history for any device |
|
func GetHistory(svc *d.DynamoDB, deviceID string, limit int64) (*d.QueryOutput, error) { |
|
keyCond := expression.Key("device").Equal(expression.Value(deviceID)) |
|
qProj := expression.NamesList( |
|
expression.Name("device"), |
|
expression.Name("timestamp"), |
|
expression.Name("info"), |
|
expression.Name("data")) |
|
|
|
qBuilder := expression.NewBuilder().WithKeyCondition(keyCond).WithProjection(qProj) |
|
qExpression, _ := qBuilder.Build() |
|
|
|
queryInput := &d.QueryInput{ |
|
KeyConditionExpression: qExpression.KeyCondition(), |
|
ProjectionExpression: qExpression.Projection(), |
|
ExpressionAttributeNames: qExpression.Names(), |
|
ExpressionAttributeValues: qExpression.Values(), |
|
ScanIndexForward: aws.Bool(false), |
|
TableName: aws.String("iot-logger"), |
|
Limit: aws.Int64(limit), |
|
} |
|
return svc.Query(queryInput) |
|
}
|
|
|