dashboard / erock/pico / refactor(pobj): metadata for FS #65 rss

closed · opened on 2025-04-18T16:48:09Z by erock
Help
checkout latest patchset:
ssh pr.pico.sh print pr-65 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print ps-X | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 65
add review to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add --review 65
accept PR:
ssh pr.pico.sh pr accept 65
close PR:
ssh pr.pico.sh pr close 65

Logs

erock created pr with ps-132 on 2025-04-18T16:48:09Z
erock changed status on 2025-04-18T17:17:24Z {"status":"closed"}

Patchsets

ps-132 by erock on 2025-04-18T16:48:09Z

Patchset ps-132

refactor(pobj): metadata for FS

Eric Bower
2025-04-18T16:47:39Z
Back to top

refactor(pobj): metadata for FS

pkg/pobj/storage/fs.go link
+47 -4
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
diff --git a/pkg/pobj/storage/fs.go b/pkg/pobj/storage/fs.go
index ab6b3c4..9478c2d 100644
--- a/pkg/pobj/storage/fs.go
+++ b/pkg/pobj/storage/fs.go
@@ -11,6 +11,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/jmoiron/sqlx"
 	"github.com/picosh/pico/pkg/send/utils"
 )
 
@@ -33,13 +34,48 @@ func dirSize(path string) (int64, error) {
 type StorageFS struct {
 	Dir    string
 	Logger *slog.Logger
+	Sqlx   sqlx.DB
 }
 
 var _ ObjectStorage = &StorageFS{}
 var _ ObjectStorage = (*StorageFS)(nil)
 
-func NewStorageFS(logger *slog.Logger, dir string) (*StorageFS, error) {
-	return &StorageFS{Logger: logger, Dir: dir}, nil
+func NewStorageFS(logger *slog.Logger, dir string, sqlx sqlx.DB) (*StorageFS, error) {
+	return &StorageFS{Logger: logger, Dir: dir, Sqlx: sqlx}, nil
+}
+
+type ObjInfo struct {
+	ID          string    `db:"id"`
+	Etag        string    `db:"etag"`
+	ContentType string    `db:"content_type"`
+	CreatedAt   time.Time `db:"created_at"`
+	UpdatedAt   time.Time `db:"updated_at"`
+}
+
+func (s *StorageFS) findObjInfo(name string) (*ObjInfo, error) {
+	var info ObjInfo
+	err := s.Sqlx.Get(&info, "select * from object_infos where id=?", name)
+	return &info, err
+}
+
+func (s *StorageFS) upsertObjInfo(name, etag, contentType string) error {
+	_, err := s.findObjInfo(name)
+	if err != nil {
+		row := s.Sqlx.QueryRow(
+			"update object_infos set etag=? AND content_type=? AND updated_at=?",
+			etag,
+			contentType,
+			time.Now(),
+		)
+		return row.Scan()
+	}
+	row := s.Sqlx.QueryRow(
+		"insert into object_infos (id, etag, content_type) VALUES(?, ?, ?)",
+		name,
+		etag,
+		contentType,
+	)
+	return row.Scan()
 }
 
 func (s *StorageFS) GetBucket(name string) (Bucket, error) {
@@ -100,7 +136,8 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
 		UserMetadata: map[string]string{},
 	}
 
-	dat, err := os.Open(filepath.Join(bucket.Path, fpath))
+	loc := filepath.Join(bucket.Path, fpath)
+	dat, err := os.Open(loc)
 	if err != nil {
 		return nil, objInfo, err
 	}
@@ -112,6 +149,10 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
 
 	objInfo.Size = info.Size()
 	objInfo.LastModified = info.ModTime()
+
+	i, _ := s.findObjInfo(loc)
+	objInfo.Metadata.Set("content-type", i.ContentType)
+
 	return dat, objInfo, nil
 }
 
@@ -138,7 +179,9 @@ func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, e
 		_ = os.Chtimes(loc, uTime, uTime)
 	}
 
-	return loc, size, nil
+	err = s.upsertObjInfo(loc, "", "")
+
+	return loc, size, err
 }
 
 func (s *StorageFS) DeleteObject(bucket Bucket, fpath string) error {