diff options
| author | mo khan <mo@mokhan.ca> | 2025-04-10 17:35:46 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-04-10 17:35:46 -0600 |
| commit | d8fd76b1c0c0bd86b2114dcf6af0b6e34d4783f3 (patch) | |
| tree | 32d71c0e6a9a0c25789ab90a29ef742001898afc /pkg/db | |
| parent | a722bd0ef4f69547229921eb0fe2eefce3ed6397 (diff) | |
feat: add a single API endpoint to return a list of sparkles
Diffstat (limited to 'pkg/db')
| -rw-r--r-- | pkg/db/repository.go | 45 | ||||
| -rw-r--r-- | pkg/db/repository_test.go | 41 |
2 files changed, 86 insertions, 0 deletions
diff --git a/pkg/db/repository.go b/pkg/db/repository.go new file mode 100644 index 0000000..d8a5990 --- /dev/null +++ b/pkg/db/repository.go @@ -0,0 +1,45 @@ +package db + +import ( + "gitlab.com/mokhax/sparkled/pkg/domain" + "gitlab.com/mokhax/sparkled/pkg/pls" +) + +type Repository interface { + All() []*domain.Sparkle + Each(func(*domain.Sparkle)) + Save(*domain.Sparkle) error +} + +type inMemoryRepository struct { + sparkles []*domain.Sparkle +} + +func NewRepository() Repository { + return &inMemoryRepository{ + sparkles: []*domain.Sparkle{}, + } +} + +func (r *inMemoryRepository) All() []*domain.Sparkle { + return r.sparkles +} + +func (r *inMemoryRepository) Each(visitor func(item *domain.Sparkle)) { + for _, item := range r.All() { + visitor(item) + } +} + +func (r *inMemoryRepository) Save(item *domain.Sparkle) error { + if err := item.Validate(); err != nil { + return err + } + + if item.ID == "" { + item.ID = pls.GenerateULID() + } + + r.sparkles = append(r.sparkles, item) + return nil +} diff --git a/pkg/db/repository_test.go b/pkg/db/repository_test.go new file mode 100644 index 0000000..7a9938c --- /dev/null +++ b/pkg/db/repository_test.go @@ -0,0 +1,41 @@ +package db + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gitlab.com/mokhax/sparkled/pkg/domain" +) + +func TestRepository(t *testing.T) { + storage := NewRepository() + + t.Run("Save", func(t *testing.T) { + t.Run("an invalid Sparkle", func(t *testing.T) { + err := storage.Save(&domain.Sparkle{Reason: "because"}) + + counter := 0 + storage.Each(func(item *domain.Sparkle) { + counter++ + }) + + assert.NotNil(t, err) + assert.Equal(t, 0, counter) + }) + + t.Run("a valid Sparkle", func(t *testing.T) { + sparkle := &domain.Sparkle{Sparklee: "@tanuki", Reason: "because"} + require.NoError(t, storage.Save(sparkle)) + + sparkles := []*domain.Sparkle{} + storage.Each(func(item *domain.Sparkle) { + sparkles = append(sparkles, item) + }) + assert.Equal(t, 1, len(sparkles)) + assert.NotEmpty(t, sparkles[0].ID) + assert.Equal(t, "@tanuki", sparkles[0].Sparklee) + assert.Equal(t, "because", sparkles[0].Reason) + }) + }) +} |
