summaryrefslogtreecommitdiff
path: root/pkg/db
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-04-10 17:35:46 -0600
committermo khan <mo@mokhan.ca>2025-04-10 17:35:46 -0600
commitd8fd76b1c0c0bd86b2114dcf6af0b6e34d4783f3 (patch)
tree32d71c0e6a9a0c25789ab90a29ef742001898afc /pkg/db
parenta722bd0ef4f69547229921eb0fe2eefce3ed6397 (diff)
feat: add a single API endpoint to return a list of sparkles
Diffstat (limited to 'pkg/db')
-rw-r--r--pkg/db/repository.go45
-rw-r--r--pkg/db/repository_test.go41
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)
+ })
+ })
+}