diff options
| author | Paul Buetow <paul@buetow.org> | 2024-05-11 18:53:16 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-05-11 18:53:16 +0300 |
| commit | b97854c8ec2665887121d773ab994a09ca768adb (patch) | |
| tree | f673318257f0a172f8cf7784feea2633ccd1ac4a /internal/server | |
| parent | 560b685505a43aa1a1365c1c3f7b3d0733676847 (diff) | |
also return the checksums for each element of the repository
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/handle/handle.go | 18 | ||||
| -rw-r--r-- | internal/server/repository/repository.go | 56 |
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) } |
