1package s3
2
3import (
4	"fmt"
5	"strings"
6
7	awss3 "github.com/aws/aws-sdk-go/service/s3"
8	"github.com/genevieve/leftovers/common"
9)
10
11type bucketsClient interface {
12	ListBuckets(*awss3.ListBucketsInput) (*awss3.ListBucketsOutput, error)
13	DeleteBucket(*awss3.DeleteBucketInput) (*awss3.DeleteBucketOutput, error)
14
15	ListObjectVersions(*awss3.ListObjectVersionsInput) (*awss3.ListObjectVersionsOutput, error)
16	DeleteObjects(*awss3.DeleteObjectsInput) (*awss3.DeleteObjectsOutput, error)
17}
18
19type Buckets struct {
20	client  bucketsClient
21	logger  logger
22	manager bucketManager
23}
24
25func NewBuckets(client bucketsClient, logger logger, manager bucketManager) Buckets {
26	return Buckets{
27		client:  client,
28		logger:  logger,
29		manager: manager,
30	}
31}
32
33func (b Buckets) List(filter string) ([]common.Deletable, error) {
34	buckets, err := b.client.ListBuckets(&awss3.ListBucketsInput{})
35	if err != nil {
36		return nil, fmt.Errorf("Listing S3 Buckets: %s", err)
37	}
38
39	var resources []common.Deletable
40	for _, bucket := range buckets.Buckets {
41		r := NewBucket(b.client, bucket.Name)
42
43		if !strings.Contains(r.Name(), filter) {
44			continue
45		}
46
47		if !b.manager.IsInRegion(r.Name()) {
48			continue
49		}
50
51		proceed := b.logger.PromptWithDetails(r.Type(), r.Name())
52		if !proceed {
53			continue
54		}
55
56		resources = append(resources, r)
57	}
58
59	return resources, nil
60}
61
62func (b Buckets) Type() string {
63	return "s3-bucket"
64}
65