From fbb4b1da531ed3d690f2c985f8034b21f70ade88 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Tue, 10 Jun 2025 19:06:25 -0300 Subject: [PATCH] feat(service,token): token.Revoke method --- service/token.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/service/token.go b/service/token.go index 99a39ff..dc99ab1 100644 --- a/service/token.go +++ b/service/token.go @@ -101,3 +101,36 @@ func (svc Token) Parse(tokenStr string) (*jwt.Token, error) { return token, nil } +func (svc Token) Revoke(token *jwt.Token) error { + svc.assert.NotNil(svc.log) + svc.assert.NotNil(svc.repo) + svc.assert.NotNil(token) + + claims, ok := token.Claims.(jwt.RegisteredClaims) + if !ok { + return errors.New("service: invalid claims type") + } + + log := svc.log.With(slog.String("token_id", claims.ID)) + log.Info("Revoking token") + defer log.Info("Finished revoking token") + + jti, err := uuid.Parse(claims.ID) + if err != nil { + return errors.Join(errors.New("service: invalid token UUID"), err) + } + + user, err := uuid.Parse(claims.Subject) + if err != nil { + return errors.Join(errors.New("service: invalid token subject UUID"), 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 nil +} +