Files
bssapp/svc/repository/refresh_token_repository.go
2026-02-11 17:46:22 +03:00

81 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package repository
import (
"database/sql"
"errors"
"time"
)
var ErrRefreshTokenInvalid = errors.New("refresh token invalid")
type RefreshTokenRepository struct {
DB *sql.DB
}
func NewRefreshTokenRepository(db *sql.DB) *RefreshTokenRepository {
return &RefreshTokenRepository{DB: db}
}
// Yeni refresh (HASH saklanır)
func (r *RefreshTokenRepository) IssueRefreshToken(
mkUserID int64,
tokenHash string,
expiresAt time.Time,
) error {
_, err := r.DB.Exec(`
INSERT INTO mk_refresh_tokens (mk_user_id, token_hash, expires_at)
VALUES ($1,$2,$3)
`, mkUserID, tokenHash, expiresAt)
return err
}
// Tek refreshi revoke et (rotation / logout)
func (r *RefreshTokenRepository) RevokeByHash(hash string) error {
_, err := r.DB.Exec(`
UPDATE mk_refresh_tokens
SET revoked_at = now()
WHERE token_hash = $1
AND revoked_at IS NULL
`, hash)
return err
}
// Kullanıcının tüm refreshlerini revoke et (logout-all / password change)
func (r *RefreshTokenRepository) RevokeAllForUser(mkUserID int64) error {
_, err := r.DB.Exec(`
UPDATE mk_refresh_tokens
SET revoked_at = now()
WHERE mk_user_id = $1
AND revoked_at IS NULL
`, mkUserID)
return err
}
// Geçerli refreshi tüket (validate + rotate)
func (r *RefreshTokenRepository) ConsumeValid(tokenHash string) (int64, error) {
var mkUserID int64
err := r.DB.QueryRow(`
SELECT mk_user_id
FROM mk_refresh_tokens
WHERE token_hash = $1
AND revoked_at IS NULL
AND expires_at > now()
`, tokenHash).Scan(&mkUserID)
if err != nil {
if err == sql.ErrNoRows {
return 0, ErrRefreshTokenInvalid
}
return 0, err
}
// tek kullanımlık: eskiyi revoke et
_, _ = r.DB.Exec(`
UPDATE mk_refresh_tokens
SET revoked_at = now()
WHERE token_hash = $1
`, tokenHash)
return mkUserID, nil
}