repos / pico

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

commit
c26a047
parent
532a539
author
Eric Bower
date
2026-04-20 20:39:24 -0400 EDT
refactor(storage): put accepts ObjectInfo instead of FileEntry

This is a symmetric change so everything uses the same objects
7 files changed,  +41, -16
M pkg/apps/pgs/uploader.go
+20, -3
 1@@ -275,6 +275,14 @@ func findPlusFF(dbpool pgsdb.PgsDB, cfg *PgsConfig, userID string) *db.FeatureFl
 2 	return ff
 3 }
 4 
 5+func mtimeToTime(entry *sendutils.FileEntry) time.Time {
 6+	var mtime time.Time
 7+	if entry.Mtime > 0 {
 8+		return time.Unix(entry.Mtime, 0)
 9+	}
10+	return mtime
11+}
12+
13 func (h *UploadAssetHandler) Write(s *pssh.SSHServerConnSession, entry *sendutils.FileEntry) (string, error) {
14 	logger := pssh.GetLogger(s)
15 	user := pssh.GetUser(s)
16@@ -322,12 +330,15 @@ func (h *UploadAssetHandler) Write(s *pssh.SSHServerConnSession, entry *sendutil
17 		return "", fmt.Errorf(msg, project.Blocked)
18 	}
19 
20+	info := &storage.ObjectInfo{
21+		LastModified: mtimeToTime(entry),
22+	}
23 	if entry.Mode.IsDir() {
24 		_, _, err := h.Cfg.Storage.PutObject(
25 			bucket,
26 			path.Join(shared.GetAssetFileName(entry), "._pico_keep_dir"),
27 			bytes.NewReader([]byte{}),
28-			entry,
29+			info,
30 		)
31 		return "", err
32 	}
33@@ -498,11 +509,14 @@ func (h *UploadAssetHandler) Delete(s *pssh.SSHServerConnSession, entry *senduti
34 	})
35 
36 	if len(sibs) == 0 {
37+		info := &storage.ObjectInfo{
38+			LastModified: mtimeToTime(entry),
39+		}
40 		_, _, err := h.Cfg.Storage.PutObject(
41 			bucket,
42 			filepath.Join(pathDir, "._pico_keep_dir"),
43 			bytes.NewReader([]byte{}),
44-			entry,
45+			info,
46 		)
47 		if err != nil {
48 			return err
49@@ -555,11 +569,14 @@ func (h *UploadAssetHandler) writeAsset(s *pssh.SSHServerConnSession, reader io.
50 		"filename", assetFilepath,
51 	)
52 
53+	info := &storage.ObjectInfo{
54+		LastModified: mtimeToTime(data.FileEntry),
55+	}
56 	_, fsize, err := h.Cfg.Storage.PutObject(
57 		data.Bucket,
58 		assetFilepath,
59 		reader,
60-		data.FileEntry,
61+		info,
62 	)
63 	return fsize, err
64 }
M pkg/filehandlers/imgs/handler.go
+1, -1
1@@ -289,7 +289,7 @@ func (h *UploadImgHandler) metaImg(data *PostMetaData) error {
2 		bucket,
3 		h.getObjectPath(data.Filename),
4 		sendutils.NopReadAndReaderAtCloser(reader),
5-		&sendutils.FileEntry{},
6+		&storage.ObjectInfo{},
7 	)
8 	if err != nil {
9 		return err
M pkg/storage/fs.go
+3, -3
 1@@ -148,7 +148,7 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
 2 	return dat, objInfo, nil
 3 }
 4 
 5-func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, entry *utils.FileEntry) (string, int64, error) {
 6+func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, info *ObjectInfo) (string, int64, error) {
 7 	loc := filepath.Join(bucket.Path, fpath)
 8 	err := os.MkdirAll(filepath.Dir(loc), os.ModePerm)
 9 	if err != nil {
10@@ -168,8 +168,8 @@ func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, e
11 		return "", 0, err
12 	}
13 
14-	if entry.Mtime > 0 {
15-		uTime := time.Unix(entry.Mtime, 0)
16+	if !info.LastModified.IsZero() {
17+		uTime := info.LastModified
18 		_ = os.Chtimes(loc, uTime, uTime)
19 	}
20 
M pkg/storage/fs_test.go
+6, -6
 1@@ -58,8 +58,8 @@ func TestFsAdapter(t *testing.T) {
 2 
 3 	str := "here is a test file"
 4 	reader := strings.NewReader(str)
 5-	actualPath, size, err := st.PutObject(bucket, "./nice/test.txt", reader, &utils.FileEntry{
 6-		Mtime: modTime.Unix(),
 7+	actualPath, size, err := st.PutObject(bucket, "./nice/test.txt", reader, &ObjectInfo{
 8+		LastModified: modTime,
 9 	})
10 	if err != nil {
11 		t.Fatal(err)
12@@ -98,8 +98,8 @@ func TestFsAdapter(t *testing.T) {
13 
14 	str = "a deeply nested test file"
15 	reader = strings.NewReader(str)
16-	_, _, err = st.PutObject(bucket, "./here/we/go/again.txt", reader, &utils.FileEntry{
17-		Mtime: modTime.Unix(),
18+	_, _, err = st.PutObject(bucket, "./here/we/go/again.txt", reader, &ObjectInfo{
19+		LastModified: modTime,
20 	})
21 	if err != nil {
22 		t.Fatal(err)
23@@ -193,8 +193,8 @@ func TestFsAdapter(t *testing.T) {
24 
25 	str = "a deeply nested test file"
26 	reader = strings.NewReader(str)
27-	_, _, err = st.PutObject(bucket, "./here/yes/we/can.txt", reader, &utils.FileEntry{
28-		Mtime: modTime.Unix(),
29+	_, _, err = st.PutObject(bucket, "./here/yes/we/can.txt", reader, &ObjectInfo{
30+		LastModified: modTime,
31 	})
32 	if err != nil {
33 		t.Fatal(err)
M pkg/storage/handler.go
+9, -1
 1@@ -252,11 +252,19 @@ func (h *UploadAssetHandler) writeAsset(s *pssh.SSHServerConnSession, data *File
 2 		objectFileName,
 3 	)
 4 
 5+	var mtime time.Time
 6+	if data.Mtime > 0 {
 7+		mtime = time.Unix(data.Mtime, 0)
 8+	}
 9+	info := &ObjectInfo{
10+		LastModified: mtime,
11+	}
12+
13 	_, _, err = h.Cfg.Storage.PutObject(
14 		data.Bucket,
15 		objectFileName,
16 		utils.NopReadAndReaderAtCloser(reader),
17-		data.FileEntry,
18+		info,
19 	)
20 	if err != nil {
21 		return err
M pkg/storage/memory.go
+1, -1
1@@ -105,7 +105,7 @@ func (s *StorageMemory) GetObject(bucket Bucket, fpath string) (utils.ReadAndRea
2 	return &seekableReader{bytes.NewReader([]byte(dat))}, objInfo, nil
3 }
4 
5-func (s *StorageMemory) PutObject(bucket Bucket, fpath string, contents io.Reader, entry *utils.FileEntry) (string, int64, error) {
6+func (s *StorageMemory) PutObject(bucket Bucket, fpath string, contents io.Reader, info *ObjectInfo) (string, int64, error) {
7 	s.mu.Lock()
8 	defer s.mu.Unlock()
9 
M pkg/storage/storage.go
+1, -1
1@@ -32,7 +32,7 @@ type BucketStorage interface {
2 
3 type ObjectStorage interface {
4 	GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderAtCloser, *ObjectInfo, error)
5-	PutObject(bucket Bucket, fpath string, contents io.Reader, entry *utils.FileEntry) (string, int64, error)
6+	PutObject(bucket Bucket, fpath string, contents io.Reader, info *ObjectInfo) (string, int64, error)
7 	DeleteObject(bucket Bucket, fpath string) error
8 	ListObjects(bucket Bucket, dir string, recursive bool) ([]os.FileInfo, error)
9 }