2022-03-23 00:56:33 +00:00
|
|
|
package tables
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2022-03-23 04:40:31 +00:00
|
|
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
2022-03-23 00:56:33 +00:00
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"sort"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Service struct {
|
|
|
|
provider TableProvider
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewService(provider TableProvider) *Service {
|
|
|
|
return &Service{
|
|
|
|
provider: provider,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Service) Scan(ctx context.Context, table string) (*models.ResultSet, error) {
|
|
|
|
results, err := s.provider.ScanItems(ctx, table)
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrapf(err, "unable to scan table %v", table)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: need to get PKs and SKs from table
|
2022-03-23 11:02:46 +00:00
|
|
|
pk, sk := "pk", "sk"
|
|
|
|
|
|
|
|
// Get the columns
|
2022-03-23 00:56:33 +00:00
|
|
|
seenColumns := make(map[string]int)
|
2022-03-23 11:02:46 +00:00
|
|
|
seenColumns[pk] = 0
|
|
|
|
seenColumns[sk] = 1
|
2022-03-23 00:56:33 +00:00
|
|
|
|
|
|
|
for _, result := range results {
|
|
|
|
for k := range result {
|
|
|
|
if _, isSeen := seenColumns[k]; !isSeen {
|
2022-03-23 11:02:46 +00:00
|
|
|
seenColumns[k] = 2
|
2022-03-23 00:56:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
columns := make([]string, 0, len(seenColumns))
|
|
|
|
for k := range seenColumns {
|
|
|
|
columns = append(columns, k)
|
|
|
|
}
|
|
|
|
sort.Slice(columns, func(i, j int) bool {
|
2022-03-23 11:02:46 +00:00
|
|
|
if seenColumns[columns[i]] == seenColumns[columns[j]] {
|
|
|
|
return columns[i] < columns[j]
|
|
|
|
}
|
2022-03-23 00:56:33 +00:00
|
|
|
return seenColumns[columns[i]] < seenColumns[columns[j]]
|
|
|
|
})
|
|
|
|
|
2022-03-23 11:02:46 +00:00
|
|
|
models.Sort(results, pk, sk)
|
|
|
|
|
2022-03-23 00:56:33 +00:00
|
|
|
return &models.ResultSet{
|
2022-03-23 21:49:09 +00:00
|
|
|
Table: table,
|
2022-03-23 00:56:33 +00:00
|
|
|
Columns: columns,
|
2022-03-23 11:02:46 +00:00
|
|
|
Items: results,
|
2022-03-23 00:56:33 +00:00
|
|
|
}, nil
|
|
|
|
}
|
2022-03-23 04:40:31 +00:00
|
|
|
|
2022-03-24 01:54:32 +00:00
|
|
|
func (s *Service) Put(ctx context.Context, tableName string, item models.Item) error {
|
|
|
|
return s.provider.PutItem(ctx, tableName, item)
|
|
|
|
}
|
|
|
|
|
2022-03-23 04:40:31 +00:00
|
|
|
func (s *Service) Delete(ctx context.Context, name string, item models.Item) error {
|
|
|
|
// TODO: do not hardcode keys
|
|
|
|
return s.provider.DeleteItem(ctx, name, map[string]types.AttributeValue{
|
|
|
|
"pk": item["pk"],
|
|
|
|
"sk": item["sk"],
|
|
|
|
})
|
|
|
|
}
|