Files
mortgagefi_indexer/internal/store/store.go
Siavash Sameni f55b4468b3 initial release
2025-08-29 08:17:52 +04:00

92 lines
2.4 KiB
Go

package store
import (
"encoding/json"
"errors"
"time"
badger "github.com/dgraph-io/badger/v4"
)
type Entry struct {
TokenIDs []string `json:"token_ids"`
UpdatedAt time.Time `json:"updated_at"`
}
// ContractEntry stores all token ownership data for a contract
type ContractEntry struct {
// Map of tokenId -> owner address (canonical)
TokenOwners map[string]string `json:"token_owners"`
UpdatedAt time.Time `json:"updated_at"`
MaxScanned int `json:"max_scanned"`
}
type Cache struct {
db *badger.DB
}
func New(dir string) (*Cache, error) {
opts := badger.DefaultOptions(dir)
opts.Logger = nil
db, err := badger.Open(opts)
if err != nil { return nil, err }
return &Cache{db: db}, nil
}
func (c *Cache) Close() error { return c.db.Close() }
func (c *Cache) Get(key string) (*Entry, bool) {
var e Entry
err := c.db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(key))
if err != nil { return err }
return item.Value(func(v []byte) error { return json.Unmarshal(v, &e) })
})
if err != nil { return nil, false }
return &e, true
}
func (c *Cache) Set(key string, ids []string) error {
val, _ := json.Marshal(Entry{TokenIDs: ids, UpdatedAt: time.Now().UTC()})
return c.db.Update(func(txn *badger.Txn) error {
return txn.Set([]byte(key), val)
})
}
// SetContract stores all token ownership data for a contract
func (c *Cache) SetContract(key string, tokenOwners map[string]string, maxScanned int) error {
val, _ := json.Marshal(ContractEntry{
TokenOwners: tokenOwners,
UpdatedAt: time.Now().UTC(),
MaxScanned: maxScanned,
})
return c.db.Update(func(txn *badger.Txn) error {
return txn.Set([]byte(key), val)
})
}
// GetContract retrieves contract ownership data
func (c *Cache) GetContract(key string) (*ContractEntry, bool) {
var e ContractEntry
err := c.db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(key))
if err != nil { return err }
return item.Value(func(v []byte) error { return json.Unmarshal(v, &e) })
})
if err != nil { return nil, false }
return &e, true
}
func (c *Cache) Delete(key string) error {
return c.db.Update(func(txn *badger.Txn) error {
err := txn.Delete([]byte(key))
if errors.Is(err, badger.ErrKeyNotFound) { return nil }
return err
})
}
// DeleteContract removes contract cache entry
func (c *Cache) DeleteContract(key string) error {
return c.Delete(key)
}