package repositories import ( "context" "fmt" "history-api/internal/models" "history-api/pkg/cache" "history-api/pkg/constants" ) type TokenRepository interface { CheckCooldown(ctx context.Context, email string, tokenType constants.TokenType) (bool, error) Get(ctx context.Context, email string, tokenType constants.TokenType) (*models.TokenEntity, error) Create(ctx context.Context, token *models.TokenEntity) error Delete(ctx context.Context, email string, tokenType constants.TokenType) error CheckVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) (bool, error) CreateVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) error DeleteVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) error } type tokenRepository struct { c cache.Cache } func NewTokenRepository(c cache.Cache) TokenRepository { return &tokenRepository{ c: c, } } func (t *tokenRepository) CreateVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) error { cacheKey := fmt.Sprintf("token:verified:%d:%s:%s", tokenType.Value(), email, id) return t.c.Set(ctx, cacheKey, true, constants.TokenVerifiedDuration) } func (t *tokenRepository) DeleteVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) error { cacheKey := fmt.Sprintf("token:verified:%d:%s:%s", tokenType.Value(), email, id) return t.c.Del(ctx, cacheKey) } func (t *tokenRepository) CheckCooldown(ctx context.Context, email string, tokenType constants.TokenType) (bool, error) { cacheKey := fmt.Sprintf("token:cooldown:%d:%s", tokenType.Value(), email) exists, err := t.c.Exists(ctx, cacheKey) return exists, err } func (t *tokenRepository) CheckVerified(ctx context.Context, email string, tokenType constants.TokenType, id string) (bool, error) { cacheKey := fmt.Sprintf("token:verified:%d:%s:%s", tokenType.Value(), email, id) exists, err := t.c.Exists(ctx, cacheKey) return exists, err } func (t *tokenRepository) Create(ctx context.Context, token *models.TokenEntity) error { cacheKey := fmt.Sprintf("token:%d:%s", token.TokenType.Value(), token.Email) err := t.c.Set(ctx, cacheKey, token, constants.TokenExpirationDuration) if err != nil { return err } cooldownKey := fmt.Sprintf("token:cooldown:%d:%s", token.TokenType.Value(), token.Email) return t.c.Set(ctx, cooldownKey, true, constants.TokenCooldownDuration) } func (t *tokenRepository) Delete(ctx context.Context, email string, tokenType constants.TokenType) error { cacheKey := fmt.Sprintf("token:%d:%s", tokenType.Value(), email) cooldownKey := fmt.Sprintf("token:cooldown:%d:%s", tokenType.Value(), email) _ = t.c.Del(ctx, cooldownKey) return t.c.Del(ctx, cacheKey) } func (t *tokenRepository) Get(ctx context.Context, email string, tokenType constants.TokenType) (*models.TokenEntity, error) { cacheKey := fmt.Sprintf("token:%d:%s", tokenType.Value(), email) var token models.TokenEntity err := t.c.Get(ctx, cacheKey, &token) if err != nil { return nil, err } return &token, nil }