Skip to content

Commit b8398aa

Browse files
authored
[type: refactor] refactor the envcd errors. (#107)
1 parent c45f8c1 commit b8398aa

File tree

9 files changed

+155
-91
lines changed

9 files changed

+155
-91
lines changed

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,3 @@ environment configurations detector/discovery/dictionary
3333
func NewAsyncWriter(w io.Writer, bufSize int, block bool) *AsyncLogWriter {
3434
}
3535
```
36-

internal/core/openapi/dictionary.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package openapi
1919

2020
import (
2121
"fmt"
22-
"net/http"
2322
"time"
2423

2524
"github.com/acmestack/envcd/internal/core/storage/dao"
@@ -45,7 +44,7 @@ func (openapi *Openapi) dictionary(ginCtx *gin.Context) {
4544
dict := entity.Dictionary{Id: dictId, UserId: userId, ScopeSpaceId: scopeSpaceId}
4645
dictionary, err := dao.New(openapi.storage).SelectDictionary(dict)
4746
if err != nil {
48-
return result.InternalServerErrorFailure(err.Error())
47+
return result.InternalFailure(err)
4948
}
5049
return result.Success(dictionary)
5150
})
@@ -56,7 +55,7 @@ func (openapi *Openapi) createDictionary(ginCtx *gin.Context) {
5655
param := dictParams{}
5756
if err := ginCtx.ShouldBindJSON(&param); err != nil {
5857
fmt.Printf("Bind error, %v\n", err)
59-
return result.InternalServerErrorFailure(result.EnvcdErrors[result.IllegalJsonBindingErrorCode])
58+
return result.InternalFailure(err)
6059
}
6160
// get userId and appId from gin context
6261
userId := stringsx.ToInt(ginCtx.Param("userId"))
@@ -108,18 +107,18 @@ func (openapi *Openapi) removeDictionary(ginCtx *gin.Context) {
108107
daoAction := dao.New(openapi.storage)
109108
dictionary, err := daoAction.SelectDictionary(dict)
110109
if err != nil {
111-
return result.InternalServerErrorFailure(err.Error())
110+
return result.InternalFailure(err)
112111
}
113112
if len(dictionary) == 0 {
114-
return result.Failure0(result.DictionaryNotExistErrorCode, result.EnvcdErrors[result.DictionaryNotExistErrorCode], http.StatusBadRequest)
113+
return result.Failure0(result.ErrorDictionaryNotExist)
115114
}
116115
exchangeErr := openapi.exchange.Remove(getFirstDictionary(dictionary).DictKey)
117116
if exchangeErr != nil {
118-
return result.InternalServerErrorFailure(exchangeErr.Error())
117+
return result.InternalFailure(exchangeErr)
119118
}
120119
retId, delErr := daoAction.DeleteDictionary(getFirstDictionary(dictionary))
121120
if delErr != nil {
122-
return result.InternalServerErrorFailure(delErr.Error())
121+
return result.InternalFailure(delErr)
123122
}
124123
return result.Success(retId)
125124
})

internal/core/openapi/openapi.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/acmestack/envcd/internal/pkg/context"
3232
"github.com/acmestack/envcd/internal/pkg/executor"
3333
"github.com/acmestack/envcd/pkg/entity/result"
34+
"github.com/acmestack/godkits/gox/errorsx"
3435
"github.com/acmestack/godkits/log"
3536
"github.com/gin-gonic/gin"
3637
)
@@ -85,7 +86,7 @@ func (openapi *Openapi) buildRouter() *gin.Engine {
8586
// Recovery middleware recovers from any panics and writes a 500 if there was one.
8687
router.Use(gin.CustomRecovery(func(ginCtx *gin.Context, recovered interface{}) {
8788
if err, ok := recovered.(string); ok {
88-
failure := result.InternalServerErrorFailure(fmt.Sprintf("error: %s", err))
89+
failure := result.InternalFailure(errorsx.Err(fmt.Sprintf("error: %s", err)))
8990
ginCtx.JSON(failure.HttpStatusCode, failure.Data)
9091
}
9192
ginCtx.AbortWithStatus(http.StatusInternalServerError)
@@ -150,7 +151,7 @@ func (openapi *Openapi) buildRouter() *gin.Engine {
150151
func (openapi *Openapi) response(ginCtx *gin.Context, permissionAction context.EnvcdActionFunc, action context.EnvcdActionFunc) {
151152
requestId := ginCtx.Request.Header.Get(requestIdHeader)
152153
c := openapi.contexts[requestId]
153-
ret := result.InternalServerErrorFailure(http.StatusText(http.StatusInternalServerError))
154+
ret := result.InternalFailure0()
154155
if c != nil && c.RequestId == requestId {
155156
c.PermissionAction = permissionAction
156157
c.Action = action

internal/core/openapi/user.go

+12-16
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package openapi
1919

2020
import (
2121
"fmt"
22-
"net/http"
2322
"time"
2423

2524
"github.com/acmestack/envcd/internal/core/storage/dao"
@@ -49,7 +48,7 @@ const (
4948
// hmacSecret secret
5049
hmacSecret = "9C035514A15F78"
5150
userIdKey = "userId"
52-
tokenKey = "token"
51+
tokenKey = "accessToken"
5352

5453
userStateEnabled = "enabled"
5554
userStateDisabled = "disabled"
@@ -79,27 +78,24 @@ func (openapi *Openapi) login(ginCtx *gin.Context) {
7978
param := loginParam{}
8079
if err := ginCtx.ShouldBindJSON(&param); err != nil {
8180
log.Error("Bind error, %v", err)
82-
return result.InternalServerErrorFailure("Illegal params !")
81+
return result.InternalFailure(err)
8382
}
8483

8584
users, err := dao.New(openapi.storage).SelectUser(entity.User{
8685
Name: param.Username,
8786
})
8887
if err != nil {
8988
log.Error("Query User error: %v", err)
90-
// todo error code : result.Failure0(code, message, httpStatusCode)
91-
return result.Failure("System Error!", http.StatusBadRequest)
89+
return result.InternalFailure(err)
9290
}
9391

9492
if len(users) == 0 {
95-
// todo error code : result.Failure0(code, message, httpStatusCode)
9693
log.Error("User does not exist : %v", param)
97-
return result.Failure("User does not exist!", http.StatusOK)
94+
return result.Failure0(result.ErrorUserNotFound)
9895
}
9996
user := users[0]
10097
if saltPassword(param.Password, user.Salt) != user.Password {
101-
// todo error code : result.Failure0(code, message, httpStatusCode)
102-
return result.Failure("password error!", http.StatusOK)
98+
return result.Failure0(result.ErrorUserPasswordIncorrect)
10399
}
104100
token := newJWTToken(claims{
105101
RegisteredClaims: &jwt.RegisteredClaims{
@@ -129,7 +125,7 @@ func (openapi *Openapi) createUser(ginCtx *gin.Context) {
129125
param := userParam{}
130126
if err := ginCtx.ShouldBindJSON(&param); err != nil {
131127
log.Error("Bind error, %v", err)
132-
return result.InternalServerErrorFailure("Illegal params !")
128+
return result.InternalFailure(err)
133129
}
134130
daoAction := dao.New(openapi.storage)
135131
// check if the user already exists in the database
@@ -138,11 +134,11 @@ func (openapi *Openapi) createUser(ginCtx *gin.Context) {
138134
})
139135
if err != nil {
140136
log.Error("Query User error: %v", err)
141-
return result.InternalServerErrorFailure("System Error!")
137+
return result.InternalFailure(err)
142138
}
143139
if len(users) > 0 {
144140
log.Error("User Has exists: %v", users)
145-
return result.InternalServerErrorFailure("User Has Exists!")
141+
return result.Failure0(result.ErrorUserExisted)
146142
}
147143
// generate database password by salt
148144
salt := randomSalt()
@@ -159,7 +155,7 @@ func (openapi *Openapi) createUser(ginCtx *gin.Context) {
159155
// save user
160156
if _, _, err := daoAction.InsertUser(user); err != nil {
161157
log.Error("insert error=%v", err)
162-
return result.InternalServerErrorFailure("Save User Error!")
158+
return result.Failure(result.ErrorCreateUser, err)
163159
}
164160
// fixme update success message or response token and id ?
165161
return result.Success("ok")
@@ -181,11 +177,11 @@ func (openapi *Openapi) user(ginCtx *gin.Context) {
181177
users, err := dao.New(openapi.storage).SelectUser(param)
182178
if err != nil {
183179
log.Error("select user error = %v", err)
184-
return result.InternalServerErrorFailure("Get User Error!")
180+
return result.Failure(result.ErrorUserNotFound, err)
185181
}
186182
if len(users) == 0 {
187183
log.Error("User does not exist : %v", param)
188-
return result.Failure("User does not exist!", http.StatusOK)
184+
return result.Failure0(result.ErrorUserNotFound)
189185
}
190186
return result.Success(userVO{
191187
Id: users[0].Id,
@@ -238,7 +234,7 @@ func (openapi *Openapi) users(ginCtx *gin.Context) {
238234
users, err := dao.New(openapi.storage).PageSelectUser(pageParam)
239235
if err != nil {
240236
log.Error("select users error = %v", err)
241-
return result.InternalServerErrorFailure("Get Users Error!")
237+
return result.Failure(result.ErrorUserNotFound, err)
242238
}
243239
return result.Success(pageUserVO{
244240
page, pageSize, userTransfer(users),

internal/core/plugin/chain.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/acmestack/envcd/internal/pkg/context"
2525
"github.com/acmestack/envcd/internal/pkg/executor"
2626
"github.com/acmestack/envcd/pkg/entity/result"
27+
"github.com/acmestack/godkits/gox/errorsx"
2728
)
2829

2930
// executorArray for sort.Sort(Interface)
@@ -54,7 +55,7 @@ func NewChain(executors executorArray) *Chain {
5455
// @param context chain context
5556
func (chain *Chain) Execute(context *context.Context) *result.EnvcdResult {
5657
if chain == nil || chain.executors == nil || len(chain.executors) == 0 {
57-
return result.InternalServerErrorFailure("IIllegal state for plugin chain.")
58+
return result.InternalFailure(errorsx.Err("IIllegal state for plugin chain."))
5859
}
5960
if chain.index < len(chain.executors) {
6061
currentExecutor := chain.executors[chain.index]

internal/core/plugin/chain_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/acmestack/envcd/internal/pkg/context"
2727
"github.com/acmestack/envcd/internal/pkg/executor"
2828
"github.com/acmestack/envcd/pkg/entity/result"
29+
"github.com/acmestack/godkits/gox/errorsx"
2930
)
3031

3132
func TestNewChain(t *testing.T) {
@@ -79,7 +80,7 @@ func TestExecutorChain_Execute(t *testing.T) {
7980
index: 0,
8081
},
8182
args: args{context: &context.Context{}},
82-
wantRet: result.InternalServerErrorFailure("IIllegal state for plugin chain."),
83+
wantRet: result.InternalFailure(errorsx.Err("IIllegal state for plugin chain.")),
8384
},
8485
{
8586
fields: fields{

pkg/entity/result/envcd_result.go

+32-16
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
package result
1919

2020
import (
21+
"fmt"
2122
"net/http"
2223
)
2324

2425
const (
2526
successCode = "success"
26-
failureCode = "failure"
2727
)
2828

2929
var (
@@ -54,32 +54,48 @@ func Success(data interface{}) *EnvcdResult {
5454
}
5555
}
5656

57-
// InternalServerErrorFailure response
58-
// @param message of error reason
57+
// InternalFailure response
5958
// @return *EnvcdResult
60-
func InternalServerErrorFailure(message string) *EnvcdResult {
61-
return Failure0(failureCode, message, http.StatusInternalServerError)
59+
func InternalFailure(err error) *EnvcdResult {
60+
return failure(errorEnvcdInternalServerError, err)
61+
}
62+
63+
// InternalFailure0 response
64+
// @return *EnvcdResult
65+
func InternalFailure0() *EnvcdResult {
66+
return failure(errorEnvcdInternalServerError, nil)
6267
}
6368

6469
// Failure response
65-
// @param message of error reason
66-
// @param httpStatusCode of response http status code
70+
// @param envcdError of envcd error
71+
// @param err of handler error
6772
// @return *EnvcdResult
68-
func Failure(message string, httpStatusCode int) *EnvcdResult {
69-
return Failure0(failureCode, message, httpStatusCode)
73+
func Failure(envcdError envcdError, err error) *EnvcdResult {
74+
return failure(envcdError, err)
7075
}
7176

7277
// Failure0 response
73-
// @param code of error code
74-
// @param message of error reason
75-
// @param httpStatusCode of response http status code
78+
// @param envcdError of envcd error
7679
// @return *EnvcdResult
77-
func Failure0(code string, message string, httpStatusCode int) *EnvcdResult {
80+
func Failure0(envcdErr envcdError) *EnvcdResult {
81+
return failure(envcdErr, nil)
82+
}
83+
84+
// failure response, error format: envcd internal error message [code: detail error]
85+
// @param envcdError of envcd error
86+
// @param err of error instance
87+
// @return *EnvcdResult
88+
func failure(envcdErr envcdError, err error) *EnvcdResult {
89+
message := envcdErr.message
90+
envcdErr.message = fmt.Sprintf("%s [%s]", message, envcdErr.code)
91+
if err != nil && err.Error() != "" {
92+
envcdErr.message = fmt.Sprintf("%s [%s: %s]", message, envcdErr.code, err.Error())
93+
}
7894
return &EnvcdResult{
7995
Data: map[string]interface{}{
80-
CodeKey: code,
81-
MessageKey: message,
96+
CodeKey: envcdErr.code,
97+
MessageKey: envcdErr.message,
8298
},
83-
HttpStatusCode: httpStatusCode,
99+
HttpStatusCode: envcdErr.httpStatusCode,
84100
}
85101
}

0 commit comments

Comments
 (0)