rsponse 404 when delete not exist email (#15383)

fix #15357

Signed-off-by: a1012112796 <1012112796@qq.com>
tokarchuk/v1.17
a1012112796 4 years ago committed by GitHub
parent 9a0858cecf
commit e375cbfd46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 105
      integrations/api_user_email_test.go
  2. 15
      models/error.go
  3. 6
      models/user_mail.go
  4. 6
      routers/api/v1/user/email.go
  5. 3
      templates/swagger/v1_json.tmpl

@ -0,0 +1,105 @@
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
"net/http"
"testing"
api "code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
)
func TestAPIListEmails(t *testing.T) {
defer prepareTestEnv(t)()
normalUsername := "user2"
session := loginUser(t, normalUsername)
token := getTokenForLoggedInUser(t, session)
req := NewRequest(t, "GET", "/api/v1/user/emails?token="+token)
resp := session.MakeRequest(t, req, http.StatusOK)
var emails []*api.Email
DecodeJSON(t, resp, &emails)
assert.EqualValues(t, []*api.Email{
{
Email: "user2@example.com",
Verified: true,
Primary: true,
},
{
Email: "user21@example.com",
Verified: false,
Primary: false,
},
}, emails)
}
func TestAPIAddEmail(t *testing.T) {
defer prepareTestEnv(t)()
normalUsername := "user2"
session := loginUser(t, normalUsername)
token := getTokenForLoggedInUser(t, session)
opts := api.CreateEmailOption{
Emails: []string{"user101@example.com"},
}
req := NewRequestWithJSON(t, "POST", "/api/v1/user/emails?token="+token, &opts)
session.MakeRequest(t, req, http.StatusUnprocessableEntity)
opts = api.CreateEmailOption{
Emails: []string{"user22@example.com"},
}
req = NewRequestWithJSON(t, "POST", "/api/v1/user/emails?token="+token, &opts)
resp := session.MakeRequest(t, req, http.StatusCreated)
var emails []*api.Email
DecodeJSON(t, resp, &emails)
assert.EqualValues(t, []*api.Email{
{
Email: "user22@example.com",
Verified: true,
Primary: false,
},
}, emails)
}
func TestAPIDeleteEmail(t *testing.T) {
defer prepareTestEnv(t)()
normalUsername := "user2"
session := loginUser(t, normalUsername)
token := getTokenForLoggedInUser(t, session)
opts := api.DeleteEmailOption{
Emails: []string{"user22@example.com"},
}
req := NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
session.MakeRequest(t, req, http.StatusNotFound)
opts = api.DeleteEmailOption{
Emails: []string{"user21@example.com"},
}
req = NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
session.MakeRequest(t, req, http.StatusNoContent)
req = NewRequest(t, "GET", "/api/v1/user/emails?token="+token)
resp := session.MakeRequest(t, req, http.StatusOK)
var emails []*api.Email
DecodeJSON(t, resp, &emails)
assert.EqualValues(t, []*api.Email{
{
Email: "user2@example.com",
Verified: true,
Primary: true,
},
}, emails)
}

@ -222,6 +222,21 @@ func (err ErrEmailInvalid) Error() string {
return fmt.Sprintf("e-mail invalid [email: %s]", err.Email) return fmt.Sprintf("e-mail invalid [email: %s]", err.Email)
} }
// ErrEmailAddressNotExist email address not exist
type ErrEmailAddressNotExist struct {
Email string
}
// IsErrEmailAddressNotExist checks if an error is an ErrEmailAddressNotExist
func IsErrEmailAddressNotExist(err error) bool {
_, ok := err.(ErrEmailAddressNotExist)
return ok
}
func (err ErrEmailAddressNotExist) Error() string {
return fmt.Sprintf("Email address does not exist [email: %s]", err.Email)
}
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error. // ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
type ErrOpenIDAlreadyUsed struct { type ErrOpenIDAlreadyUsed struct {
OpenID string OpenID string

@ -6,7 +6,6 @@
package models package models
import ( import (
"errors"
"fmt" "fmt"
"net/mail" "net/mail"
"strings" "strings"
@ -18,9 +17,6 @@ import (
"xorm.io/builder" "xorm.io/builder"
) )
// ErrEmailAddressNotExist email address not exist
var ErrEmailAddressNotExist = errors.New("Email address does not exist")
// EmailAddress is the list of all email addresses of a user. Can contain the // EmailAddress is the list of all email addresses of a user. Can contain the
// primary email address, but is not obligatory. // primary email address, but is not obligatory.
type EmailAddress struct { type EmailAddress struct {
@ -243,7 +239,7 @@ func DeleteEmailAddress(email *EmailAddress) (err error) {
if err != nil { if err != nil {
return err return err
} else if deleted != 1 { } else if deleted != 1 {
return ErrEmailAddressNotExist return ErrEmailAddressNotExist{Email: email.Email}
} }
return nil return nil
} }

@ -111,6 +111,8 @@ func DeleteEmail(ctx *context.APIContext) {
// responses: // responses:
// "204": // "204":
// "$ref": "#/responses/empty" // "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
form := web.GetForm(ctx).(*api.DeleteEmailOption) form := web.GetForm(ctx).(*api.DeleteEmailOption)
if len(form.Emails) == 0 { if len(form.Emails) == 0 {
ctx.Status(http.StatusNoContent) ctx.Status(http.StatusNoContent)
@ -126,6 +128,10 @@ func DeleteEmail(ctx *context.APIContext) {
} }
if err := models.DeleteEmailAddresses(emails); err != nil { if err := models.DeleteEmailAddresses(emails); err != nil {
if models.IsErrEmailAddressNotExist(err) {
ctx.Error(http.StatusNotFound, "DeleteEmailAddresses", err)
return
}
ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err) ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err)
return return
} }

@ -10221,6 +10221,9 @@
"responses": { "responses": {
"204": { "204": {
"$ref": "#/responses/empty" "$ref": "#/responses/empty"
},
"404": {
"$ref": "#/responses/notFound"
} }
} }
} }

Loading…
Cancel
Save