diff --git a/persistence/db_sql/property_repository.go b/persistence/db_sql/property_repository.go new file mode 100644 index 000000000..b831290a0 --- /dev/null +++ b/persistence/db_sql/property_repository.go @@ -0,0 +1,55 @@ +package db_sql + +import ( + "github.com/astaxie/beego/orm" + "github.com/cloudsonic/sonic-server/domain" +) + +type Property struct { + ID string `orm:"pk;column(id)"` + Value string +} + +type propertyRepository struct { + sqlRepository +} + +func NewPropertyRepository() domain.PropertyRepository { + r := &propertyRepository{} + r.entityName = "property" + return r +} + +func (r *propertyRepository) Put(id string, value string) error { + p := &Property{ID: id, Value: value} + num, err := Db().Update(p) + if err != nil { + return nil + } + if num == 0 { + _, err = Db().Insert(p) + } + return err +} + +func (r *propertyRepository) Get(id string) (string, error) { + p := &Property{ID: id} + err := Db().Read(p) + if err == orm.ErrNoRows { + return "", domain.ErrNotFound + } + return p.Value, err +} + +func (r *propertyRepository) DefaultGet(id string, defaultValue string) (string, error) { + value, err := r.Get(id) + if err == domain.ErrNotFound { + return defaultValue, nil + } + if err != nil { + return defaultValue, err + } + return value, nil +} + +var _ domain.PropertyRepository = (*propertyRepository)(nil) diff --git a/persistence/db_sql/property_repository_test.go b/persistence/db_sql/property_repository_test.go new file mode 100644 index 000000000..8d4a455d4 --- /dev/null +++ b/persistence/db_sql/property_repository_test.go @@ -0,0 +1,30 @@ +package db_sql + +import ( + "github.com/cloudsonic/sonic-server/domain" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("PropertyRepository", func() { + var repo domain.PropertyRepository + + BeforeEach(func() { + Db().QueryTable("property").Exclude("id", ".PHONY").Delete() + repo = NewPropertyRepository() + }) + + It("saves and retrieves data", func() { + Expect(repo.Put("1", "test")).To(BeNil()) + Expect(repo.Get("1")).To(Equal("test")) + }) + + It("returns default if data is not found", func() { + Expect(repo.DefaultGet("2", "default")).To(Equal("default")) + }) + + It("returns value if found", func() { + Expect(repo.Put("3", "test")).To(BeNil()) + Expect(repo.DefaultGet("3", "default")).To(Equal("test")) + }) +}) diff --git a/persistence/db_sql/sql.go b/persistence/db_sql/sql.go index 4beddbbd6..bb032e0df 100644 --- a/persistence/db_sql/sql.go +++ b/persistence/db_sql/sql.go @@ -59,6 +59,7 @@ func initORM(dbPath string) error { orm.RegisterModel(new(MediaFile)) orm.RegisterModel(new(ArtistInfo)) orm.RegisterModel(new(CheckSums)) + orm.RegisterModel(new(Property)) err := orm.RegisterDataBase("default", "sqlite3", dbPath) if err != nil { panic(err) diff --git a/persistence/db_sql/wire_provider.go b/persistence/db_sql/wire_provider.go index 8312fa4a8..af9561488 100644 --- a/persistence/db_sql/wire_provider.go +++ b/persistence/db_sql/wire_provider.go @@ -12,7 +12,7 @@ var Set = wire.NewSet( NewAlbumRepository, NewArtistIndexRepository, NewCheckSumRepository, - db_ledis.NewPropertyRepository, + NewPropertyRepository, db_ledis.NewPlaylistRepository, persistence.NewNowPlayingRepository, persistence.NewMediaFolderRepository, diff --git a/wire_gen.go b/wire_gen.go index ba0b7663a..0990959d4 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -71,7 +71,7 @@ func createSQLProvider() *Provider { mediaFolderRepository := persistence.NewMediaFolderRepository() nowPlayingRepository := persistence.NewNowPlayingRepository() playlistRepository := db_ledis.NewPlaylistRepository() - propertyRepository := db_ledis.NewPropertyRepository() + propertyRepository := db_sql.NewPropertyRepository() provider := &Provider{ AlbumRepository: albumRepository, ArtistRepository: artistRepository,