diff options
Diffstat (limited to 'storage/link.go')
| -rw-r--r-- | storage/link.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/storage/link.go b/storage/link.go new file mode 100644 index 0000000..f334f42 --- /dev/null +++ b/storage/link.go @@ -0,0 +1,63 @@ +package storage + +import ( + "encoding/json" + "errors" + "github.com/google/uuid" + "time" +) + +type Link struct { + Id uuid.UUID + Target string + OpensFrom time.Time + OpensLeft int +} + +var Null = uuid.UUID{} + +func (l Link) Save(storage Storage[Link, uuid.UUID]) (uuid.UUID, error) { + return storage.Save(l) +} + +func (l Link) Serialize() ([]byte, error) { + return json.Marshal(l) +} + +func (l Link) Use() error { + if e := l.Valid(); e != nil { + return e + } + + remaining := l.OpensLeft - 1 + if remaining < 1 { + _ = Current.Delete(l) + return nil + } + n := Link{ + Id: l.Id, + Target: l.Target, + OpensFrom: l.OpensFrom, + OpensLeft: remaining, + } + return n.Update(Current) +} + +func (l Link) Update(storage Storage[Link, uuid.UUID]) error { + return storage.Update(l) +} + +var NoOpensError = errors.New("no opens left") +var NotYetOpenError = errors.New("not yet open") + +func (l Link) Valid() error { + if l.OpensLeft < 1 { + return NoOpensError + } + + if time.Now().Before(l.OpensFrom) { + return NotYetOpenError + } + + return nil +} |
