store.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package bep44
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. var ErrItemNotFound = errors.New("item not found")
  7. type Store interface {
  8. Put(*Item) error
  9. Get(Target) (*Item, error)
  10. Del(Target) error
  11. }
  12. // Wrapper is in charge of validate all new items and
  13. // decide when to store, or ignore them depending of the BEP 44 definition.
  14. // It is also in charge of removing expired items.
  15. type Wrapper struct {
  16. s Store
  17. exp time.Duration
  18. }
  19. func NewWrapper(s Store, exp time.Duration) *Wrapper {
  20. return &Wrapper{s: s, exp: exp}
  21. }
  22. func (w *Wrapper) Put(i *Item) error {
  23. if err := Check(i); err != nil {
  24. return err
  25. }
  26. is, err := w.s.Get(i.Target())
  27. if errors.Is(err, ErrItemNotFound) {
  28. i.created = time.Now().Local()
  29. return w.s.Put(i)
  30. }
  31. if err != nil {
  32. return err
  33. }
  34. if err := CheckIncoming(is, i); err != nil {
  35. return err
  36. }
  37. i.created = time.Now().Local()
  38. return w.s.Put(i)
  39. }
  40. func (w *Wrapper) Get(t Target) (*Item, error) {
  41. i, err := w.s.Get(t)
  42. if err != nil {
  43. return nil, err
  44. }
  45. if i.created.Add(w.exp).After(time.Now().Local()) {
  46. return i, nil
  47. }
  48. if err := w.s.Del(t); err != nil {
  49. return nil, err
  50. }
  51. return nil, ErrItemNotFound
  52. }