/
searchable_task.go
108 lines (80 loc) · 2.37 KB
/
searchable_task.go
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package memcached
import (
"context"
"errors"
"fmt"
"time"
"github.com/bradfitz/gomemcache/memcache"
"github.com/ryanpfalz/go-openapi/internal"
)
// SearchableTask ...
type SearchableTask struct {
client *memcache.Client
orig SearchableTaskStore
}
type SearchableTaskStore interface {
Delete(ctx context.Context, id string) error
Index(ctx context.Context, task internal.Task) error
Search(ctx context.Context, args internal.SearchParams) (internal.SearchResults, error)
}
// NewSearchableTask instantiates the Task repository.
func NewSearchableTask(client *memcache.Client, orig SearchableTaskStore) *SearchableTask {
return &SearchableTask{
client: client,
orig: orig,
}
}
// Index ...
func (t *SearchableTask) Index(ctx context.Context, task internal.Task) error {
defer newOTELSpan(ctx, "SearchableTask.Index").End()
//-
if err := t.orig.Index(ctx, task); err != nil {
return internal.WrapErrorf(err, internal.ErrorCodeUnknown, "orig.Index")
}
return nil
}
// Delete ...
func (t *SearchableTask) Delete(ctx context.Context, id string) error {
defer newOTELSpan(ctx, "SearchableTask.Delete").End()
//-
if err := t.orig.Delete(ctx, id); err != nil {
return internal.WrapErrorf(err, internal.ErrorCodeUnknown, "orig.Delete")
}
return nil
}
// Search ...
func (t *SearchableTask) Search(ctx context.Context, args internal.SearchParams) (internal.SearchResults, error) {
defer newOTELSpan(ctx, "SearchableTask.Search").End()
//-
key := newSearchableKey(args)
var res internal.SearchResults
if err := getTask(ctx, t.client, key, &res); err != nil {
if errors.Is(err, memcache.ErrCacheMiss) {
res, err := t.orig.Search(ctx, args)
if err != nil {
return internal.SearchResults{}, internal.WrapErrorf(err, internal.ErrorCodeUnknown, "orig.Search")
}
setTask(ctx, t.client, key, &res, 25*time.Second)
return res, nil
}
return internal.SearchResults{}, internal.WrapErrorf(err, internal.ErrorCodeUnknown, "get")
}
return res, nil
}
func newSearchableKey(args internal.SearchParams) string {
var (
description string
priority int8
isDone bool
)
if args.Description != nil {
description = *args.Description
}
if args.Priority != nil {
priority = int8(*args.Priority)
}
if args.IsDone != nil {
isDone = *args.IsDone
}
return fmt.Sprintf("%s_%d_%t_%d_%d", description, priority, isDone, args.From, args.Size)
}