diff options
| author | Paul Buetow <paul@buetow.org> | 2024-08-14 10:10:18 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-08-14 10:10:18 +0300 |
| commit | ca2c0045ed86f8c9bc6dccaf20c9e2c2c0fae3f8 (patch) | |
| tree | 2411cca5764b9aacf229ff61bc46a39fd8c65f0d | |
| parent | a43042d48cfbf46f42b1df08e94903ee69d48aed (diff) | |
move regex check to repository from handler
| -rw-r--r-- | internal/server/handler/handler.go | 18 | ||||
| -rw-r--r-- | internal/server/repository/repository.go | 14 | ||||
| -rw-r--r-- | internal/server/repository/repository_test.go | 45 |
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 { |
