all repos

onasty @ c2e1526

a one-time notes service

onasty/internal/store/rdb/notecache/notecache.go(view raw)

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
package notecache

import (
	"bytes"
	"context"
	"encoding/gob"
	"strings"
	"time"

	"github.com/olexsmir/onasty/internal/dtos"
	"github.com/olexsmir/onasty/internal/store/rdb"
)

type NoteCacher interface {
	SetNote(ctx context.Context, slug string, note dtos.NoteDTO) error
	GetNote(ctx context.Context, slug string) (dtos.NoteDTO, error)
}

type NoteCache struct {
	rdb *rdb.DB
	ttl time.Duration
}

func New(rdb *rdb.DB, ttl time.Duration) *NoteCache {
	return &NoteCache{
		rdb: rdb,
		ttl: ttl,
	}
}

func (n *NoteCache) SetNote(ctx context.Context, slug string, note dtos.NoteDTO) error {
	var buf bytes.Buffer
	if err := gob.NewEncoder(&buf).Encode(note); err != nil {
		return err
	}

	_, err := n.rdb.Set(ctx, getKey(slug), buf.Bytes(), n.ttl).Result()
	return err
}

func (n *NoteCache) GetNote(ctx context.Context, slug string) (dtos.NoteDTO, error) {
	val, err := n.rdb.Get(ctx, getKey(slug)).Bytes()
	if err != nil {
		return dtos.NoteDTO{}, err
	}

	var note dtos.NoteDTO
	if err = gob.NewDecoder(bytes.NewReader(val)).Decode(&note); err != nil {
		return dtos.NoteDTO{}, err
	}

	return note, err
}

func getKey(slug string) string {
	var sb strings.Builder
	sb.WriteString("note:")
	sb.WriteString(slug)
	return sb.String()
}