diff options
| author | Leonardo Bishop <me@leonardobishop.net> | 2025-09-17 18:13:30 +0100 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.net> | 2025-09-17 18:13:30 +0100 |
| commit | 39a926cd521806aedc298ddd671d1a118794fcec (patch) | |
| tree | a38908af8c91e01b2acec112b871c951e1bf6c1b /api/handlers | |
| parent | 1b7c07d9bbfb7984536a3aeade0f543251f1a666 (diff) | |
Add endpoints for web extension
Diffstat (limited to 'api/handlers')
| -rw-r--r-- | api/handlers/entry.go | 105 | ||||
| -rw-r--r-- | api/handlers/record.go | 35 |
2 files changed, 105 insertions, 35 deletions
diff --git a/api/handlers/entry.go b/api/handlers/entry.go new file mode 100644 index 0000000..e94dfea --- /dev/null +++ b/api/handlers/entry.go @@ -0,0 +1,105 @@ +package handlers + +import ( + "errors" + "net/http" + + "git.leonardobishop.net/stash/api/dto" + "git.leonardobishop.net/stash/pkg/entries" +) + +func GetEntryURLs(service entries.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + entries, err := service.GetEntryURLs() + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: entries, + } + }) +} + +func GetEntry(service entries.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.GetEntryRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + entry, err := service.GetEntryByUrl(request.Url) + if err != nil { + if errors.Is(err, entries.ErrEntryNotFound) { + return &dto.ErrorResponse{ + Code: http.StatusNotFound, + Message: "entry not found", + } + } + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: entry, + } + }) +} + +func RecordEntry(service entries.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.CreateEntryRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + entry, err := service.CreateEntry(request.Title, request.Kind, request.Url, request.Description) + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusCreated, + Data: entry, + } + }) +} + +func UpdateEntry(service entries.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.UpdateEntryRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + entry, err := service.UpdateEntryKind(request.Id, request.Kind) + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: entry, + } + }) +} + +func DeleteEntry(service entries.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.DeleteEntryRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + err := service.DeleteEntry(request.Id) + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: nil, + } + }) +} diff --git a/api/handlers/record.go b/api/handlers/record.go deleted file mode 100644 index cccce6b..0000000 --- a/api/handlers/record.go +++ /dev/null @@ -1,35 +0,0 @@ -package handlers - -import ( - "crypto/subtle" - "net/http" - - "git.leonardobishop.net/stash/api/dto" - "git.leonardobishop.net/stash/pkg/entries" -) - -func RecordEntry(service entries.Service, token string) http.HandlerFunc { - return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { - var request dto.CreateEntryRequest - if err := dto.ReadDto(r, &request); err != nil { - return err - } - - if subtle.ConstantTimeCompare([]byte(token), []byte(request.Token)) != 1 { - return &dto.ErrorResponse{ - Code: http.StatusForbidden, - Message: "Forbidden", - } - } - - entry, err := service.CreateEntry(request.Title, request.Kind, request.Url, request.Description) - if err != nil { - return err - } - - return &dto.OkResponse{ - Code: http.StatusCreated, - Data: entry, - } - }) -} |
