From ea6fcbe416171782c358ae1c18442780f98a3068 Mon Sep 17 00:00:00 2001 From: lyx0 <66651385+lyx0@users.noreply.github.com> Date: Sat, 4 Mar 2023 19:18:49 +0000 Subject: [PATCH] add data models for lastfm --- internal/data/lastfm.go | 72 +++++++++++++++++++++++++++++++++++++++++ internal/data/models.go | 13 +++++--- 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 internal/data/lastfm.go diff --git a/internal/data/lastfm.go b/internal/data/lastfm.go new file mode 100644 index 0000000..7188d29 --- /dev/null +++ b/internal/data/lastfm.go @@ -0,0 +1,72 @@ +package data + +import ( + "database/sql" + "errors" +) + +type LastFMUser struct { + ID int `json:"id"` + TwitchLogin string `json:"twitch_login"` + TwitchID string `json:"twitch_id"` + LastFMUser string `json:"lastfm_username"` +} + +type LastFMUserModel struct { + DB *sql.DB +} + +func (l LastFMUserModel) Get(login string) (*LastFMUser, error) { + query := ` + SELECT id, twitch_login, twitch_id, lastfm_username + FROM lastfm_users + WHERE twitch_login = $1` + + var lastfm LastFMUser + + err := l.DB.QueryRow(query, login).Scan( + &lastfm.ID, + &lastfm.TwitchLogin, + &lastfm.TwitchID, + &lastfm.LastFMUser, + ) + + if err != nil { + switch { + case errors.Is(err, sql.ErrNoRows): + return nil, ErrRecordNotFound + default: + return nil, err + } + } + + return &lastfm, nil +} + +func (l LastFMUserModel) Insert(lastfm *LastFMUser) error { + query := ` + INSERT into lastfm_users(twitch_login, twitch_id, lastfm_username) + VALUES ($1, $2, $3) + ON CONFLICT (twitch_id) + DO NOTHING + RETURNING id; + ` + + args := []interface{}{lastfm.TwitchLogin, lastfm.TwitchID, lastfm.LastFMUser} + + result, err := l.DB.Exec(query, args...) + if err != nil { + return err + } + + rowsAffected, err := result.RowsAffected() + if err != nil { + return err + } + + if rowsAffected == 0 { + return ErrCommandRecordAlreadyExists + } + + return nil +} diff --git a/internal/data/models.go b/internal/data/models.go index eaf54df..439f1ec 100644 --- a/internal/data/models.go +++ b/internal/data/models.go @@ -38,6 +38,10 @@ type Models struct { SetHelp(name, helptext string) error Delete(name string) error } + LastFMUsers interface { + Get(name string) (*LastFMUser, error) + Insert(lastfm *LastFMUser) error + } Timers interface { Get(name string) (*Timer, error) Insert(timer *Timer) error @@ -49,9 +53,10 @@ type Models struct { func NewModels(db *sql.DB) Models { return Models{ - Channels: ChannelModel{DB: db}, - Users: UserModel{DB: db}, - Commands: CommandModel{DB: db}, - Timers: TimerModel{DB: db}, + Channels: ChannelModel{DB: db}, + Users: UserModel{DB: db}, + Commands: CommandModel{DB: db}, + LastFMUsers: LastFMUserModel{DB: db}, + Timers: TimerModel{DB: db}, } }