From cf085e93b7abc53b8ecc78c07210384e0ff8d516 Mon Sep 17 00:00:00 2001 From: Ewy~ Date: Tue, 31 Mar 2026 17:18:35 +0200 Subject: initial commit --- storage/link.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 storage/link.go (limited to 'storage/link.go') 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 +} -- cgit v1.3