feat(filters): support partial update (#409)

This commit is contained in:
ze0s 2022-08-15 15:54:34 +02:00 committed by GitHub
parent fa20978d58
commit 3a334121f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 349 additions and 8 deletions

View file

@ -17,6 +17,7 @@ type filterService interface {
Store(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
Delete(ctx context.Context, filterID int) error
Update(ctx context.Context, filter domain.Filter) (*domain.Filter, error)
UpdatePartial(ctx context.Context, filter domain.FilterUpdate) error
Duplicate(ctx context.Context, filterID int) (*domain.Filter, error)
ToggleEnabled(ctx context.Context, filterID int, enabled bool) error
}
@ -39,6 +40,7 @@ func (h filterHandler) Routes(r chi.Router) {
r.Get("/{filterID}/duplicate", h.duplicate)
r.Post("/", h.store)
r.Put("/{filterID}", h.update)
r.Patch("/{filterID}", h.updatePartial)
r.Put("/{filterID}/enabled", h.toggleEnabled)
r.Delete("/{filterID}", h.delete)
}
@ -49,6 +51,8 @@ func (h filterHandler) getFilters(w http.ResponseWriter, r *http.Request) {
trackers, err := h.service.ListFilters(ctx)
if err != nil {
//
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, trackers, http.StatusOK)
@ -60,7 +64,11 @@ func (h filterHandler) getByID(w http.ResponseWriter, r *http.Request) {
filterID = chi.URLParam(r, "filterID")
)
id, _ := strconv.Atoi(filterID)
id, err := strconv.Atoi(filterID)
if err != nil {
h.encoder.Error(w, err)
return
}
filter, err := h.service.FindByID(ctx, id)
if err != nil {
@ -77,7 +85,11 @@ func (h filterHandler) duplicate(w http.ResponseWriter, r *http.Request) {
filterID = chi.URLParam(r, "filterID")
)
id, _ := strconv.Atoi(filterID)
id, err := strconv.Atoi(filterID)
if err != nil {
h.encoder.Error(w, err)
return
}
filter, err := h.service.Duplicate(ctx, id)
if err != nil {
@ -96,16 +108,18 @@ func (h filterHandler) store(w http.ResponseWriter, r *http.Request) {
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
filter, err := h.service.Store(ctx, data)
if err != nil {
// encode error
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, filter, http.StatusCreated)
h.encoder.StatusCreatedData(w, filter)
}
func (h filterHandler) update(w http.ResponseWriter, r *http.Request) {
@ -116,18 +130,50 @@ func (h filterHandler) update(w http.ResponseWriter, r *http.Request) {
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
filter, err := h.service.Update(ctx, data)
if err != nil {
// encode error
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, filter, http.StatusOK)
}
func (h filterHandler) updatePartial(w http.ResponseWriter, r *http.Request) {
var (
ctx = r.Context()
data domain.FilterUpdate
filterID = chi.URLParam(r, "filterID")
)
// set id from param and convert to int
id, err := strconv.Atoi(filterID)
if err != nil {
h.encoder.Error(w, err)
return
}
data.ID = id
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
if err := h.service.UpdatePartial(ctx, data); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
h.encoder.NoContent(w)
}
func (h filterHandler) toggleEnabled(w http.ResponseWriter, r *http.Request) {
var (
ctx = r.Context()
@ -137,20 +183,25 @@ func (h filterHandler) toggleEnabled(w http.ResponseWriter, r *http.Request) {
}
)
id, _ := strconv.Atoi(filterID)
id, err := strconv.Atoi(filterID)
if err != nil {
h.encoder.Error(w, err)
return
}
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
err := h.service.ToggleEnabled(ctx, id, data.Enabled)
if err != nil {
if err := h.service.ToggleEnabled(ctx, id, data.Enabled); err != nil {
// encode error
h.encoder.Error(w, err)
return
}
h.encoder.StatusResponse(ctx, w, nil, http.StatusNoContent)
h.encoder.NoContent(w)
}
func (h filterHandler) delete(w http.ResponseWriter, r *http.Request) {
@ -159,10 +210,15 @@ func (h filterHandler) delete(w http.ResponseWriter, r *http.Request) {
filterID = chi.URLParam(r, "filterID")
)
id, _ := strconv.Atoi(filterID)
id, err := strconv.Atoi(filterID)
if err != nil {
h.encoder.Error(w, err)
return
}
if err := h.service.Delete(ctx, id); err != nil {
// return err
h.encoder.Error(w, err)
}
h.encoder.StatusResponse(ctx, w, nil, http.StatusNoContent)