summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-05-25 22:56:20 +0300
committerPaul Buetow <paul@buetow.org>2024-05-25 22:56:20 +0300
commitb3bddfd992c33a02628d4a5d0586774228776dc9 (patch)
tree304dd4f3a0c1fdda7e2cab4687a4b52c52c4891c
parent3a58b507247291bdbeceeba0d6816797893d4cc7 (diff)
initial VFS
-rw-r--r--internal/io.go16
-rw-r--r--internal/server/handler/handler.go6
-rw-r--r--internal/server/repository/repository.go54
-rw-r--r--internal/types/entry.go30
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 {