diff --git a/http/label_service.go b/http/label_service.go index cc8a413558..e9b9518fc6 100644 --- a/http/label_service.go +++ b/http/label_service.go @@ -190,6 +190,63 @@ func decodePostLabelRequest(ctx context.Context, r *http.Request) (*postLabelReq return label, nil } +type patchLabelRequest struct { + label *plat.Label + upd plat.LabelUpdate +} + +func decodePatchLabelRequest(ctx context.Context, r *http.Request) (*patchLabelRequest, error) { + params := httprouter.ParamsFromContext(ctx) + id := params.ByName("id") + if id == "" { + return nil, kerrors.InvalidDataf("url missing resource id") + } + + name := params.ByName("name") + if name == "" { + return nil, kerrors.InvalidDataf("label name is missing") + } + + var rid plat.ID + if err := rid.DecodeFromString(id); err != nil { + return nil, err + } + + upd := &plat.LabelUpdate{} + if err := json.NewDecoder(r.Body).Decode(upd); err != nil { + return nil, err + } + + return &patchLabelRequest{ + label: &plat.Label{ResourceID: rid, Name: name}, + upd: *upd, + }, nil +} + +// newPatchLabelHandler returns a handler func for a PATCH to /labels endpoints +func newPatchLabelHandler(s plat.LabelService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + req, err := decodePatchLabelRequest(ctx, r) + if err != nil { + EncodeError(ctx, err, w) + return + } + + label, err := s.UpdateLabel(ctx, req.label, req.upd) + if err != nil { + EncodeError(ctx, err, w) + return + } + + if err := encodeResponse(ctx, w, http.StatusOK, newLabelResponse(label)); err != nil { + EncodeError(ctx, err, w) + return + } + } +} + // newDeleteLabelHandler returns a handler func for a DELETE to /labels endpoints func newDeleteLabelHandler(s plat.LabelService) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { @@ -227,22 +284,20 @@ func decodeDeleteLabelRequest(ctx context.Context, r *http.Request) (*deleteLabe return nil, kerrors.InvalidDataf("url missing resource id") } + name := params.ByName("name") + if name == "" { + return nil, kerrors.InvalidDataf("label name is missing") + } + var rid plat.ID if err := rid.DecodeFromString(id); err != nil { return nil, err } - label := &deleteLabelRequest{} - if err := json.NewDecoder(r.Body).Decode(label); err != nil { - return nil, err - } - - if label.Name == "" { - return nil, kerrors.InvalidDataf("label name is missing") - } - label.ResourceID = rid - - return label, nil + return &deleteLabelRequest{ + Name: name, + ResourceID: rid, + }, nil } // FindLabels returns a slice of labels diff --git a/http/view_service.go b/http/view_service.go index f65f2dc3bf..8e56ec209c 100644 --- a/http/view_service.go +++ b/http/view_service.go @@ -58,6 +58,7 @@ func NewViewHandler(mappingService platform.UserResourceMappingService, labelSer h.HandlerFunc("GET", viewsIDLabelsPath, newGetLabelsHandler(h.LabelService)) h.HandlerFunc("POST", viewsIDLabelsPath, newPostLabelHandler(h.LabelService)) h.HandlerFunc("DELETE", viewsIDLabelsNamePath, newDeleteLabelHandler(h.LabelService)) + h.HandlerFunc("PATCH", viewsIDLabelsNamePath, newPatchLabelHandler(h.LabelService)) return h }