Skip to content

Commit

Permalink
WIP: removed some complexity from data service
Browse files Browse the repository at this point in the history
  • Loading branch information
tomvodi committed Aug 29, 2024
1 parent 1f34256 commit 6b94cb5
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 22 deletions.
81 changes: 60 additions & 21 deletions internal/database/db_data_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (d *dbService) initDbTuneForCreation(

err = copier.Copy(&dbTune, &ct)
if err != nil {
return nil, fmt.Errorf("could not create db tune object")
return nil, fmt.Errorf("could not create db tune object: %v", err)
}
if tuneType != nil {
dbTune.TuneTypeID = &tuneType.ID
Expand Down Expand Up @@ -274,16 +274,48 @@ func (d *dbService) CreateMusicSet(
return nil, fmt.Errorf("can't create music set without a title")
}

dbSet := model.MusicSet{}
dbSet, err := d.initDbSetForCreation(musicSet, importFile)
if err != nil {
return nil, err
}

apiSet, err := d.createMusicSetWithTuneIDs(
dbSet,
musicSet.Tunes,
)
if err != nil {
return nil, err
}

return apiSet, nil
}

func (d *dbService) initDbSetForCreation(
musicSet apimodel.CreateSet,
importFile *model.ImportFile,
) (*model.MusicSet, error) {
dbSet := &model.MusicSet{}
if importFile != nil {
dbSet.ImportFileID = importFile.ID
}
if err := copier.Copy(&dbSet, &musicSet); err != nil {
return &apimodel.MusicSet{}, fmt.Errorf("could not create db object")

err := copier.Copy(dbSet, &musicSet)
if err != nil {
return nil, fmt.Errorf("could not create db music set object: %v", err)
}

// reset tunes to nil as copier creates an empty tune object for every tune id
// this leads to a foreign key constraint violation
dbSet.Tunes = nil

newTunes, err := d.dbTunesFromIDs(musicSet.Tunes)
return dbSet, nil
}

func (d *dbService) createMusicSetWithTuneIDs(
dbSet *model.MusicSet,
tuneIDs []uuid.UUID,
) (*apimodel.MusicSet, error) {
mSetTunes, err := d.dbTunesFromIDs(tuneIDs)
if err != nil {
return nil, err
}
Expand All @@ -293,7 +325,7 @@ func (d *dbService) CreateMusicSet(
return err
}

if err := d.assignMusicSetTunes(dbSet.ID, musicSet.Tunes); err != nil {
if err := d.assignMusicSetTunes(dbSet.ID, tuneIDs); err != nil {
return err
}

Expand All @@ -303,10 +335,10 @@ func (d *dbService) CreateMusicSet(
return nil, err
}

dbSet.Tunes = newTunes
apiSet, err := apiSetFromDbSet(&dbSet)
dbSet.Tunes = mSetTunes
apiSet, err := apiSetFromDbSet(dbSet)
if err != nil {
return &apimodel.MusicSet{}, err
return nil, err
}

return apiSet, nil
Expand Down Expand Up @@ -344,6 +376,7 @@ func apiSetFromDbSet(dbSet *model.MusicSet) (*apimodel.MusicSet, error) {
return apiSet, nil
}

// returns that music set that contains all tunes in the given order
func (d *dbService) getMusicSetByTuneIDs(tuneIDs []uuid.UUID) (*apimodel.MusicSet, error) {
allMusicSets, err := d.MusicSets()
if err != nil {
Expand All @@ -352,18 +385,7 @@ func (d *dbService) getMusicSetByTuneIDs(tuneIDs []uuid.UUID) (*apimodel.MusicSe

var matchingSet *apimodel.MusicSet
for _, set := range allMusicSets {
if len(set.Tunes) != len(tuneIDs) {
continue
}

allTunesMatch := true
for i, t := range set.Tunes {
if tuneIDs[i] != t.Id {
allTunesMatch = false
break
}
}
if allTunesMatch {
if musicSetHasTunesInOrder(set, tuneIDs) {
matchingSet = set
break
}
Expand All @@ -376,6 +398,23 @@ func (d *dbService) getMusicSetByTuneIDs(tuneIDs []uuid.UUID) (*apimodel.MusicSe
return matchingSet, nil
}

func musicSetHasTunesInOrder(
set *apimodel.MusicSet,
tuneIDs []uuid.UUID,
) bool {
if len(set.Tunes) != len(tuneIDs) {
return false
}

for i, t := range set.Tunes {
if t.Id != tuneIDs[i] {
return false
}
}

return true
}

func (d *dbService) setTunesInAPISet(apiSet *apimodel.MusicSet) error {
var setTunes []model.Tune
err := d.db.Joins("JOIN music_set_tunes mst on tunes.id = mst.tune_id").
Expand Down
2 changes: 1 addition & 1 deletion internal/database/db_data_service_crud_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
"gorm.io/gorm"
)

var _ = Describe("DbDataService", func() {
var _ = Describe("DbDataService CRUD", func() {
var err error
var cfg *config.Config
var service *dbService
Expand Down

0 comments on commit 6b94cb5

Please sign in to comment.