summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-08-14 10:10:18 +0300
committerPaul Buetow <paul@buetow.org>2024-08-14 10:10:18 +0300
commitca2c0045ed86f8c9bc6dccaf20c9e2c2c0fae3f8 (patch)
tree2411cca5764b9aacf229ff61bc46a39fd8c65f0d
parenta43042d48cfbf46f42b1df08e94903ee69d48aed (diff)
move regex check to repository from handler
-rw-r--r--internal/server/handler/handler.go18
-rw-r--r--internal/server/repository/repository.go14
-rw-r--r--internal/server/repository/repository_test.go45
3 files changed, 52 insertions, 25 deletions
diff --git a/internal/server/handler/handler.go b/internal/server/handler/handler.go
index 0d5dc11..2630433 100644
--- a/internal/server/handler/handler.go
+++ b/internal/server/handler/handler.go
@@ -5,7 +5,6 @@ import (
"fmt"
"io"
"net/http"
- "regexp"
"codeberg.org/snonux/gos/internal/config/server"
"codeberg.org/snonux/gos/internal/server/repository"
@@ -13,15 +12,12 @@ import (
)
type Handler struct {
- conf server.ServerConfig
- getIdRe *regexp.Regexp
+ conf server.ServerConfig
}
func New(conf server.ServerConfig) Handler {
return Handler{
- conf: conf,
- getIdRe: regexp.MustCompile(`^[a-z0-9]{64}$`),
- // getIdRe: regexp.MustCompile(`^/[0-9]{4}/[a-z0-9]{64}\.json$`),
+ conf: conf,
}
}
@@ -58,15 +54,13 @@ func (h Handler) List(w http.ResponseWriter, r *http.Request) error {
func (h Handler) Get(w http.ResponseWriter, r *http.Request) error {
id := r.URL.Query().Get("id")
- if !h.getIdRe.MatchString(id) {
- return fmt.Errorf("invalid id %s", id)
- }
- ent, ok := repository.Instance(h.conf).Get(id)
- if !ok {
- return fmt.Errorf("no entry with id %s found", id)
+ ent, err := repository.Instance(h.conf).Get(id)
+ if err != nil {
+ return err
}
+ // TODO: Move to repository.go
bytes, err := ent.JSONMarshal()
if err != nil {
return err
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index 6c0a9e3..464d11a 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"log"
+ "regexp"
"sync"
"time"
@@ -37,6 +38,7 @@ type Repository struct {
mu *sync.Mutex
fs fs
loaded *bool
+ getIdRe *regexp.Regexp
}
func Instance(conf server.ServerConfig) Repository {
@@ -58,6 +60,8 @@ func newRepository(conf server.ServerConfig, fs fs) Repository {
mu: &sync.Mutex{},
fs: fs,
loaded: &loaded,
+ getIdRe: regexp.MustCompile(`^[a-z0-9]{64}$`),
+ // getIdRe: regexp.MustCompile(`^/[0-9]{4}/[a-z0-9]{64}\.json$`),
}
}
@@ -134,13 +138,19 @@ func (r Repository) ListBytes() ([]byte, error) {
return json.Marshal(pairs)
}
-func (r Repository) Get(id string) (types.Entry, bool) {
+func (r Repository) Get(id string) (types.Entry, error) {
+ if !r.getIdRe.MatchString(id) {
+ return types.Entry{}, fmt.Errorf("invalid id %s", id)
+ }
_ = r.load()
r.mu.Lock()
defer r.mu.Unlock()
ent, ok := r.entries[id]
- return ent, ok
+ if !ok {
+ return ent, fmt.Errorf("no entry with id %s found", id)
+ }
+ return ent, nil
}
func (r Repository) hasSameEntry(pair entryPair) bool {
diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go
index e7a24bb..77b8ea4 100644
--- a/internal/server/repository/repository_test.go
+++ b/internal/server/repository/repository_test.go
@@ -18,9 +18,9 @@ func TestRepositoryPutGet(t *testing.T) {
for _, ent := range makeEntries(t) {
t.Run(ent.ID, func(t *testing.T) {
_ = repo.put(ent)
- entGot, ok := repo.Get(ent.ID)
- if !ok {
- t.Errorf("could not find entry with id %s in repo", ent.ID)
+ entGot, err := repo.Get(ent.ID)
+ if err != nil {
+ t.Error(err)
}
if !entGot.Equals(ent) {
t.Error("expected to get", ent, "but got", entGot)
@@ -49,9 +49,9 @@ func TestRepositoryLoad(t *testing.T) {
for _, ent := range entries {
t.Run(ent.ID, func(t *testing.T) {
- entGot, ok := repo.Get(ent.ID)
- if !ok {
- t.Errorf("could not find entry with id %s in repo", ent.ID)
+ entGot, err := repo.Get(ent.ID)
+ if err != nil {
+ t.Error(err)
}
if !entGot.Equals(ent) {
t.Error("expected to get", ent, "but got", entGot)
@@ -154,31 +154,54 @@ func TestRepositoryMergeFromPartner(t *testing.T) {
_ = repo2.put(ent2)
getPair := func(ctx context.Context, partner string, pairs *[]entryPair) error {
- var partnerRepo Repository
+ var (
+ pairs_ []entryPair
+ err error
+ )
switch partner {
case "repo1":
- partnerRepo = repo2
+ pairs_, err = repo1.List()
case "repo2":
- partnerRepo = repo1
+ pairs_, err = repo2.List()
}
- pairs_, err := partnerRepo.List()
if err != nil {
return err
}
*pairs = pairs_
- t.Log("got pairs", *pairs, "from repo", partner)
+ t.Log("got pairs", *pairs, "from repo", partner)
return nil
}
getEntry := func(ctx context.Context, partner, id string, ent *types.Entry) error {
+ // var (
+ // ent_ []types.Entry
+ // ok bool
+ // )
+
+ // switch partner {
+ // case "repo1":
+ // ent_, ok = repo1.Get(id)
+ // case "repo2":
+ // ent_, ok = repo2.Get(id)
+ // }
+
return nil
+
+ // if ok != nil {
+ // return fmt.Errorf("")
+ // }
+ // *pairs = pairs_
+
+ // t.Log("got pairs", *pairs, "from repo", partner)
+ // return nil
/*
uri := fmt.Sprintf("%s/get?id=%s", partner, id)
return easyhttp.GetData(ctx, uri, r.conf.APIKey, ent)
*/
+ // func (r Repository) Get(id string) (types.Entry, bool) {
}
if err := repo1.mergeFromPartner(context.Background(), "repo2", getPair, getEntry); err != nil {