/
search.go
55 lines (46 loc) · 1.47 KB
/
search.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
package aws
import (
"github.com/MichaelPalmer1/scoutr-go/pkg/providers/base"
"github.com/MichaelPalmer1/scoutr-go/pkg/types"
"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"
log "github.com/sirupsen/logrus"
)
// Search : Search items in the table
func (api DynamoAPI) Search(req types.Request, key string, values []string) ([]types.Record, error) {
// Get the user
user, err := api.InitializeRequest(req)
if err != nil {
// Bad user - pass the error through
return nil, err
}
input := &dynamodb.ScanInput{
TableName: aws.String(api.Config.DataTable),
}
// Build filters
conditions, err := api.filtering.MultiFilter(user, key, values)
if err != nil {
log.Errorln("Error encountered during filtering", err)
return nil, err
}
expr, err := expression.NewBuilder().WithFilter(conditions.(expression.ConditionBuilder)).Build()
if err != nil {
log.Errorln("Failed to build expression", err)
}
// Update scan input
input.FilterExpression = expr.Filter()
input.ExpressionAttributeNames = expr.Names()
input.ExpressionAttributeValues = expr.Values()
// Download the data
data, err := Scan[types.Record](api.Client, input)
if err != nil {
log.Errorln("Error while attempting to list records", err)
return nil, err
}
// Filter the response
api.PostProcess(data, user)
// Create audit log
api.auditLog(base.AuditActionSearch, req, user, nil, nil)
return data, nil
}