Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions internal/models/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,39 @@ func (m *ResourceModel) Insert(name string, resourceType string, resource []byte
return err
}

func (m *ResourceModel) BadgerDBInsert(name string, resourceType string, resource []byte) error {
key := []byte(m.key(name, resourceType))

// check existence
err := m.DB.View(func(txn *badger.Txn) error {
_, err := txn.Get(key)
if err == nil {
return fmt.Errorf("resource with name %s and type %s already exists", name, resourceType)
}
if err != badger.ErrKeyNotFound {
return err
}
return nil
})
if err != nil {
return err
}

// insert resource
err = m.DB.Update(func(txn *badger.Txn) error {
return txn.Set(key, resource)
})
if err != nil {
return fmt.Errorf("failed to insert resource: %v", err)
}

// insert versioned resource
versionedKey := []byte(m.key(name, resourceType) + "/1")
return m.DB.Update(func(txn *badger.Txn) error {
return txn.Set(versionedKey, resource)
})
}

// FindOne retrieves a single resource by its name and type.
// It returns the resource data as a byte slice or an error if not found.
func (m *ResourceModel) FindOne(name string, resourceType string) (types.Resource, error) {
Expand Down
72 changes: 72 additions & 0 deletions internal/models/resource_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package models_test

import (
"testing"

"github.com/dgraph-io/badger/v4"
"github.com/open-ug/conveyor/internal/models"
)

func setupTestDB(t *testing.T) *badger.DB {
opts := badger.DefaultOptions("").WithInMemory(true)
db, err := badger.Open(opts)
if err != nil {
t.Fatalf("failed to open badger db: %v", err)
}
t.Cleanup(func() { db.Close() })
return db
}

func Test_Resource_Insert(t *testing.T) {
db := setupTestDB(t)

resourcemodel := models.NewResourceModel(nil, db)

t.Run("Insert Resource", func(t *testing.T) {
err := resourcemodel.BadgerDBInsert("test-resource", "test-type", []byte("test-data"))
if err != nil {
t.Fatalf("failed to insert resource: %v", err)
}

// Verify the resource was inserted
err = db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte("/resources/test-type/test-resource"))
if err != nil {
return err
}
val, err := item.ValueCopy(nil)
if err != nil {
return err
}
if string(val) != "test-data" {
t.Errorf("expected 'test-data', got '%s'", string(val))
}
return nil
})
if err != nil {
t.Fatalf("failed to verify resource: %v", err)
}
})

// verify versioned resource was inserted
t.Run("Verify Versioned Resource", func(t *testing.T) {
err := db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte("/resources/test-type/test-resource/1"))
if err != nil {
return err
}
val, err := item.ValueCopy(nil)
if err != nil {
return err
}
if string(val) != "test-data" {
t.Errorf("expected 'test-data', got '%s'", string(val))
}
return nil
})
if err != nil {
t.Fatalf("failed to verify versioned resource: %v", err)
}
})

}
Loading