瀏覽代碼

rsponse 404 when delete not exist email (#15383)

fix #15357

Signed-off-by: a101211279 <1012112796@qq.com>
tags/v1.15.0-rc1
a1012112796 3 年之前
父節點
當前提交
e375cbfd46
沒有連結到貢獻者的電子郵件帳戶。
共有 5 個檔案被更改,包括 130 行新增5 行删除
  1. 105
    0
      integrations/api_user_email_test.go
  2. 15
    0
      models/error.go
  3. 1
    5
      models/user_mail.go
  4. 6
    0
      routers/api/v1/user/email.go
  5. 3
    0
      templates/swagger/v1_json.tmpl

+ 105
- 0
integrations/api_user_email_test.go 查看文件

@@ -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)
}

+ 15
- 0
models/error.go 查看文件

@@ -222,6 +222,21 @@ func (err ErrEmailInvalid) Error() string {
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.
type ErrOpenIDAlreadyUsed struct {
OpenID string

+ 1
- 5
models/user_mail.go 查看文件

@@ -6,7 +6,6 @@
package models

import (
"errors"
"fmt"
"net/mail"
"strings"
@@ -18,9 +17,6 @@ import (
"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
// primary email address, but is not obligatory.
type EmailAddress struct {
@@ -243,7 +239,7 @@ func DeleteEmailAddress(email *EmailAddress) (err error) {
if err != nil {
return err
} else if deleted != 1 {
return ErrEmailAddressNotExist
return ErrEmailAddressNotExist{Email: email.Email}
}
return nil
}

+ 6
- 0
routers/api/v1/user/email.go 查看文件

@@ -111,6 +111,8 @@ func DeleteEmail(ctx *context.APIContext) {
// responses:
// "204":
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
form := web.GetForm(ctx).(*api.DeleteEmailOption)
if len(form.Emails) == 0 {
ctx.Status(http.StatusNoContent)
@@ -126,6 +128,10 @@ func DeleteEmail(ctx *context.APIContext) {
}

if err := models.DeleteEmailAddresses(emails); err != nil {
if models.IsErrEmailAddressNotExist(err) {
ctx.Error(http.StatusNotFound, "DeleteEmailAddresses", err)
return
}
ctx.Error(http.StatusInternalServerError, "DeleteEmailAddresses", err)
return
}

+ 3
- 0
templates/swagger/v1_json.tmpl 查看文件

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

Loading…
取消
儲存