/
writer_redis.go
92 lines (73 loc) · 2.27 KB
/
writer_redis.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
package fixtures
import (
"context"
"fmt"
"time"
"github.com/justtrackio/gosoline/pkg/cfg"
"github.com/justtrackio/gosoline/pkg/log"
"github.com/justtrackio/gosoline/pkg/redis"
)
const (
RedisOpRpush = "RPUSH"
RedisOpSet = "SET"
)
type RedisFixture struct {
Key string
Value interface{}
Expiry time.Duration
}
type redisOpHandler func(ctx context.Context, client redis.Client, fixture *RedisFixture) error
var redisHandlers = map[string]redisOpHandler{
RedisOpSet: func(ctx context.Context, client redis.Client, fixture *RedisFixture) error {
return client.Set(ctx, fixture.Key, fixture.Value, fixture.Expiry)
},
RedisOpRpush: func(ctx context.Context, client redis.Client, fixture *RedisFixture) error {
_, err := client.RPush(ctx, fixture.Key, fixture.Value.([]interface{})...)
return err
},
}
type redisFixtureWriter struct {
logger log.Logger
client redis.Client
operation string
purger *redisPurger
}
func RedisFixtureWriterFactory(name *string, operation *string) FixtureWriterFactory {
return func(ctx context.Context, config cfg.Config, logger log.Logger) (FixtureWriter, error) {
client, err := redis.ProvideClient(config, logger, *name)
if err != nil {
return nil, fmt.Errorf("can not create redis client: %w", err)
}
purger, err := newRedisPurger(config, logger, name)
if err != nil {
return nil, fmt.Errorf("can not create redis purger: %w", err)
}
return NewRedisFixtureWriterWithInterfaces(logger, client, purger, operation), nil
}
}
func NewRedisFixtureWriterWithInterfaces(logger log.Logger, client redis.Client, purger *redisPurger, operation *string) FixtureWriter {
return &redisFixtureWriter{
logger: logger,
client: client,
purger: purger,
operation: *operation,
}
}
func (d *redisFixtureWriter) Purge(ctx context.Context) error {
return d.purger.purge(ctx)
}
func (d *redisFixtureWriter) Write(ctx context.Context, fs *FixtureSet) error {
for _, item := range fs.Fixtures {
redisFixture := item.(*RedisFixture)
handler, ok := redisHandlers[d.operation]
if !ok {
return fmt.Errorf("no handler for operation: %s", d.operation)
}
err := handler(ctx, d.client, redisFixture)
if err != nil {
return err
}
}
d.logger.Info("loaded %d redis fixtures", len(fs.Fixtures))
return nil
}