content_moderation_hash_cache.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package repository
  2. import (
  3. "context"
  4. "strings"
  5. "github.com/Wei-Shaw/sub2api/internal/service"
  6. "github.com/redis/go-redis/v9"
  7. )
  8. const contentModerationFlaggedHashSetKey = "content_moderation:flagged_hashes"
  9. type contentModerationHashCache struct {
  10. rdb *redis.Client
  11. }
  12. func NewContentModerationHashCache(rdb *redis.Client) service.ContentModerationHashCache {
  13. return &contentModerationHashCache{rdb: rdb}
  14. }
  15. func (c *contentModerationHashCache) RecordFlaggedInputHash(ctx context.Context, inputHash string) error {
  16. inputHash = strings.TrimSpace(inputHash)
  17. if c == nil || c.rdb == nil || inputHash == "" {
  18. return nil
  19. }
  20. return c.rdb.SAdd(ctx, contentModerationFlaggedHashSetKey, inputHash).Err()
  21. }
  22. func (c *contentModerationHashCache) HasFlaggedInputHash(ctx context.Context, inputHash string) (bool, error) {
  23. inputHash = strings.TrimSpace(inputHash)
  24. if c == nil || c.rdb == nil || inputHash == "" {
  25. return false, nil
  26. }
  27. return c.rdb.SIsMember(ctx, contentModerationFlaggedHashSetKey, inputHash).Result()
  28. }
  29. func (c *contentModerationHashCache) DeleteFlaggedInputHash(ctx context.Context, inputHash string) (bool, error) {
  30. inputHash = strings.TrimSpace(inputHash)
  31. if c == nil || c.rdb == nil || inputHash == "" {
  32. return false, nil
  33. }
  34. deleted, err := c.rdb.SRem(ctx, contentModerationFlaggedHashSetKey, inputHash).Result()
  35. if err != nil {
  36. return false, err
  37. }
  38. return deleted > 0, nil
  39. }
  40. func (c *contentModerationHashCache) ClearFlaggedInputHashes(ctx context.Context) (int64, error) {
  41. if c == nil || c.rdb == nil {
  42. return 0, nil
  43. }
  44. deleted, err := c.rdb.SCard(ctx, contentModerationFlaggedHashSetKey).Result()
  45. if err != nil {
  46. return 0, err
  47. }
  48. if deleted == 0 {
  49. return 0, nil
  50. }
  51. if err := c.rdb.Del(ctx, contentModerationFlaggedHashSetKey).Err(); err != nil {
  52. return 0, err
  53. }
  54. return deleted, nil
  55. }
  56. func (c *contentModerationHashCache) CountFlaggedInputHashes(ctx context.Context) (int64, error) {
  57. if c == nil || c.rdb == nil {
  58. return 0, nil
  59. }
  60. return c.rdb.SCard(ctx, contentModerationFlaggedHashSetKey).Result()
  61. }