queue api

This commit is contained in:
Aleksandr Trushkin
2024-02-03 18:15:26 +03:00
parent 6acb3dc199
commit 6044e116f8
3 changed files with 220 additions and 0 deletions

View File

@ -2,6 +2,8 @@ package badger
import (
"fmt"
"time"
"unsafe"
"git.loyso.art/frx/eway/internal/entity"
badger "github.com/dgraph-io/badger/v4"
@ -9,11 +11,13 @@ import (
var (
categorySequenceIDKey = []byte("!!cat_seq!!")
queueSequenceIDKey = []byte("!!que_seq!!")
)
type client struct {
db *badger.DB
nextCategoryIDSeq *badger.Sequence
nextQueueIDSeq *badger.Sequence
}
func NewClient(db *badger.DB) (*client, error) {
@ -21,10 +25,15 @@ func NewClient(db *badger.DB) (*client, error) {
if err != nil {
return nil, fmt.Errorf("getting sequence for categories: %w", err)
}
queueSeqGen, err := db.GetSequence(queueSequenceIDKey, 10)
if err != nil {
return nil, fmt.Errorf("getting sequence for queues: %w", err)
}
return &client{
db: db,
nextCategoryIDSeq: categorySeqGen,
nextQueueIDSeq: queueSeqGen,
}, nil
}
@ -46,3 +55,64 @@ func (c *client) Category() entity.CategoryRepository {
func (c *client) GoodsItem() entity.GoodsItemRepository {
return newGoodsItemClient(c.db)
}
func (c *client) QueueClient() entity.MessageQueue {
nc := c.Table("queues")
return newQueueClient(nc, c.nextQueueIDSeq)
}
func (c *client) Table(name string) namedClient {
tableBytes := unsafe.Slice(unsafe.StringData("!!"+name+"!!"), len(name)+4)
return namedClient{
table: tableBytes,
db: c.db,
}
}
type namedClient struct {
table []byte
db *badger.DB
}
type putOpt func(*badger.Entry)
func withTTL(duration time.Duration) putOpt {
return func(e *badger.Entry) {
e.WithTTL(duration)
}
}
func (c *namedClient) Put(key, value []byte, opts ...putOpt) error {
return c.db.Update(func(txn *badger.Txn) error {
tableKey := c.makeKey(key)
entry := badger.NewEntry(tableKey, value)
for _, opt := range opts {
opt(entry)
}
return txn.SetEntry(entry)
})
}
func (c *namedClient) Get(key []byte) ([]byte, error) {
var out []byte
err := c.db.View(func(txn *badger.Txn) error {
item, err := txn.Get(c.makeKey(key))
if err != nil {
return err
}
out = make([]byte, item.ValueSize())
out, err = item.ValueCopy(out)
return err
})
if err != nil {
return nil, err
}
return out, nil
}
func (c *namedClient) makeKey(key []byte) (out []byte) {
return append(c.table, key...)
}