From fecc334c932c28c8567747773d59727b7149b494 Mon Sep 17 00:00:00 2001 From: ale Date: Sun, 9 Jun 2019 22:29:44 +0100 Subject: [PATCH] Replace enable/disable_resource with a new set_resource_status API --- actions_resource.go | 25 +++++++++++++------------ server/server.go | 3 +-- types.go | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/actions_resource.go b/actions_resource.go index cf3ad7e..2139d05 100644 --- a/actions_resource.go +++ b/actions_resource.go @@ -68,24 +68,25 @@ func setResourceStatus(rctx *RequestContext, status string) error { return nil } -// DisableResourceRequest disables a resource belonging to the user. -type DisableResourceRequest struct { - ResourceRequestBase -} +// SetResourceStatusRequest modifies the status of a resource +// belonging to the user (admin-only). +type SetResourceStatusRequest struct { + AdminResourceRequestBase -// Serve the request. -func (r *DisableResourceRequest) Serve(rctx *RequestContext) (interface{}, error) { - return nil, setResourceStatus(rctx, ResourceStatusInactive) + Status string `json:"status"` } -// EnableResourceRequest enables a resource belonging to the user (admin-only). -type EnableResourceRequest struct { - AdminResourceRequestBase +// Validate the request. +func (r *SetResourceStatusRequest) Validate(rctx *RequestContext) error { + if !isValidStatusByResourceType(rctx.Resource.Type, r.Status) { + return errors.New("invalid or unknown status") + } + return nil } // Serve the request. -func (r *EnableResourceRequest) Serve(rctx *RequestContext) (interface{}, error) { - return nil, setResourceStatus(rctx, ResourceStatusActive) +func (r *SetResourceStatusRequest) Serve(rctx *RequestContext) (interface{}, error) { + return nil, setResourceStatus(rctx, r.Status) } // ResetResourcePasswordRequest will reset the password associated diff --git a/server/server.go b/server/server.go index 45fead7..cf4a72f 100644 --- a/server/server.go +++ b/server/server.go @@ -59,8 +59,7 @@ func New(service *as.AccountService, backend as.Backend) *APIServer { s.Register("/api/user/delete_app_specific_password", &as.DeleteApplicationSpecificPasswordRequest{}) s.Register("/api/resource/get", &as.GetResourceRequest{}) s.Register("/api/resource/search", &as.SearchResourceRequest{}) - s.Register("/api/resource/enable", &as.EnableResourceRequest{}) - s.Register("/api/resource/disable", &as.DisableResourceRequest{}) + s.Register("/api/resource/set_status", &as.SetResourceStatusRequest{}) s.Register("/api/resource/create", &as.CreateResourcesRequest{}) s.Register("/api/resource/move", &as.MoveResourceRequest{}) s.Register("/api/resource/reset_password", &as.ResetPasswordRequest{}) diff --git a/types.go b/types.go index 7d79eef..3a92408 100644 --- a/types.go +++ b/types.go @@ -392,6 +392,23 @@ const ( ResourceStatusArchived = "archived" ) +// Returns true if the given status is valid for the given resource type. +func isValidStatusByResourceType(rtype, rstatus string) bool { + switch rtype { + case ResourceTypeEmail, ResourceTypeMailingList: + switch rstatus { + case ResourceStatusActive, ResourceStatusInactive, ResourceStatusReadonly: + return true + } + case ResourceTypeWebsite, ResourceTypeDomain, ResourceTypeDAV, ResourceTypeDatabase: + switch rstatus { + case ResourceStatusActive, ResourceStatusInactive, ResourceStatusReadonly, ResourceStatusArchived: + return true + } + } + return false +} + // ResourceID is an opaque ID that uniquely identifies a resource in // the backend database. These should normally not be visible to users. type ResourceID string -- GitLab