repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / cmd / scripts / rm-old-buckets
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}