Antonio Mika
·
2025-03-12
rm-old-buckets.go
1package main
2
3import (
4 "context"
5 "net/url"
6
7 "github.com/minio/minio-go/v7"
8 "github.com/minio/minio-go/v7/pkg/credentials"
9 "github.com/picosh/pico/pkg/apps/prose"
10 "github.com/picosh/pico/pkg/db/postgres"
11 "github.com/picosh/pico/pkg/shared"
12)
13
14func bail(err error) {
15 if err != nil {
16 panic(err)
17 }
18}
19
20func main() {
21 cfg := prose.NewConfigSite("prose-rm-old-buckets")
22 logger := cfg.Logger
23 picoDb := postgres.NewDB(cfg.DbURL, logger)
24 endpoint, err := url.Parse(cfg.MinioURL)
25 bail(err)
26 ssl := endpoint.Scheme == "https"
27 mClient, err := minio.New(endpoint.Host, &minio.Options{
28 Creds: credentials.NewStaticV4(cfg.MinioUser, cfg.MinioPass, ""),
29 Secure: ssl,
30 })
31 bail(err)
32
33 users, err := picoDb.FindUsers()
34 bail(err)
35 ctx := context.TODO()
36
37 for _, user := range users {
38 logger.Info("deleting old buckets", "user", user.Name)
39 bucketName := shared.GetImgsBucketName(user.ID)
40
41 exists, err := mClient.BucketExists(ctx, bucketName)
42 if err != nil {
43 logger.Error("bucket exists", "err", err)
44 }
45
46 if !exists {
47 continue
48 }
49
50 objectsCh := make(chan minio.ObjectInfo)
51 go func() {
52 defer close(objectsCh)
53 opts := minio.ListObjectsOptions{Prefix: "", Recursive: true}
54 for object := range mClient.ListObjects(ctx, bucketName, opts) {
55 logger.Info("object", "name", object.Key)
56 if object.Err != nil {
57 logger.Error("list objects", "err", err)
58 }
59 objectsCh <- object
60 }
61 }()
62
63 errorCh := mClient.RemoveObjects(ctx, bucketName, objectsCh, minio.RemoveObjectsOptions{})
64
65 for e := range errorCh {
66 logger.Error("remove obj", "err", e)
67 }
68
69 logger.Info("removing bucket", "user", user.Name, "bucket", bucketName)
70 err = mClient.RemoveBucket(ctx, bucketName)
71 if err != nil {
72 logger.Error("remove bucket", "err", err)
73 }
74
75 logger.Info("Success!", "user", user.Name)
76 }
77}