summaryrefslogtreecommitdiff
path: root/storage/link.go
blob: f334f42fe43d649d313d32e75d3cce6263ba3345 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
}