mirror of https://github.com/portainer/portainer
fix(endpoints): use the post method for batch delete API operations [BE-11573] (#394)
parent
371e84d9a5
commit
9658f757c2
|
@ -91,7 +91,7 @@ func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *
|
||||||
// @failure 400 "Invalid request payload, such as missing required fields or fields not meeting validation criteria."
|
// @failure 400 "Invalid request payload, such as missing required fields or fields not meeting validation criteria."
|
||||||
// @failure 403 "Unauthorized access or operation not allowed."
|
// @failure 403 "Unauthorized access or operation not allowed."
|
||||||
// @failure 500 "Server error occurred while attempting to delete the specified environments."
|
// @failure 500 "Server error occurred while attempting to delete the specified environments."
|
||||||
// @router /endpoints [delete]
|
// @router /endpoints/delete [post]
|
||||||
func (handler *Handler) endpointDeleteBatch(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointDeleteBatch(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
var p endpointDeleteBatchPayload
|
var p endpointDeleteBatchPayload
|
||||||
if err := request.DecodeAndValidateJSONPayload(r, &p); err != nil {
|
if err := request.DecodeAndValidateJSONPayload(r, &p); err != nil {
|
||||||
|
@ -127,6 +127,27 @@ func (handler *Handler) endpointDeleteBatch(w http.ResponseWriter, r *http.Reque
|
||||||
return response.Empty(w)
|
return response.Empty(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @id EndpointDeleteBatchDeprecated
|
||||||
|
// @summary Remove multiple environments
|
||||||
|
// @deprecated
|
||||||
|
// @description Deprecated: use the `POST` endpoint instead.
|
||||||
|
// @description Remove multiple environments and optionally clean-up associated resources.
|
||||||
|
// @description **Access policy**: Administrator only.
|
||||||
|
// @tags endpoints
|
||||||
|
// @security ApiKeyAuth || jwt
|
||||||
|
// @accept json
|
||||||
|
// @produce json
|
||||||
|
// @param body body endpointDeleteBatchPayload true "List of environments to delete, with optional deleteCluster flag to clean-up associated resources (cloud environments only)"
|
||||||
|
// @success 204 "Environment(s) successfully deleted."
|
||||||
|
// @failure 207 {object} endpointDeleteBatchPartialResponse "Partial success. Some environments were deleted successfully, while others failed."
|
||||||
|
// @failure 400 "Invalid request payload, such as missing required fields or fields not meeting validation criteria."
|
||||||
|
// @failure 403 "Unauthorized access or operation not allowed."
|
||||||
|
// @failure 500 "Server error occurred while attempting to delete the specified environments."
|
||||||
|
// @router /endpoints [delete]
|
||||||
|
func (handler *Handler) endpointDeleteBatchDeprecated(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
return handler.endpointDeleteBatch(w, r)
|
||||||
|
}
|
||||||
|
|
||||||
func (handler *Handler) deleteEndpoint(tx dataservices.DataStoreTx, endpointID portainer.EndpointID, deleteCluster bool) error {
|
func (handler *Handler) deleteEndpoint(tx dataservices.DataStoreTx, endpointID portainer.EndpointID, deleteCluster bool) error {
|
||||||
endpoint, err := tx.Endpoint().Endpoint(endpointID)
|
endpoint, err := tx.Endpoint().Endpoint(endpointID)
|
||||||
if tx.IsErrObjectNotFound(err) {
|
if tx.IsErrObjectNotFound(err) {
|
||||||
|
|
|
@ -68,8 +68,8 @@ func NewHandler(bouncer security.BouncerService) *Handler {
|
||||||
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointUpdate))).Methods(http.MethodPut)
|
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointUpdate))).Methods(http.MethodPut)
|
||||||
h.Handle("/endpoints/{id}",
|
h.Handle("/endpoints/{id}",
|
||||||
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointDelete))).Methods(http.MethodDelete)
|
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointDelete))).Methods(http.MethodDelete)
|
||||||
h.Handle("/endpoints",
|
h.Handle("/endpoints/delete",
|
||||||
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointDeleteBatch))).Methods(http.MethodDelete)
|
bouncer.AdminAccess(httperror.LoggerHandler(h.endpointDeleteBatch))).Methods(http.MethodPost)
|
||||||
h.Handle("/endpoints/{id}/dockerhub/{registryId}",
|
h.Handle("/endpoints/{id}/dockerhub/{registryId}",
|
||||||
bouncer.AuthenticatedAccess(httperror.LoggerHandler(h.endpointDockerhubStatus))).Methods(http.MethodGet)
|
bouncer.AuthenticatedAccess(httperror.LoggerHandler(h.endpointDockerhubStatus))).Methods(http.MethodGet)
|
||||||
h.Handle("/endpoints/{id}/snapshot",
|
h.Handle("/endpoints/{id}/snapshot",
|
||||||
|
@ -85,6 +85,7 @@ func NewHandler(bouncer security.BouncerService) *Handler {
|
||||||
|
|
||||||
// DEPRECATED
|
// DEPRECATED
|
||||||
h.Handle("/endpoints/{id}/status", bouncer.PublicAccess(httperror.LoggerHandler(h.endpointStatusInspect))).Methods(http.MethodGet)
|
h.Handle("/endpoints/{id}/status", bouncer.PublicAccess(httperror.LoggerHandler(h.endpointStatusInspect))).Methods(http.MethodGet)
|
||||||
|
h.Handle("/endpoints", bouncer.AdminAccess(httperror.LoggerHandler(h.endpointDeleteBatchDeprecated))).Methods(http.MethodDelete)
|
||||||
|
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,11 +55,11 @@ async function deleteEnvironments(
|
||||||
environments: { id: EnvironmentId; deleteCluster?: boolean }[]
|
environments: { id: EnvironmentId; deleteCluster?: boolean }[]
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
const { data } = await axios.delete<{
|
const { data } = await axios.post<{
|
||||||
deleted: EnvironmentId[];
|
deleted: EnvironmentId[];
|
||||||
errors: EnvironmentId[];
|
errors: EnvironmentId[];
|
||||||
} | null>(buildUrl(), {
|
} | null>(buildUrl(undefined, 'delete'), {
|
||||||
data: { endpoints: environments },
|
endpoints: environments,
|
||||||
});
|
});
|
||||||
return data;
|
return data;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
Loading…
Reference in New Issue