Antonio Mika
·
2025-03-12
main.go
1package main
2
3import (
4 "bytes"
5 "io"
6 "log/slog"
7 "path/filepath"
8 "time"
9
10 "github.com/picosh/pico/pkg/apps/prose"
11 "github.com/picosh/pico/pkg/db"
12 "github.com/picosh/pico/pkg/db/postgres"
13 sst "github.com/picosh/pico/pkg/pobj/storage"
14 sendUtils "github.com/picosh/pico/pkg/send/utils"
15 "github.com/picosh/pico/pkg/shared"
16 "github.com/picosh/pico/pkg/shared/storage"
17)
18
19func bail(err error) {
20 if err != nil {
21 panic(err)
22 }
23}
24
25func upload(logger *slog.Logger, st storage.StorageServe, bucket sst.Bucket, fpath string, rdr io.Reader) error {
26 toSite := filepath.Join("prose", fpath)
27 logger.Info("uploading object", "bucket", bucket.Name, "object", toSite)
28 buf := &bytes.Buffer{}
29 size, err := io.Copy(buf, rdr)
30 if err != nil {
31 return err
32 }
33
34 _, _, err = st.PutObject(bucket, toSite, buf, &sendUtils.FileEntry{
35 Mtime: time.Now().Unix(),
36 Size: size,
37 })
38 return err
39}
40
41func images(logger *slog.Logger, dbh db.DB, st storage.StorageServe, bucket sst.Bucket, user *db.User) error {
42 posts, err := dbh.FindPostsForUser(&db.Pager{Num: 2000, Page: 0}, user.ID, "imgs")
43 if err != nil {
44 return err
45 }
46
47 if len(posts.Data) == 0 {
48 logger.Info("user does not have any images, skipping")
49 return nil
50 }
51
52 imgBucket, err := st.GetBucket(shared.GetImgsBucketName(user.ID))
53 if err != nil {
54 logger.Info("user does not have an images dir, skipping")
55 return nil
56 }
57
58 /* imgs, err := st.ListObjects(imgBucket, "/", false)
59 if err != nil {
60 return err
61 } */
62
63 for _, posts := range posts.Data {
64 rdr, _, err := st.GetObject(imgBucket, posts.Filename)
65 if err != nil {
66 logger.Error("get object", "err", err)
67 continue
68 }
69 err = upload(logger, st, bucket, posts.Filename, rdr)
70 if err != nil {
71 return err
72 }
73 }
74
75 return nil
76}
77
78func main() {
79 cfg := prose.NewConfigSite("prose-imgs-migrate")
80 logger := cfg.Logger
81 picoDb := postgres.NewDB(cfg.DbURL, logger)
82 st, err := storage.NewStorageMinio(logger, cfg.MinioURL, cfg.MinioUser, cfg.MinioPass)
83 bail(err)
84
85 users, err := picoDb.FindUsers()
86 bail(err)
87
88 for _, user := range users {
89 if user.Name != "erock" {
90 continue
91 }
92 logger.Info("migrating user images", "user", user.Name)
93
94 bucket, err := st.UpsertBucket(shared.GetAssetBucketName(user.ID))
95 bail(err)
96 _, _ = picoDb.InsertProject(user.ID, "prose", "prose")
97 err = images(logger, picoDb, st, bucket, user)
98 if err != nil {
99 logger.Error("image uploader", "err", err)
100 }
101 }
102}