Skip to content

Commit 8f047c1

Browse files
authored
Feature/errors (#1)
* Handle system errors * Logging user errors * Validation errors * Validation graphql field values * Return validation error from httpin request converter * Refactor SendError function
1 parent e192639 commit 8f047c1

54 files changed

Lines changed: 1312 additions & 563 deletions

Some content is hidden

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

auth/middleware.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ package auth
33
import (
44
"braces.dev/errtrace"
55
"errors"
6-
"github.com/go-modulus/modulus/errors/errhttp"
6+
"github.com/go-modulus/modulus/http/errhttp"
77
"github.com/go-modulus/modulus/logger"
88
"github.com/gofrs/uuid"
9-
"log/slog"
109
"net/http"
1110
"regexp"
1211
)
@@ -16,18 +15,18 @@ var authRegexp = regexp.MustCompile(`(Bearer[ ]+)([^,\n$ ]+)`)
1615
type Middleware struct {
1716
authenticator Authenticator
1817
config *MiddlewareConfig
19-
logger *slog.Logger
18+
errorPipeline *errhttp.ErrorPipeline
2019
}
2120

2221
func NewMiddleware(
2322
authenticator Authenticator,
2423
config *MiddlewareConfig,
25-
logger *slog.Logger,
24+
errorPipeline *errhttp.ErrorPipeline,
2625
) *Middleware {
2726
return &Middleware{
2827
authenticator: authenticator,
2928
config: config,
30-
logger: logger,
29+
errorPipeline: errorPipeline,
3130
}
3231
}
3332

@@ -70,7 +69,7 @@ func (a *Middleware) Middleware(next http.Handler) errhttp.Handler {
7069
}
7170

7271
func (a *Middleware) HttpMiddleware() func(http.Handler) http.Handler {
73-
return errhttp.WrapMiddleware(a.logger, a.Middleware)
72+
return errhttp.WrapMiddleware(a.errorPipeline, a.Middleware)
7473
}
7574

7675
func (a *Middleware) parseAccessToken(token string) (string, error) {

auth/password_auth.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"golang.org/x/crypto/bcrypt"
1010
)
1111

12+
var ErrInvalidIdentity = errors.New("invalid identity")
1213
var ErrIdentityIsBlocked = errors.New("identity is blocked")
1314
var ErrInvalidPassword = errors.New("invalid password")
1415
var ErrCannotHashPassword = errors.New("cannot hash password")
@@ -34,11 +35,13 @@ func NewPasswordAuthenticator(
3435
// Errors:
3536
// * github.com/go-modulus/modulus/auth.ErrIdentityIsBlocked - if the identity is blocked.
3637
// * github.com/go-modulus/modulus/auth.ErrInvalidPassword - if the password is invalid.
37-
// * Any error from the IdentityRepository.Get method (e.g. github.com/go-modulus/modulus/auth/repository.ErrIdentityNotFound).
38-
// * Any error from the CredentialRepository.GetLast method (e.g. github.com/go-modulus/modulus/auth/repository.ErrCredentialNotFound).
38+
// * github.com/go-modulus/modulus/auth.ErrInvalidIdentity - if identity is not found in the repository.
3939
func (a *PasswordAuthenticator) Authenticate(ctx context.Context, identity, password string) (Performer, error) {
4040
identityObj, err := a.identityRepository.Get(ctx, identity)
4141
if err != nil {
42+
if errors.Is(err, repository.ErrIdentityNotFound) {
43+
return Performer{}, errtrace.Wrap(ErrInvalidIdentity)
44+
}
4245
return Performer{}, errtrace.Wrap(err)
4346
}
4447

@@ -48,6 +51,9 @@ func (a *PasswordAuthenticator) Authenticate(ctx context.Context, identity, pass
4851

4952
cred, err := a.credentialRepository.GetLast(ctx, identityObj.ID, string(repository.CredentialTypePassword))
5053
if err != nil {
54+
if errors.Is(err, repository.ErrCredentialNotFound) {
55+
return Performer{}, errtrace.Wrap(ErrInvalidPassword)
56+
}
5157
return Performer{}, errtrace.Wrap(err)
5258
}
5359

@@ -92,7 +98,7 @@ func (a *PasswordAuthenticator) Register(
9298

9399
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
94100
if err != nil {
95-
return repository.Identity{}, errtrace.Wrap(errors.WrapCause(ErrCannotHashPassword, err))
101+
return repository.Identity{}, errtrace.Wrap(errors.WithCause(ErrCannotHashPassword, err))
96102
}
97103

98104
_, err = a.credentialRepository.Create(

auth/plain_token_auth.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ func (a *PlainTokenAuthenticator) IssueTokens(
8585
) (TokenPair, error) {
8686
accessTokenStr, err := a.randomString(32)
8787
if err != nil {
88-
return TokenPair{}, errtrace.Wrap(errors.WrapCause(ErrCannotCreateAccessToken, err))
88+
return TokenPair{}, errtrace.Wrap(errors.WithCause(ErrCannotCreateAccessToken, err))
8989
}
9090

9191
refreshTokenStr, err := a.randomString(32)
9292
if err != nil {
93-
return TokenPair{}, errtrace.Wrap(errors.WrapCause(ErrCannotCreateRefreshToken, err))
93+
return TokenPair{}, errtrace.Wrap(errors.WithCause(ErrCannotCreateRefreshToken, err))
9494
}
9595

9696
identity, err := a.identityRepository.GetById(ctx, identityID)

auth/storage/credential_repository.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (r *DefaultCredentialRepository) Create(
4040
)
4141

4242
if err != nil {
43-
return repository.Credential{}, errtrace.Wrap(errors.WrapCause(repository.ErrCannotCreateCredential, err))
43+
return repository.Credential{}, errtrace.Wrap(errors.WithCause(repository.ErrCannotCreateCredential, err))
4444
}
4545

4646
return r.transform(cred), nil

auth/storage/identity_repository.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (r *DefaultIdentityRepository) Create(
5151
)
5252

5353
if err != nil {
54-
return repository.Identity{}, errtrace.Wrap(errors.WrapCause(repository.ErrCannotCreateIdentity, err))
54+
return repository.Identity{}, errtrace.Wrap(errors.WithCause(repository.ErrCannotCreateIdentity, err))
5555
}
5656

5757
return r.Transform(storedIdentity), nil

auth/storage/token_repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (r *DefaultTokenRepository) CreateAccessToken(
4545
}
4646
dataJson, err := json.Marshal(data)
4747
if err != nil {
48-
return repository.AccessToken{}, errtrace.Wrap(errors.WrapCause(repository.ErrCannotCreateAccessToken, err))
48+
return repository.AccessToken{}, errtrace.Wrap(errors.WithCause(repository.ErrCannotCreateAccessToken, err))
4949
}
5050

5151
storedAccessToken, err := r.queries.CreateAccessToken(
@@ -82,7 +82,7 @@ func (r *DefaultTokenRepository) CreateRefreshToken(
8282
},
8383
)
8484
if err != nil {
85-
return repository.RefreshToken{}, errtrace.Wrap(errors.WrapCause(repository.ErrCannotCreateRefreshToken, err))
85+
return repository.RefreshToken{}, errtrace.Wrap(errors.WithCause(repository.ErrCannotCreateRefreshToken, err))
8686
}
8787
return r.transformRefreshToken(storedRefreshToken), nil
8888
}

docs/_sidebar.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
- [Deployment](deployment.md)
66

77
- [Testing](testing.md)
8+
9+
- [Error Handling](error_handling.md)
810

0 commit comments

Comments
 (0)