-
Notifications
You must be signed in to change notification settings - Fork 3
/
fs.go
86 lines (73 loc) · 1.71 KB
/
fs.go
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
package db
import (
"context"
"io"
"io/fs"
"time"
"github.com/oursky/pageship/internal/models"
"github.com/oursky/pageship/internal/site"
"github.com/oursky/pageship/internal/storage"
)
type storageFS struct {
storage *storage.Storage
modTime time.Time
prefix string
fileMap map[string]models.FileEntry
files []models.FileEntry
}
func newStorageFS(storage *storage.Storage, deployment *models.Deployment) site.FS {
files := deployment.Metadata.Files
fileMap := make(map[string]models.FileEntry)
for _, entry := range deployment.Metadata.Files {
fileMap[entry.Path] = entry
}
return &storageFS{
storage: storage,
modTime: *deployment.UploadedAt,
prefix: deployment.StorageKeyPrefix,
fileMap: fileMap,
files: files,
}
}
func (f *storageFS) lookup(path string) (models.FileEntry, bool) {
if entry, ok := f.fileMap[path]; ok {
return entry, true
}
if entry, ok := f.fileMap[path+"/"]; ok {
return entry, true
}
return models.FileEntry{}, false
}
func (f *storageFS) Stat(path string) (*site.FileInfo, error) {
entry, ok := f.lookup(path)
if !ok {
return nil, &fs.PathError{
Op: "open",
Path: path,
Err: fs.ErrNotExist,
}
}
return &site.FileInfo{
IsDir: entry.Path[len(entry.Path)-1] == '/',
ModTime: f.modTime,
Size: entry.Size,
ContentType: entry.ContentType,
Hash: entry.Hash,
}, nil
}
func (f *storageFS) Open(ctx context.Context, path string) (io.ReadSeekCloser, error) {
entry, ok := f.lookup(path)
if !ok {
return nil, &fs.PathError{
Op: "open",
Path: path,
Err: fs.ErrNotExist,
}
}
key := f.prefix + entry.Path
reader, err := f.storage.OpenRead(ctx, key)
if err != nil {
return nil, err
}
return reader, nil
}