summaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-04-21 12:31:39 -0600
committermo khan <mo@mokhan.ca>2025-04-21 12:31:39 -0600
commitab8075f02f50d8bd0be3c23b87e63f10828528ed (patch)
tree9ba0cdcfaf708bf0a5dec931057f6b65ff12fd8e /pkg
parentcb4144edda6d64cd0f3defdadfdbec57de28c27e (diff)
refactor: convert Repository to Repository[T Entity]
Diffstat (limited to 'pkg')
-rw-r--r--pkg/db/repository.go41
-rw-r--r--pkg/db/repository_test.go4
-rw-r--r--pkg/domain/sparkle.go9
3 files changed, 33 insertions, 21 deletions
diff --git a/pkg/db/repository.go b/pkg/db/repository.go
index ef4b9fb..79c7ae3 100644
--- a/pkg/db/repository.go
+++ b/pkg/db/repository.go
@@ -1,38 +1,41 @@
package db
-import (
- "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/domain"
- "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/pls"
-)
-
-type Repository interface {
- All() []*domain.Sparkle
- Save(*domain.Sparkle) error
+import "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/pls"
+
+type Entity interface {
+ GetID() string
+ SetID(id string) error
+ Validate() error
+}
+
+type Repository[T Entity] interface {
+ All() []T
+ Save(T) error
}
-type inMemoryRepository struct {
- sparkles []*domain.Sparkle
+type inMemoryRepository[T Entity] struct {
+ items []T
}
-func NewRepository() Repository {
- return &inMemoryRepository{
- sparkles: []*domain.Sparkle{},
+func NewRepository[T Entity]() Repository[T] {
+ return &inMemoryRepository[T]{
+ items: []T{},
}
}
-func (r *inMemoryRepository) All() []*domain.Sparkle {
- return r.sparkles
+func (r *inMemoryRepository[T]) All() []T {
+ return r.items
}
-func (r *inMemoryRepository) Save(item *domain.Sparkle) error {
+func (r *inMemoryRepository[T]) Save(item T) error {
if err := item.Validate(); err != nil {
return err
}
- if item.ID == "" {
- item.ID = pls.GenerateULID()
+ if item.GetID() == "" {
+ item.SetID(pls.GenerateULID())
}
- r.sparkles = append(r.sparkles, item)
+ r.items = append(r.items, item)
return nil
}
diff --git a/pkg/db/repository_test.go b/pkg/db/repository_test.go
index 57aee13..bb788d2 100644
--- a/pkg/db/repository_test.go
+++ b/pkg/db/repository_test.go
@@ -9,13 +9,13 @@ import (
)
func TestRepository(t *testing.T) {
- storage := NewRepository()
+ storage := NewRepository[*domain.Sparkle]()
t.Run("Save", func(t *testing.T) {
t.Run("an invalid Sparkle", func(t *testing.T) {
err := storage.Save(&domain.Sparkle{Reason: "because"})
- assert.NotNil(t, err)
+ assert.Error(t, err)
assert.Equal(t, 0, len(storage.All()))
})
diff --git a/pkg/domain/sparkle.go b/pkg/domain/sparkle.go
index a139d56..3f8b4f4 100644
--- a/pkg/domain/sparkle.go
+++ b/pkg/domain/sparkle.go
@@ -39,6 +39,15 @@ func NewSparkle(text string) (*Sparkle, error) {
}, nil
}
+func (s *Sparkle) GetID() string {
+ return s.ID
+}
+
+func (s *Sparkle) SetID(id string) error {
+ s.ID = id
+ return nil
+}
+
func (s *Sparkle) Validate() error {
if s.Sparklee == "" {
return SparkleeIsRequired