7a2be3e6f6
This change causes rate limiting errors to be returned to the client as JSON objects rather than plain text to prevent the satellite UI from encountering issues when trying to parse them. Resolves storj/customer-issues#88 Change-Id: I11abd19068927a22f1c28d18fc99e7dad8461834
77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
// Copyright (C) 2021 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package consoleapi
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/zeebo/errs"
|
|
"go.uber.org/zap"
|
|
|
|
"storj.io/common/uuid"
|
|
"storj.io/storj/private/web"
|
|
"storj.io/storj/satellite/console"
|
|
)
|
|
|
|
var (
|
|
// ErrAPIKeysAPI - console api keys api error type.
|
|
ErrAPIKeysAPI = errs.Class("console api keys")
|
|
)
|
|
|
|
// APIKeys is an api controller that exposes all api keys related functionality.
|
|
type APIKeys struct {
|
|
log *zap.Logger
|
|
service *console.Service
|
|
}
|
|
|
|
// NewAPIKeys is a constructor for api api keys controller.
|
|
func NewAPIKeys(log *zap.Logger, service *console.Service) *APIKeys {
|
|
return &APIKeys{
|
|
log: log,
|
|
service: service,
|
|
}
|
|
}
|
|
|
|
// DeleteByNameAndProjectID deletes specific api key by it's name and project ID.
|
|
func (keys *APIKeys) DeleteByNameAndProjectID(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
var err error
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
name := r.URL.Query().Get("name")
|
|
projectIDString := r.URL.Query().Get("projectID")
|
|
|
|
if name == "" {
|
|
keys.serveJSONError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
projectID, err := uuid.FromString(projectIDString)
|
|
if err != nil {
|
|
keys.serveJSONError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
err = keys.service.DeleteAPIKeyByNameAndProjectID(ctx, name, projectID)
|
|
if err != nil {
|
|
if console.ErrUnauthorized.Has(err) {
|
|
keys.serveJSONError(w, http.StatusUnauthorized, err)
|
|
return
|
|
}
|
|
|
|
if console.ErrNoAPIKey.Has(err) {
|
|
keys.serveJSONError(w, http.StatusNoContent, err)
|
|
return
|
|
}
|
|
|
|
keys.serveJSONError(w, http.StatusInternalServerError, err)
|
|
return
|
|
}
|
|
}
|
|
|
|
// serveJSONError writes JSON error to response output stream.
|
|
func (keys *APIKeys) serveJSONError(w http.ResponseWriter, status int, err error) {
|
|
web.ServeJSONError(keys.log, w, status, err)
|
|
}
|