diff options
| author | Paul Buetow <paul@buetow.org> | 2024-05-25 22:56:20 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-05-25 22:56:20 +0300 |
| commit | b3bddfd992c33a02628d4a5d0586774228776dc9 (patch) | |
| tree | 304dd4f3a0c1fdda7e2cab4687a4b52c52c4891c | |
| parent | 3a58b507247291bdbeceeba0d6816797893d4cc7 (diff) | |
initial VFS
| -rw-r--r-- | internal/io.go | 16 | ||||
| -rw-r--r-- | internal/server/handler/handler.go | 6 | ||||
| -rw-r--r-- | internal/server/repository/repository.go | 54 | ||||
| -rw-r--r-- | internal/types/entry.go | 30 |
4 files changed, 49 insertions, 57 deletions
diff --git a/internal/io.go b/internal/io.go deleted file mode 100644 index c0f28bf..0000000 --- a/internal/io.go +++ /dev/null @@ -1,16 +0,0 @@ -package internal - -import ( - "os" - "path/filepath" -) - -func SaveFile(filePath string, bytes []byte) error { - dir := filepath.Dir(filePath) - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - } - return os.WriteFile(filePath, bytes, 0644) -} diff --git a/internal/server/handler/handler.go b/internal/server/handler/handler.go index 25a4b49..6549c9f 100644 --- a/internal/server/handler/handler.go +++ b/internal/server/handler/handler.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "net/http" - "os" "regexp" "codeberg.org/snonux/gos/internal/config/server" @@ -26,7 +25,6 @@ func New(conf server.ServerConfig) Handler { } } -// TODO: Use repository.Repository to store the file to the file system func (h Handler) Submit(w http.ResponseWriter, r *http.Request) error { if r.Method != "POST" { return fmt.Errorf("expexted POST request") @@ -64,7 +62,7 @@ func (h Handler) Get(w http.ResponseWriter, r *http.Request) error { return fmt.Errorf("invalid id %s", id) } - data, err := os.ReadFile(fmt.Sprintf("%s/%s", h.conf.DataDir, id)) + data, err := repository.Instance(h.conf.DataDir).Get(id) if err != err { return err } @@ -103,7 +101,7 @@ func (h Handler) mergeFromPartner(partner string) error { } for _, pair := range pairs { - if repo.HasEntry(pair) { + if repo.HasSameEntry(pair) { continue } diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index 2c6b132..029ca53 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -3,13 +3,10 @@ package repository import ( "encoding/json" "fmt" - "log" - "os" - "path/filepath" - "strings" "sync" "time" + "codeberg.org/snonux/gos/internal" "codeberg.org/snonux/gos/internal/types" ) @@ -27,6 +24,7 @@ type Repository struct { dataDir string entries map[string]types.Entry mu *sync.Mutex + vfs internal.VFS } func Instance(dataDir string) *Repository { @@ -35,6 +33,7 @@ func Instance(dataDir string) *Repository { dataDir: dataDir, entries: make(map[string]types.Entry), mu: &sync.Mutex{}, + vfs: internal.RealFS{}, } }) return instance @@ -48,26 +47,20 @@ func (r Repository) add(entry types.Entry) { // Load repository into memory func (r Repository) load() error { - visit := func() filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - if err != nil { - log.Println(err) - return nil - } - if info.IsDir() || !strings.HasSuffix(path, ".json") { - return nil - } - - entry, err := types.NewEntryFromFile(path) - if err != err { - return err - } - r.add(entry) - return nil + filePaths, err := r.vfs.FindFiles(r.dataDir) + if err != nil { + return err + } + + for _, filePath := range filePaths { + entry, err := types.NewEntryFromFile(filePath) + if err != err { + return err } + r.add(entry) } - return filepath.Walk(r.dataDir, visit()) + return nil } func (r Repository) List() ([]byte, error) { @@ -86,7 +79,11 @@ func (r Repository) List() ([]byte, error) { return json.Marshal(pairs) } -func (r Repository) HasEntry(pair EntryPair) bool { +func (r Repository) Get(id string) ([]byte, error) { + return r.vfs.ReadFile(fmt.Sprintf("%s/%s", r.dataDir, id)) +} + +func (r Repository) HasSameEntry(pair EntryPair) bool { r.mu.Lock() defer r.mu.Unlock() @@ -101,17 +98,20 @@ func (r Repository) entryPath(entry types.Entry) string { return fmt.Sprintf("%s/%s/%s.json", r.dataDir, time.Now().Format("2006"), entry.ID) } -func (r Repository) Merge(newEntry types.Entry) error { +func (r Repository) Merge(otherEntry types.Entry) error { r.mu.Lock() defer r.mu.Unlock() - entry, ok := r.entries[newEntry.ID] + entry, ok := r.entries[otherEntry.ID] if !ok { - entry = types.NewEntryFromCopy(newEntry) + var err error + if entry, err = types.NewEntryFromCopy(otherEntry); err != nil { + return err + } } - entry, _ = entry.Update(newEntry) - r.entries[newEntry.ID] = entry + entry, _ = entry.Update(otherEntry) + r.entries[otherEntry.ID] = entry // TODO: Only save to file when actually changed return entry.SaveFile(r.entryPath(entry)) diff --git a/internal/types/entry.go b/internal/types/entry.go index 611cee1..55391de 100644 --- a/internal/types/entry.go +++ b/internal/types/entry.go @@ -4,7 +4,6 @@ import ( "crypto/sha256" "encoding/json" "fmt" - "os" "strings" "sync" @@ -38,6 +37,7 @@ type Entry struct { Body string `json:"body"` Shared []Shared `json:"shared,omitempty"` Epoch int `json:"epoch,omitempty"` + vfs internal.VFS // The checksum of the whole entry, can change depending on the state. checksum string @@ -57,24 +57,34 @@ func NewEntry(bytes []byte) (Entry, error) { return e, nil } -// Beware , this is only from a shallow copy! -func NewEntryFromCopy(other Entry) Entry { - e := other - e.initialize() - return e -} +func NewEntryFromFile(filePath string, vfsToUse ...internal.VFS) (Entry, error) { + var ( + bytes []byte + err error + vfs internal.VFS = internal.RealFS{} + ) + + if len(vfsToUse) > 0 { + vfs = vfsToUse[0] + } -func NewEntryFromFile(filePath string) (Entry, error) { - bytes, err := os.ReadFile(filePath) + bytes, err = vfs.ReadFile(filePath) if err != err { return Entry{}, err } return NewEntry(bytes) } +func NewEntryFromCopy(other Entry) (Entry, error) { + var e Entry + e.initialize() + return e.Update(other) +} + func (e *Entry) initialize() { e.mu = &sync.Mutex{} e.checksumDirty = true + e.vfs = internal.RealFS{} } func (e Entry) Equals(other Entry) bool { @@ -158,7 +168,7 @@ func (e Entry) SaveFile(filePath string) error { return err } - return internal.SaveFile(filePath, jsonStr) + return e.vfs.SaveFile(filePath, jsonStr) } func (e Entry) String() string { |
