diff --git a/domain/album.go b/domain/album.go index 19bf2b7a6..ad06eb0a3 100644 --- a/domain/album.go +++ b/domain/album.go @@ -8,4 +8,10 @@ type Album struct { Year int Compilation bool Rating int +} + +type AlbumRepository interface { + BaseRepository + Put(m *Album) error + Get(id string) (*Album, error) } \ No newline at end of file diff --git a/domain/artist.go b/domain/artist.go index 95257dbc1..34593188a 100644 --- a/domain/artist.go +++ b/domain/artist.go @@ -3,4 +3,12 @@ package domain type Artist struct { Id string Name string -} \ No newline at end of file +} + +type ArtistRepository interface { + BaseRepository + Put(m *Artist) error + Get(id string) (*Artist, error) + GetByName(name string) (*Artist, error) +} + diff --git a/domain/base.go b/domain/base.go new file mode 100644 index 000000000..a695432aa --- /dev/null +++ b/domain/base.go @@ -0,0 +1,8 @@ +package domain + +type BaseRepository interface { + NewId(fields ...string) string + CountAll() (int, error) + +} + diff --git a/domain/index.go b/domain/index.go index c2ddb8d27..2eee75fec 100644 --- a/domain/index.go +++ b/domain/index.go @@ -12,6 +12,7 @@ type ArtistIndex struct { type ArtistIndexRepository interface { + BaseRepository Put(m *ArtistIndex) error Get(id string) (*ArtistIndex, error) GetAll() ([]ArtistIndex, error) diff --git a/domain/media_file.go b/domain/media_file.go index 2835d5d56..46b8edb50 100644 --- a/domain/media_file.go +++ b/domain/media_file.go @@ -15,4 +15,9 @@ type MediaFile struct { Compilation bool CreatedAt time.Time UpdatedAt time.Time +} + +type MediaFileRepository interface { + BaseRepository + Put(m *MediaFile) error } \ No newline at end of file diff --git a/domain/media_folder.go b/domain/media_folder.go index e2b7a5dbb..205bf4e02 100644 --- a/domain/media_folder.go +++ b/domain/media_folder.go @@ -4,4 +4,9 @@ type MediaFolder struct { Id string Name string Path string -} \ No newline at end of file +} + +type MediaFolderRepository interface { + GetAll() ([]MediaFolder, error) +} + diff --git a/persistence/album_repository.go b/persistence/album_repository.go index 30d95407f..1b0fc7d54 100644 --- a/persistence/album_repository.go +++ b/persistence/album_repository.go @@ -4,24 +4,24 @@ import ( "github.com/deluan/gosonic/domain" ) -type Album struct { - BaseRepository +type albumRepository struct { + baseRepository } -func NewAlbumRepository() *Album { - r := &Album{} +func NewAlbumRepository() domain.AlbumRepository { + r := &albumRepository{} r.init("album", &domain.Album{}) return r } -func (r *Album) Put(m *domain.Album) error { +func (r *albumRepository) Put(m *domain.Album) error { if m.Id == "" { m.Id = r.NewId(m.ArtistId, m.Name) } return r.saveOrUpdate(m.Id, m) } -func (r *Album) Get(id string) (*domain.Album, error) { +func (r *albumRepository) Get(id string) (*domain.Album, error) { var rec interface{} rec, err := r.readEntity(id) return rec.(*domain.Album), err diff --git a/persistence/artist_repository.go b/persistence/artist_repository.go index d8f1ad859..1c4bc17fd 100644 --- a/persistence/artist_repository.go +++ b/persistence/artist_repository.go @@ -4,30 +4,30 @@ import ( "github.com/deluan/gosonic/domain" ) -type Artist struct { - BaseRepository +type artistRepository struct { + baseRepository } -func NewArtistRepository() *Artist { - r := &Artist{} +func NewArtistRepository() domain.ArtistRepository { + r := &artistRepository{} r.init("artist", &domain.Artist{}) return r } -func (r *Artist) Put(m *domain.Artist) error { +func (r *artistRepository) Put(m *domain.Artist) error { if m.Id == "" { m.Id = r.NewId(m.Name) } return r.saveOrUpdate(m.Id, m) } -func (r *Artist) Get(id string) (*domain.Artist, error) { +func (r *artistRepository) Get(id string) (*domain.Artist, error) { var rec interface{} rec, err := r.readEntity(id) return rec.(*domain.Artist), err } -func (r *Artist) GetByName(name string) (*domain.Artist, error) { +func (r *artistRepository) GetByName(name string) (*domain.Artist, error) { id := r.NewId(name) return r.Get(id) } diff --git a/persistence/base_repository.go b/persistence/base_repository.go index 8e94095d5..2866c6587 100644 --- a/persistence/base_repository.go +++ b/persistence/base_repository.go @@ -9,13 +9,13 @@ import ( "reflect" ) -type BaseRepository struct { +type baseRepository struct { table string entityType reflect.Type fieldNames []string } -func (r *BaseRepository) init(table string, entity interface{}) { +func (r *baseRepository) init(table string, entity interface{}) { r.table = table r.entityType = reflect.TypeOf(entity).Elem() @@ -29,17 +29,17 @@ func (r *BaseRepository) init(table string, entity interface{}) { } // TODO Use annotations to specify fields to be used -func (r *BaseRepository) NewId(fields ...string) string { +func (r *baseRepository) NewId(fields ...string) string { s := fmt.Sprintf("%s\\%s", strings.ToUpper(r.table), strings.Join(fields, "")) return fmt.Sprintf("%x", md5.Sum([]byte(s))) } -func (r *BaseRepository) CountAll() (int, error) { +func (r *baseRepository) CountAll() (int, error) { ids, err := db().SMembers([]byte(r.table + "s:all")) return len(ids), err } -func (r *BaseRepository) saveOrUpdate(id string, entity interface{}) error { +func (r *baseRepository) saveOrUpdate(id string, entity interface{}) error { recordPrefix := fmt.Sprintf("%s:%s:", r.table, id) allKey := r.table + "s:all" @@ -68,7 +68,7 @@ func (r *BaseRepository) saveOrUpdate(id string, entity interface{}) error { } // TODO Optimize -func (r *BaseRepository) getParent(entity interface{}) (table string, id string) { +func (r *baseRepository) getParent(entity interface{}) (table string, id string) { dt := reflect.TypeOf(entity).Elem() for i := 0; i < dt.NumField(); i++ { f := dt.Field(i) @@ -81,7 +81,7 @@ func (r *BaseRepository) getParent(entity interface{}) (table string, id string) return "", "" } -func (r *BaseRepository) getFieldKeys(id string) [][]byte { +func (r *baseRepository) getFieldKeys(id string) [][]byte { recordPrefix := fmt.Sprintf("%s:%s:", r.table, id) var fieldKeys = make([][]byte, len(r.fieldNames)) for i, n := range r.fieldNames { @@ -90,11 +90,11 @@ func (r *BaseRepository) getFieldKeys(id string) [][]byte { return fieldKeys } -func (r* BaseRepository) newInstance() interface{} { +func (r*baseRepository) newInstance() interface{} { return reflect.New(r.entityType).Interface() } -func (r *BaseRepository) readEntity(id string) (interface{}, error) { +func (r *baseRepository) readEntity(id string) (interface{}, error) { entity := r.newInstance() fieldKeys := r.getFieldKeys(id) @@ -107,7 +107,7 @@ func (r *BaseRepository) readEntity(id string) (interface{}, error) { return entity, err } -func (r *BaseRepository) toEntity(response [][]byte, entity interface{}) error { +func (r *baseRepository) toEntity(response [][]byte, entity interface{}) error { var record = make(map[string]interface{}, len(response)) for i, v := range response { var value interface{} @@ -121,7 +121,7 @@ func (r *BaseRepository) toEntity(response [][]byte, entity interface{}) error { } // TODO Optimize it! Probably very slow (and confusing!) -func (r *BaseRepository) loadAll(entities interface{}, sortBy string) error { +func (r *baseRepository) loadAll(entities interface{}, sortBy string) error { total, err := r.CountAll() if (err != nil) { return err diff --git a/persistence/base_repository_test.go b/persistence/base_repository_test.go index 7a870cef9..2fbfdbb53 100644 --- a/persistence/base_repository_test.go +++ b/persistence/base_repository_test.go @@ -19,8 +19,8 @@ func shouldBeEqual(actualStruct interface{}, expectedStruct ...interface{}) stri return ShouldEqual(actual, expected) } -func createRepo() *BaseRepository{ - repo := &BaseRepository{} +func createRepo() *baseRepository { + repo := &baseRepository{} repo.init("test", &TestEntity{}) return repo } diff --git a/persistence/index_repository.go b/persistence/index_repository.go index c7e487fd9..5c2768ce1 100644 --- a/persistence/index_repository.go +++ b/persistence/index_repository.go @@ -8,7 +8,7 @@ import ( ) type artistIndex struct { - BaseRepository + baseRepository } func NewArtistIndexRepository() domain.ArtistIndexRepository { diff --git a/persistence/media_file_repository.go b/persistence/media_file_repository.go index 0b4191392..6097fcf9e 100644 --- a/persistence/media_file_repository.go +++ b/persistence/media_file_repository.go @@ -4,16 +4,16 @@ import ( "github.com/deluan/gosonic/domain" ) -type MediaFile struct { - BaseRepository +type mediaFileRepository struct { + baseRepository } -func NewMediaFileRepository() *MediaFile { - r := &MediaFile{} +func NewMediaFileRepository() domain.MediaFileRepository { + r := &mediaFileRepository{} r.init("mediafile", &domain.MediaFile{}) return r } -func (r *MediaFile) Put(m *domain.MediaFile) error { +func (r *mediaFileRepository) Put(m *domain.MediaFile) error { return r.saveOrUpdate(m.Id, m) } \ No newline at end of file diff --git a/persistence/media_folders_repository.go b/persistence/media_folders_repository.go index dd11c1e30..52c94e787 100644 --- a/persistence/media_folders_repository.go +++ b/persistence/media_folders_repository.go @@ -5,16 +5,18 @@ import ( "github.com/astaxie/beego" ) -type MediaFolder struct {} +type mediaFolderRepository struct { + domain.MediaFolderRepository +} -func NewMediaFolderRepository() *MediaFolder { - return &MediaFolder{} +func NewMediaFolderRepository() domain.MediaFolderRepository { + return &mediaFolderRepository{} } -func (*MediaFolder) GetAll() ([]*domain.MediaFolder, error) { +func (*mediaFolderRepository) GetAll() ([]domain.MediaFolder, error) { mediaFolder := domain.MediaFolder{Id: "0", Name: "iTunes Library", Path: beego.AppConfig.String("musicFolder")} - result := make([]*domain.MediaFolder, 1) - result[0] = &mediaFolder + result := make([]domain.MediaFolder, 1) + result[0] = mediaFolder return result, nil } \ No newline at end of file diff --git a/persistence/property_repository.go b/persistence/property_repository.go index 0154f401d..4681a8ac1 100644 --- a/persistence/property_repository.go +++ b/persistence/property_repository.go @@ -5,17 +5,17 @@ import ( "errors" ) -type property struct { - BaseRepository +type propertyRepository struct { + baseRepository } -func NewPropertyRepository() *property { - r := &property{} +func NewPropertyRepository() domain.PropertyRepository { + r := &propertyRepository{} r.init("property", &domain.Property{}) return r } -func (r *property) Put(id string, value string) error { +func (r *propertyRepository) Put(id string, value string) error { m := &domain.Property{Id: id, Value: value} if m.Id == "" { return errors.New("Id is required") @@ -23,13 +23,13 @@ func (r *property) Put(id string, value string) error { return r.saveOrUpdate(m.Id, m) } -func (r *property) Get(id string) (string, error) { +func (r *propertyRepository) Get(id string) (string, error) { var rec interface{} rec, err := r.readEntity(id) return rec.(*domain.Property).Value, err } -func (r*property) DefaultGet(id string, defaultValue string) (string, error) { +func (r*propertyRepository) DefaultGet(id string, defaultValue string) (string, error) { v, err := r.Get(id) if v == "" { diff --git a/scanner/scanner.go b/scanner/scanner.go index f6e7d0c95..19b50ca19 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -89,7 +89,7 @@ func parseTrack(t *Track) (*domain.MediaFile, *domain.Album, *domain.Artist) { return mf, album, artist } -func persist(mfRepo *persistence.MediaFile, mf *domain.MediaFile, albumRepo *persistence.Album, album *domain.Album, artistRepo *persistence.Artist, artist *domain.Artist) { +func persist(mfRepo domain.MediaFileRepository, mf *domain.MediaFile, albumRepo domain.AlbumRepository, album *domain.Album, artistRepo domain.ArtistRepository, artist *domain.Artist) { if err := artistRepo.Put(artist); err != nil { beego.Error(err) }