Skip to content

Commit a1093d8

Browse files
authored
feat: add BadgerDB resource insertion (#221)
* feat: refactor resource insertion to use BadgerDB - and add unit tests * feat: add verification for versioned resource insertion * feat: implement resource insertion using BadgerDB in the ResourceModel
1 parent 096c48a commit a1093d8

2 files changed

Lines changed: 105 additions & 0 deletions

File tree

‎internal/models/resource.go‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,39 @@ func (m *ResourceModel) Insert(name string, resourceType string, resource []byte
5555
return err
5656
}
5757

58+
func (m *ResourceModel) BadgerDBInsert(name string, resourceType string, resource []byte) error {
59+
key := []byte(m.key(name, resourceType))
60+
61+
// check existence
62+
err := m.DB.View(func(txn *badger.Txn) error {
63+
_, err := txn.Get(key)
64+
if err == nil {
65+
return fmt.Errorf("resource with name %s and type %s already exists", name, resourceType)
66+
}
67+
if err != badger.ErrKeyNotFound {
68+
return err
69+
}
70+
return nil
71+
})
72+
if err != nil {
73+
return err
74+
}
75+
76+
// insert resource
77+
err = m.DB.Update(func(txn *badger.Txn) error {
78+
return txn.Set(key, resource)
79+
})
80+
if err != nil {
81+
return fmt.Errorf("failed to insert resource: %v", err)
82+
}
83+
84+
// insert versioned resource
85+
versionedKey := []byte(m.key(name, resourceType) + "/1")
86+
return m.DB.Update(func(txn *badger.Txn) error {
87+
return txn.Set(versionedKey, resource)
88+
})
89+
}
90+
5891
// FindOne retrieves a single resource by its name and type.
5992
// It returns the resource data as a byte slice or an error if not found.
6093
func (m *ResourceModel) FindOne(name string, resourceType string) (types.Resource, error) {

‎internal/models/resource_test.go‎

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package models_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/dgraph-io/badger/v4"
7+
"github.com/open-ug/conveyor/internal/models"
8+
)
9+
10+
func setupTestDB(t *testing.T) *badger.DB {
11+
opts := badger.DefaultOptions("").WithInMemory(true)
12+
db, err := badger.Open(opts)
13+
if err != nil {
14+
t.Fatalf("failed to open badger db: %v", err)
15+
}
16+
t.Cleanup(func() { db.Close() })
17+
return db
18+
}
19+
20+
func Test_Resource_Insert(t *testing.T) {
21+
db := setupTestDB(t)
22+
23+
resourcemodel := models.NewResourceModel(nil, db)
24+
25+
t.Run("Insert Resource", func(t *testing.T) {
26+
err := resourcemodel.BadgerDBInsert("test-resource", "test-type", []byte("test-data"))
27+
if err != nil {
28+
t.Fatalf("failed to insert resource: %v", err)
29+
}
30+
31+
// Verify the resource was inserted
32+
err = db.View(func(txn *badger.Txn) error {
33+
item, err := txn.Get([]byte("/resources/test-type/test-resource"))
34+
if err != nil {
35+
return err
36+
}
37+
val, err := item.ValueCopy(nil)
38+
if err != nil {
39+
return err
40+
}
41+
if string(val) != "test-data" {
42+
t.Errorf("expected 'test-data', got '%s'", string(val))
43+
}
44+
return nil
45+
})
46+
if err != nil {
47+
t.Fatalf("failed to verify resource: %v", err)
48+
}
49+
})
50+
51+
// verify versioned resource was inserted
52+
t.Run("Verify Versioned Resource", func(t *testing.T) {
53+
err := db.View(func(txn *badger.Txn) error {
54+
item, err := txn.Get([]byte("/resources/test-type/test-resource/1"))
55+
if err != nil {
56+
return err
57+
}
58+
val, err := item.ValueCopy(nil)
59+
if err != nil {
60+
return err
61+
}
62+
if string(val) != "test-data" {
63+
t.Errorf("expected 'test-data', got '%s'", string(val))
64+
}
65+
return nil
66+
})
67+
if err != nil {
68+
t.Fatalf("failed to verify versioned resource: %v", err)
69+
}
70+
})
71+
72+
}

0 commit comments

Comments
 (0)