From 0b5acdb92e50736e3243eca15f0404b59aacbdc5 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Wed, 14 Nov 2018 07:19:58 +0000
Subject: [PATCH] Move AddEmailAlias/DeleteEmailAlias validation code to the
 right place

Previously we were returning error 500 when we should have returned a 400.
---
 actions_resource.go | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/actions_resource.go b/actions_resource.go
index 408c10cd..a9ee7f92 100644
--- a/actions_resource.go
+++ b/actions_resource.go
@@ -134,6 +134,15 @@ type AddEmailAliasRequest struct {
 
 // Validate the request.
 func (r *AddEmailAliasRequest) Validate(rctx *RequestContext) error {
+	if rctx.Resource.ID.Type() != ResourceTypeEmail {
+		return errors.New("this operation only works on email resources")
+	}
+
+	// Allow at most 5 aliases.
+	if len(rctx.Resource.Email.Aliases) >= maxEmailAliases {
+		return errors.New("too many aliases")
+	}
+
 	if err := rctx.fieldValidators.email(rctx.Context, r.Addr); err != nil {
 		return newValidationError(nil, "addr", err.Error())
 	}
@@ -144,15 +153,6 @@ const maxEmailAliases = 5
 
 // Serve the request.
 func (r *AddEmailAliasRequest) Serve(rctx *RequestContext) (interface{}, error) {
-	if rctx.Resource.ID.Type() != ResourceTypeEmail {
-		return nil, errors.New("this operation only works on email resources")
-	}
-
-	// Allow at most 5 aliases.
-	if len(rctx.Resource.Email.Aliases) >= maxEmailAliases {
-		return nil, errors.New("too many aliases")
-	}
-
 	rctx.Resource.Email.Aliases = append(rctx.Resource.Email.Aliases, r.Addr)
 	if err := rctx.TX.UpdateResource(rctx.Context, rctx.Resource); err != nil {
 		return nil, err
@@ -168,12 +168,16 @@ type DeleteEmailAliasRequest struct {
 	Addr string `json:"addr"`
 }
 
-// Serve the request.
-func (r *DeleteEmailAliasRequest) Serve(rctx *RequestContext) (interface{}, error) {
+// Validate the request.
+func (r *DeleteEmailAliasRequest) Validate(rctx *RequestContext) error {
 	if rctx.Resource.ID.Type() != ResourceTypeEmail {
-		return nil, errors.New("this operation only works on email resources")
+		return errors.New("this operation only works on email resources")
 	}
+	return nil
+}
 
+// Serve the request.
+func (r *DeleteEmailAliasRequest) Serve(rctx *RequestContext) (interface{}, error) {
 	var aliases []string
 	for _, a := range rctx.Resource.Email.Aliases {
 		if a != r.Addr {
-- 
GitLab