diff --git a/backend/playerService.go b/backend/playerService.go index 8818e9c..1e0f0e1 100644 --- a/backend/playerService.go +++ b/backend/playerService.go @@ -39,6 +39,36 @@ func (ps *PlayerService) Query(query PlayerServiceQuery) ([]Player, error) { return res, nil } +func (ps *PlayerService) Save(player Player) (Player, error) { + log.Printf("Saving player %s", player.Name) + res, err := ps.db.writeConn.Exec("insert into player (name, guild) values (?, ?) on conflict (name) do update set guild = ?", player.Name, player.Guild.ID, player.Guild.ID) + if err != nil { + return player, fmt.Errorf("failed to update player: %v", err) + } + + id := player.ID + if id == 0 { + id, err = res.LastInsertId() + if err != nil { + return player, fmt.Errorf("failed to get last insert id: %v", err) + } + } + log.Printf("Updated player %s with id %d", player.Name, id) + + qres, err := ps.Query(PlayerServiceQuery{ID: &id}) + if err != nil { + return player, fmt.Errorf("failed getting player for id %d: %v", id, err) + } + if len(qres) > 1 { + return player, fmt.Errorf("more than one player found for id %d", id) + } + if len(qres) == 0 { + return player, fmt.Errorf("no player found for id %d", id) + } + + return qres[0], nil +} + func (ps *PlayerService) Create(name string, guild Guild) (Player, error) { log.Printf("Creating player %s in guild %s", name, guild.Name) player := Player{} diff --git a/backend/utils.go b/backend/utils.go index c7f66c3..16588c7 100644 --- a/backend/utils.go +++ b/backend/utils.go @@ -96,6 +96,10 @@ func PersistNoteData(note NoteData) (Note, []Association, error) { } res.Player = player player.Guild = guild + player, err = ps.Save(player) + if err != nil { + return res, ass, fmt.Errorf("failed saving player: %v", err) + } for _, assoc := range note.Associations { assocPlayer, err := ps.GetOrCreate(assoc.Player, Guild{})