summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-05-11 18:53:16 +0300
committerPaul Buetow <paul@buetow.org>2024-05-11 18:53:16 +0300
commitb97854c8ec2665887121d773ab994a09ca768adb (patch)
treef673318257f0a172f8cf7784feea2633ccd1ac4a /internal/server
parent560b685505a43aa1a1365c1c3f7b3d0733676847 (diff)
also return the checksums for each element of the repository
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/handle/handle.go18
-rw-r--r--internal/server/repository/repository.go56
2 files changed, 56 insertions, 18 deletions
diff --git a/internal/server/handle/handle.go b/internal/server/handle/handle.go
index d1f7748..55f7b3e 100644
--- a/internal/server/handle/handle.go
+++ b/internal/server/handle/handle.go
@@ -1,7 +1,6 @@
package handle
import (
- "encoding/json"
"fmt"
"io"
"net/http"
@@ -49,19 +48,13 @@ func List(w http.ResponseWriter, r *http.Request, dataDir string) error {
return fmt.Errorf("expexted GET request")
}
- repository := repository.New(dataDir)
- ids, err := repository.List()
+ list, err := repository.New(dataDir).List()
if err != nil {
return err
}
- jsonData, err := json.Marshal(ids)
- if err != nil {
- return err
- }
-
- fmt.Fprint(w, string(jsonData))
- return nil
+ _, err = w.Write(list)
+ return err
}
func Get(w http.ResponseWriter, r *http.Request, dataDir string) error {
@@ -78,3 +71,8 @@ func Get(w http.ResponseWriter, r *http.Request, dataDir string) error {
fmt.Fprint(w, string(data))
return nil
}
+
+func Merge(w http.ResponseWriter, r *http.Request, dataDir string) error {
+
+ return nil
+}
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index 5fe79fd..7eb7122 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -1,36 +1,76 @@
package repository
import (
+ "encoding/json"
"log"
"os"
"path/filepath"
"strings"
+ "sync"
+
+ "codeberg.org/snonux/gos/internal/types"
)
type Repository struct {
dataDir string
+ entries map[string]types.Entry
+ mu *sync.Mutex
}
func New(dataDir string) Repository {
- return Repository{dataDir}
+ return Repository{
+ dataDir: dataDir,
+ entries: make(map[string]types.Entry),
+ mu: &sync.Mutex{},
+ }
}
-func (r Repository) List() ([]string, error) {
- var ids []string
+func (r Repository) store(entry types.Entry) {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+ r.entries[entry.ID] = entry
+}
- visit := func(files *[]string) filepath.WalkFunc {
+// 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") {
- *files = append(*files, strings.TrimPrefix(path, r.dataDir))
+ if info.IsDir() || !strings.HasSuffix(path, ".json") {
+ return nil
+ }
+
+ entry, err := types.NewEntryFromFile(path)
+ if err != err {
+ return err
}
+ r.store(entry)
return nil
}
}
- err := filepath.Walk(r.dataDir, visit(&ids))
- return ids, err
+ return filepath.Walk(r.dataDir, visit())
+}
+
+func (r Repository) List() ([]byte, error) {
+ if err := r.load(); err != nil {
+ return []byte{}, err
+ }
+
+ type pair struct {
+ ID, Checksum string
+ }
+
+ var pairs []pair
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ for _, entry := range r.entries {
+ pairs = append(pairs, pair{entry.ID, entry.Checksum()})
+ }
+
+ return json.Marshal(pairs)
}