summaryrefslogtreecommitdiff
path: root/storage/link.go
diff options
context:
space:
mode:
authorEwy~ <ewy0@protonmail.com>2026-03-31 17:18:35 +0200
committerEwy~ <ewy0@protonmail.com>2026-03-31 17:18:35 +0200
commitcf085e93b7abc53b8ecc78c07210384e0ff8d516 (patch)
tree270bc83c7e4d1c468bd7fcc61d2d65d6f447eda6 /storage/link.go
initial commit
Diffstat (limited to 'storage/link.go')
-rw-r--r--storage/link.go63
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
+}