From bdc99c103a7c72d00d2c0faf93205ed49b7ccb70 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Thu, 26 Jun 2025 19:11:14 -0300 Subject: [PATCH] refactor(service): use Errorf instead of errors.Join --- repository/repository.go | 2 ++ service/token.go | 22 +++++++++++----------- service/user.go | 11 ++++++----- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/repository/repository.go b/repository/repository.go index a0fe0c7..ec447b9 100644 --- a/repository/repository.go +++ b/repository/repository.go @@ -10,6 +10,8 @@ import ( "forge.capytal.company/loreddev/x/tinyssert" ) +// TODO: Add rowback to all return errors, or use context to cancel operations + type baseRepostiory struct { db *sql.DB diff --git a/service/token.go b/service/token.go index f706a49..94bb434 100644 --- a/service/token.go +++ b/service/token.go @@ -58,7 +58,7 @@ func (svc *Token) Issue(user model.User) (string, error) { // TODO: Return a ref jti, err := uuid.NewV7() if err != nil { - return "", errors.Join(errors.New("service: failed to generate token UUID"), err) + return "", fmt.Errorf("service: failed to generate token UUID: %w", err) } now := time.Now() @@ -76,7 +76,7 @@ func (svc *Token) Issue(user model.User) (string, error) { // TODO: Return a ref signed, err := t.SignedString(svc.privateKey) if err != nil { - return "", errors.Join(errors.New("service: failed to sign token"), err) + return "", fmt.Errorf("service: failed to sign token: %w", err) } // TODO: Store refresh tokens in repo @@ -87,7 +87,7 @@ func (svc *Token) Issue(user model.User) (string, error) { // TODO: Return a ref DateExpires: expires, }) if err != nil { - return "", errors.Join(errors.New("service: failed to save token"), err) + return "", fmt.Errorf("service: failed to save token: %w", err) } return signed, nil @@ -106,7 +106,7 @@ func (svc Token) Parse(tokenStr string) (*jwt.Token, error) { }, jwt.WithValidMethods([]string{(&jwt.SigningMethodEd25519{}).Alg()})) if err != nil { log.Error("Invalid token", slog.String("error", err.Error())) - return nil, errors.Join(errors.New("service: invalid token"), err) + return nil, fmt.Errorf("service: invalid token: %w", err) } // TODO: Check issuer and if the token was issued at the correct date @@ -114,7 +114,7 @@ func (svc Token) Parse(tokenStr string) (*jwt.Token, error) { _, ok := token.Claims.(jwt.MapClaims) if !ok { log.Error("Invalid claims type", slog.String("claims", fmt.Sprintf("%#v", token.Claims))) - return nil, errors.New("service: invalid claims type") + return nil, fmt.Errorf("service: invalid claims type") } return token, nil @@ -136,18 +136,18 @@ func (svc Token) Revoke(token *jwt.Token) error { jti, err := uuid.Parse(claims.ID) if err != nil { - return errors.Join(errors.New("service: invalid token UUID"), err) + return fmt.Errorf("service: invalid token UUID: %w", err) } user, err := uuid.Parse(claims.Subject) if err != nil { - return errors.Join(errors.New("service: invalid token subject UUID"), err) + return fmt.Errorf("service: invalid token subject UUID: %w", err) } // TODO: Mark tokens as revoked instead of deleting them err = svc.repo.Delete(jti, user) if err != nil { - return errors.Join(errors.New("service: failed to delete token"), err) + return fmt.Errorf("service: failed to delete token: %w", err) } return nil @@ -169,19 +169,19 @@ func (svc Token) IsRevoked(token *jwt.Token) (bool, error) { jti, err := uuid.Parse(claims.ID) if err != nil { - return false, errors.Join(errors.New("service: invalid token UUID"), err) + return false, fmt.Errorf("service: invalid token UUID: %w", err) } user, err := uuid.Parse(claims.Subject) if err != nil { - return false, errors.Join(errors.New("service: invalid token subject UUID"), err) + return false, fmt.Errorf("service: invalid token subject UUID: %w", err) } _, err = svc.repo.Get(jti, user) if errors.Is(err, repository.ErrNotFound) { return true, nil } else if err != nil { - return false, errors.Join(errors.New("service: failed to get token"), err) + return false, fmt.Errorf("service: failed to get token: %w", err) } return false, nil diff --git a/service/user.go b/service/user.go index f0329fb..c50c71e 100644 --- a/service/user.go +++ b/service/user.go @@ -2,6 +2,7 @@ package service import ( "errors" + "fmt" "log/slog" "time" @@ -40,12 +41,12 @@ func (svc *User) Register(username, password string) (model.User, error) { hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { - return model.User{}, errors.Join(errors.New("service: unable to generate password hash")) + return model.User{}, errors.New("service: unable to generate password hash") } id, err := uuid.NewV7() if err != nil { - return model.User{}, errors.Join(errors.New("service: unable to create user id"), err) + return model.User{}, fmt.Errorf("service: unable to create user id", err) } now := time.Now() @@ -60,7 +61,7 @@ func (svc *User) Register(username, password string) (model.User, error) { u, err = svc.repo.Create(u) if err != nil { - return model.User{}, errors.Join(errors.New("service: failed to create user model"), err) + return model.User{}, fmt.Errorf("service: failed to create user model: %w", err) } return u, nil @@ -76,12 +77,12 @@ func (svc *User) Login(username, password string) (user model.User, err error) { user, err = svc.repo.GetByUsername(username) if err != nil { - return model.User{}, errors.Join(errors.New("service: unable to find user"), err) + return model.User{}, fmt.Errorf("service: unable to find user: %w", err) } err = bcrypt.CompareHashAndPassword(user.Password, []byte(password)) if err != nil { - return model.User{}, errors.Join(errors.New("service: unable to compare passwords"), err) + return model.User{}, fmt.Errorf("service: unable to compare passwords: %w", err) } return user, nil