71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
redislib "gateway/internal/library/redis"
|
||
|
|
domrepo "gateway/internal/model/notification/domain/repository"
|
||
|
|
|
||
|
|
"github.com/zeromicro/go-zero/core/stores/redis"
|
||
|
|
)
|
||
|
|
|
||
|
|
// RedisIdempotencyCache implements IdempotencyCache with the shared go-zero Redis client.
|
||
|
|
type RedisIdempotencyCache struct {
|
||
|
|
client *redis.Redis
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewRedisIdempotencyCache(client *redislib.Client) domrepo.IdempotencyCache {
|
||
|
|
if client == nil || client.Zero() == nil {
|
||
|
|
panic("notification: redis client is required")
|
||
|
|
}
|
||
|
|
return &RedisIdempotencyCache{client: client.Zero()}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *RedisIdempotencyCache) Get(ctx context.Context, key string) ([]byte, error) {
|
||
|
|
val, err := c.client.GetCtx(ctx, key)
|
||
|
|
if errors.Is(err, redis.Nil) {
|
||
|
|
return nil, nil
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return []byte(val), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *RedisIdempotencyCache) Set(ctx context.Context, key string, value []byte, ttl time.Duration) error {
|
||
|
|
seconds := int(ttl.Seconds())
|
||
|
|
if seconds < 1 {
|
||
|
|
seconds = 1
|
||
|
|
}
|
||
|
|
return c.client.SetexCtx(ctx, key, string(value), seconds)
|
||
|
|
}
|
||
|
|
|
||
|
|
// RedisQuotaCounter implements QuotaCounter with the shared go-zero Redis client.
|
||
|
|
type RedisQuotaCounter struct {
|
||
|
|
client *redis.Redis
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewRedisQuotaCounter(client *redislib.Client) domrepo.QuotaCounter {
|
||
|
|
if client == nil || client.Zero() == nil {
|
||
|
|
panic("notification: redis client is required")
|
||
|
|
}
|
||
|
|
return &RedisQuotaCounter{client: client.Zero()}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *RedisQuotaCounter) Incr(ctx context.Context, key string, ttl time.Duration) (int64, error) {
|
||
|
|
count, err := c.client.IncrCtx(ctx, key)
|
||
|
|
if err != nil {
|
||
|
|
return 0, err
|
||
|
|
}
|
||
|
|
seconds := int(ttl.Seconds())
|
||
|
|
if seconds < 1 {
|
||
|
|
seconds = 1
|
||
|
|
}
|
||
|
|
if err := c.client.ExpireCtx(ctx, key, seconds); err != nil {
|
||
|
|
return count, err
|
||
|
|
}
|
||
|
|
return count, nil
|
||
|
|
}
|