Skip to content

Commit 2c14378

Browse files
authored
feat: [#495] Centralize Error Messages in Framework (PR#2) (#666)
* add new errors in auth module * add custom errors for cache * add custom errors for console * add custom errors for crypt * add custom errors for crypt * add custom errors for event * add custom errors for facade * optimize cache * add custom errors for filesystem * add custom errors for filesystem * add custom errors for hash * add custom errors for log * add custom errors for lang * add custom errors for validation * add custom errors for testing * add custom errors for schedule * add custom errors for route * add custom errors for queue * add custom errors for database * fix:test * fix:test * fix:test * fix:test * fix:test * fix:test * reorder errors message and remove Err prefix * . * . * update cache driver * update cache driver * remove unused errors.go * add errors to support console * add errors for support/file
1 parent 034d42c commit 2c14378

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+642
-481
lines changed

auth/auth.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package auth
22

33
import (
4-
"errors"
54
"strings"
65
"time"
76

@@ -14,6 +13,7 @@ import (
1413
"github.com/goravel/framework/contracts/config"
1514
"github.com/goravel/framework/contracts/database/orm"
1615
"github.com/goravel/framework/contracts/http"
16+
"github.com/goravel/framework/errors"
1717
"github.com/goravel/framework/support/carbon"
1818
"github.com/goravel/framework/support/database"
1919
)
@@ -58,16 +58,16 @@ func (a *Auth) Guard(name string) contractsauth.Auth {
5858
func (a *Auth) User(user any) error {
5959
auth, ok := a.ctx.Value(ctxKey).(Guards)
6060
if !ok || auth[a.guard] == nil {
61-
return ErrorParseTokenFirst
61+
return errors.AuthParseTokenFirst
6262
}
6363
if auth[a.guard].Claims == nil {
64-
return ErrorParseTokenFirst
64+
return errors.AuthParseTokenFirst
6565
}
6666
if auth[a.guard].Claims.Key == "" {
67-
return ErrorInvalidKey
67+
return errors.AuthInvalidKey
6868
}
6969
if auth[a.guard].Token == "" {
70-
return ErrorTokenExpired
70+
return errors.AuthTokenExpired
7171
}
7272
if err := a.orm.Query().FindOrFail(user, clause.Eq{Column: clause.PrimaryColumn, Value: auth[a.guard].Claims.Key}); err != nil {
7373
return err
@@ -79,10 +79,10 @@ func (a *Auth) User(user any) error {
7979
func (a *Auth) Id() (string, error) {
8080
auth, ok := a.ctx.Value(ctxKey).(Guards)
8181
if !ok || auth[a.guard] == nil {
82-
return "", ErrorParseTokenFirst
82+
return "", errors.AuthParseTokenFirst
8383
}
8484
if auth[a.guard].Token == "" {
85-
return "", ErrorTokenExpired
85+
return "", errors.AuthTokenExpired
8686
}
8787

8888
return auth[a.guard].Claims.Key, nil
@@ -91,10 +91,10 @@ func (a *Auth) Id() (string, error) {
9191
func (a *Auth) Parse(token string) (*contractsauth.Payload, error) {
9292
token = strings.ReplaceAll(token, "Bearer ", "")
9393
if a.cache == nil {
94-
return nil, errors.New("cache support is required")
94+
return nil, errors.CacheSupportRequired.SetModule(errors.ModuleAuth)
9595
}
9696
if a.tokenIsDisabled(token) {
97-
return nil, ErrorTokenDisabled
97+
return nil, errors.AuthTokenDisabled
9898
}
9999

100100
jwtSecret := a.config.GetString("jwt.secret")
@@ -107,7 +107,7 @@ func (a *Auth) Parse(token string) (*contractsauth.Payload, error) {
107107
if errors.Is(err, jwt.ErrTokenExpired) && tokenClaims != nil {
108108
claims, ok := tokenClaims.Claims.(*Claims)
109109
if !ok {
110-
return nil, ErrorInvalidClaims
110+
return nil, errors.AuthInvalidClaims
111111
}
112112

113113
a.makeAuthContext(claims, "")
@@ -117,18 +117,18 @@ func (a *Auth) Parse(token string) (*contractsauth.Payload, error) {
117117
Key: claims.Key,
118118
ExpireAt: claims.ExpiresAt.Local(),
119119
IssuedAt: claims.IssuedAt.Local(),
120-
}, ErrorTokenExpired
120+
}, errors.AuthTokenExpired
121121
}
122122

123-
return nil, ErrorInvalidToken
123+
return nil, errors.AuthInvalidToken
124124
}
125125
if tokenClaims == nil || !tokenClaims.Valid {
126-
return nil, ErrorInvalidToken
126+
return nil, errors.AuthInvalidToken
127127
}
128128

129129
claims, ok := tokenClaims.Claims.(*Claims)
130130
if !ok {
131-
return nil, ErrorInvalidClaims
131+
return nil, errors.AuthInvalidClaims
132132
}
133133

134134
a.makeAuthContext(claims, token)
@@ -144,7 +144,7 @@ func (a *Auth) Parse(token string) (*contractsauth.Payload, error) {
144144
func (a *Auth) Login(user any) (token string, err error) {
145145
id := database.GetID(user)
146146
if id == nil {
147-
return "", ErrorNoPrimaryKeyField
147+
return "", errors.AuthNoPrimaryKeyField
148148
}
149149

150150
return a.LoginUsingID(id)
@@ -153,7 +153,7 @@ func (a *Auth) Login(user any) (token string, err error) {
153153
func (a *Auth) LoginUsingID(id any) (token string, err error) {
154154
jwtSecret := a.config.GetString("jwt.secret")
155155
if jwtSecret == "" {
156-
return "", ErrorEmptySecret
156+
return "", errors.AuthEmptySecret
157157
}
158158

159159
nowTime := carbon.Now()
@@ -165,7 +165,7 @@ func (a *Auth) LoginUsingID(id any) (token string, err error) {
165165
expireTime := nowTime.AddMinutes(ttl).StdTime()
166166
key := cast.ToString(id)
167167
if key == "" {
168-
return "", ErrorInvalidKey
168+
return "", errors.AuthInvalidKey
169169
}
170170
claims := Claims{
171171
key,
@@ -191,10 +191,10 @@ func (a *Auth) LoginUsingID(id any) (token string, err error) {
191191
func (a *Auth) Refresh() (token string, err error) {
192192
auth, ok := a.ctx.Value(ctxKey).(Guards)
193193
if !ok || auth[a.guard] == nil {
194-
return "", ErrorParseTokenFirst
194+
return "", errors.AuthParseTokenFirst
195195
}
196196
if auth[a.guard].Claims == nil {
197-
return "", ErrorParseTokenFirst
197+
return "", errors.AuthParseTokenFirst
198198
}
199199

200200
nowTime := carbon.Now()
@@ -206,7 +206,7 @@ func (a *Auth) Refresh() (token string, err error) {
206206

207207
expireTime := carbon.FromStdTime(auth[a.guard].Claims.ExpiresAt.Time).AddMinutes(refreshTtl)
208208
if nowTime.Gt(expireTime) {
209-
return "", ErrorRefreshTimeExceeded
209+
return "", errors.AuthRefreshTimeExceeded
210210
}
211211

212212
return a.LoginUsingID(auth[a.guard].Claims.Key)
@@ -219,13 +219,13 @@ func (a *Auth) Logout() error {
219219
}
220220

221221
if a.cache == nil {
222-
return errors.New("cache support is required")
222+
return errors.CacheSupportRequired.SetModule(errors.ModuleAuth)
223223
}
224224

225225
ttl := a.config.GetInt("jwt.ttl")
226226
if ttl == 0 {
227227
if ok := a.cache.Forever(getDisabledCacheKey(auth[a.guard].Token), true); !ok {
228-
return errors.New("cache forever failed")
228+
return errors.CacheForeverFailed.SetModule(errors.ModuleAuth)
229229
}
230230
} else {
231231
if err := a.cache.Put(getDisabledCacheKey(auth[a.guard].Token),

auth/auth_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package auth
22

33
import (
44
"context"
5-
"errors"
65
"sync"
76
"testing"
87
"time"
@@ -15,6 +14,7 @@ import (
1514
authcontract "github.com/goravel/framework/contracts/auth"
1615
"github.com/goravel/framework/contracts/http"
1716
"github.com/goravel/framework/database/orm"
17+
"github.com/goravel/framework/errors"
1818
cachemock "github.com/goravel/framework/mocks/cache"
1919
configmock "github.com/goravel/framework/mocks/config"
2020
ormmock "github.com/goravel/framework/mocks/database/orm"
@@ -117,7 +117,7 @@ func (s *AuthTestSuite) TestLoginUsingID_EmptySecret() {
117117

118118
token, err := s.auth.LoginUsingID(1)
119119
s.Empty(token)
120-
s.ErrorIs(err, ErrorEmptySecret)
120+
s.ErrorIs(err, errors.AuthEmptySecret)
121121

122122
s.mockConfig.AssertExpectations(s.T())
123123
}
@@ -128,7 +128,7 @@ func (s *AuthTestSuite) TestLoginUsingID_InvalidKey() {
128128

129129
token, err := s.auth.LoginUsingID("")
130130
s.Empty(token)
131-
s.ErrorIs(err, ErrorInvalidKey)
131+
s.ErrorIs(err, errors.AuthInvalidKey)
132132

133133
s.mockConfig.AssertExpectations(s.T())
134134
}
@@ -198,7 +198,7 @@ func (s *AuthTestSuite) TestLogin_ErrorModel() {
198198
errorUser.Name = "Goravel"
199199
token, err := s.auth.Login(&errorUser)
200200
s.Empty(token)
201-
s.EqualError(err, "the primaryKey field was not found in the model, set primaryKey like orm.Model")
201+
s.EqualError(err, errors.AuthNoPrimaryKeyField.Error())
202202
}
203203

204204
func (s *AuthTestSuite) TestLogin_NoPrimaryKey() {
@@ -212,7 +212,7 @@ func (s *AuthTestSuite) TestLogin_NoPrimaryKey() {
212212
user.Name = "Goravel"
213213
token, err := s.auth.Login(&user)
214214
s.Empty(token)
215-
s.ErrorIs(err, ErrorNoPrimaryKeyField)
215+
s.ErrorIs(err, errors.AuthNoPrimaryKeyField)
216216
}
217217

218218
func (s *AuthTestSuite) TestParse_TokenDisabled() {
@@ -221,7 +221,7 @@ func (s *AuthTestSuite) TestParse_TokenDisabled() {
221221

222222
payload, err := s.auth.Parse(token)
223223
s.Nil(payload)
224-
s.EqualError(err, "token is disabled")
224+
s.EqualError(err, errors.AuthTokenDisabled.Error())
225225
}
226226

227227
func (s *AuthTestSuite) TestParse_TokenInvalid() {
@@ -260,7 +260,7 @@ func (s *AuthTestSuite) TestParse_TokenExpired() {
260260
ExpireAt: jwt.NewNumericDate(expireAt).Local(),
261261
IssuedAt: jwt.NewNumericDate(issuedAt).Local(),
262262
}, payload)
263-
s.ErrorIs(err, ErrorTokenExpired)
263+
s.ErrorIs(err, errors.AuthTokenExpired)
264264

265265
carbon.UnsetTestNow()
266266

@@ -271,7 +271,7 @@ func (s *AuthTestSuite) TestParse_InvalidCache() {
271271
auth := NewAuth(testUserGuard, nil, s.mockConfig, s.mockContext, s.mockOrm)
272272
payload, err := auth.Parse("1")
273273
s.Nil(payload)
274-
s.EqualError(err, "cache support is required")
274+
s.EqualError(err, errors.CacheSupportRequired.SetModule(errors.ModuleAuth).Error())
275275
}
276276

277277
func (s *AuthTestSuite) TestParse_Success() {
@@ -326,15 +326,15 @@ func (s *AuthTestSuite) TestParse_ExpiredAndInvalid() {
326326
s.mockCache.On("GetBool", "jwt:disabled:"+token, false).Return(false).Once()
327327

328328
_, err := s.auth.Parse(token)
329-
s.ErrorIs(err, ErrorInvalidToken)
329+
s.ErrorIs(err, errors.AuthInvalidToken)
330330

331331
s.mockConfig.AssertExpectations(s.T())
332332
}
333333

334334
func (s *AuthTestSuite) TestUser_NoParse() {
335335
var user User
336336
err := s.auth.User(user)
337-
s.EqualError(err, "parse token first")
337+
s.EqualError(err, errors.AuthParseTokenFirst.Error())
338338

339339
s.mockConfig.AssertExpectations(s.T())
340340
}
@@ -380,7 +380,7 @@ func (s *AuthTestSuite) TestID_TokenExpired() {
380380

381381
// Parse the token
382382
_, err = s.auth.Parse(token)
383-
s.ErrorIs(err, ErrorTokenExpired)
383+
s.ErrorIs(err, errors.AuthTokenExpired)
384384

385385
// Now, call the ID method and expect it to return an empty value
386386
id, _ := s.auth.Id()
@@ -397,7 +397,7 @@ func (s *AuthTestSuite) TestID_TokenInvalid() {
397397
s.mockCache.On("GetBool", "jwt:disabled:"+token, false).Return(false).Once()
398398

399399
_, err := s.auth.Parse(token)
400-
s.ErrorIs(err, ErrorInvalidToken)
400+
s.ErrorIs(err, errors.AuthInvalidToken)
401401

402402
id, _ := s.auth.Id()
403403
s.Empty(id)
@@ -441,11 +441,11 @@ func (s *AuthTestSuite) TestUser_Expired() {
441441

442442
payload, err := s.auth.Parse(token)
443443
s.NotNil(payload)
444-
s.ErrorIs(err, ErrorTokenExpired)
444+
s.ErrorIs(err, errors.AuthTokenExpired)
445445

446446
var user User
447447
err = s.auth.User(&user)
448-
s.EqualError(err, "token expired")
448+
s.EqualError(err, errors.AuthTokenExpired.Error())
449449

450450
s.mockConfig.On("GetInt", "jwt.refresh_ttl").Return(2).Once()
451451

@@ -478,19 +478,19 @@ func (s *AuthTestSuite) TestUser_RefreshExpired() {
478478

479479
payload, err := s.auth.Parse(token)
480480
s.NotNil(payload)
481-
s.ErrorIs(err, ErrorTokenExpired)
481+
s.ErrorIs(err, errors.AuthTokenExpired)
482482

483483
var user User
484484
err = s.auth.User(&user)
485-
s.EqualError(err, "token expired")
485+
s.EqualError(err, errors.AuthTokenExpired.Error())
486486

487487
s.mockConfig.On("GetInt", "jwt.refresh_ttl").Return(1).Once()
488488

489489
carbon.SetTestNow(carbon.Now().AddMinutes(2))
490490

491491
token, err = s.auth.Refresh()
492492
s.Empty(token)
493-
s.EqualError(err, "refresh time exceeded")
493+
s.EqualError(err, errors.AuthRefreshTimeExceeded.Error())
494494

495495
carbon.UnsetTestNow()
496496

@@ -577,7 +577,7 @@ func (s *AuthTestSuite) TestUser_Success_MultipleParse() {
577577
func (s *AuthTestSuite) TestRefresh_NotParse() {
578578
token, err := s.auth.Refresh()
579579
s.Empty(token)
580-
s.EqualError(err, "parse token first")
580+
s.EqualError(err, errors.AuthParseTokenFirst.Error())
581581

582582
s.mockConfig.AssertExpectations(s.T())
583583
}
@@ -602,7 +602,7 @@ func (s *AuthTestSuite) TestRefresh_RefreshTimeExceeded() {
602602

603603
token, err = s.auth.Refresh()
604604
s.Empty(token)
605-
s.EqualError(err, "refresh time exceeded")
605+
s.EqualError(err, errors.AuthRefreshTimeExceeded.Error())
606606

607607
carbon.UnsetTestNow()
608608

@@ -653,7 +653,7 @@ func (s *AuthTestSuite) TestLogout_CacheUnsupported() {
653653
token, err := s.auth.LoginUsingID(1)
654654
s.NotEmpty(token)
655655
s.Nil(err)
656-
s.EqualError(s.auth.Logout(), "cache support is required")
656+
s.EqualError(s.auth.Logout(), errors.CacheSupportRequired.SetModule(errors.ModuleAuth).Error())
657657

658658
s.mockConfig.AssertExpectations(s.T())
659659
}
@@ -740,7 +740,7 @@ func (s *AuthTestSuite) TestLogout_Error_TTL_Is_0() {
740740

741741
s.mockCache.On("Forever", testifymock.Anything, true).Return(false).Once()
742742

743-
s.EqualError(s.auth.Logout(), "cache forever failed")
743+
s.EqualError(s.auth.Logout(), errors.CacheForeverFailed.SetModule(errors.ModuleAuth).Error())
744744

745745
s.mockConfig.AssertExpectations(s.T())
746746
}

auth/errors.go

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)