repos / pico

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

pico / cmd / scripts / prose-imgs-migrate
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}