diff --git a/guildService.go b/guildService.go new file mode 100644 index 0000000..01a2189 --- /dev/null +++ b/guildService.go @@ -0,0 +1,56 @@ +package main + +import ( + "fmt" +) + +type GuildService struct { + db *DB +} +type GuildServiceQuery struct { + Name *string `db:"name"` + ID *int64 `db:"id"` +} + +func (gs *GuildService) Query(query GuildServiceQuery) (Guild, error) { + guild := Guild{} + sqlQuery := "SELECT id, name FROM guild" + whereQuery := BuildWhereQuery(query) + if whereQuery != "" { + sqlQuery += " " + whereQuery + } + + err := gs.db.readConn.QueryRow(sqlQuery).Scan(&guild.ID, &guild.Name) + if err != nil { + return guild, fmt.Errorf("failed getting guild for query %q: %v", sqlQuery, err) + } + + return guild, nil +} + +func (gs *GuildService) Create(name string) (Guild, error) { + guild := Guild{} + res, err := gs.db.writeConn.Exec("insert into guild (name) values (?)", name) + if err != nil { + return guild, fmt.Errorf("failed to insert guild: %v", err) + } + + id, err := res.LastInsertId() + if err != nil { + return guild, fmt.Errorf("failed to get last insert id: %v", err) + } + + return gs.Query(GuildServiceQuery{ID: &id}) +} + +func (gs *GuildService) GetOrCreate(name string) (Guild, error) { + guild := Guild{} + guild, err := gs.Query(GuildServiceQuery{Name: &name}) + if err != nil { + guild, err = gs.Create(name) + if err != nil { + return guild, fmt.Errorf("failed creating guild: %v", err) + } + } + return guild, nil +} diff --git a/noteService.go b/noteService.go new file mode 100644 index 0000000..c4b5980 --- /dev/null +++ b/noteService.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "time" +) + +type NoteService struct { + db *DB +} +type NoteServiceQuery struct { + Timestamp *string `db:"timestamp"` + PlayerID *int64 `db:"player"` + ID *int64 `db:"id"` +} + +func (ns *NoteService) Query(query NoteServiceQuery) (Note, error) { + note := Note{} + sqlQuery := "SELECT id, content, timestamp, player FROM note" + whereQuery := BuildWhereQuery(query) + if whereQuery != "" { + sqlQuery += " " + whereQuery + } + + err := ns.db.readConn.QueryRow(sqlQuery).Scan(¬e.ID, ¬e.Content, ¬e.Timestamp, ¬e.Player.ID) + if err != nil { + return note, fmt.Errorf("failed getting note for query %q: %v", sqlQuery, err) + } + + return note, nil +} + +func (ns *NoteService) Create(content string, timestamp time.Time, player Player) (Note, error) { + note := Note{} + res, err := ns.db.writeConn.Exec("insert into note (content, timestamp, player) values (?, ?, ?)", content, timestamp, player.ID) + if err != nil { + return note, fmt.Errorf("failed to insert note: %v", err) + } + + id, err := res.LastInsertId() + if err != nil { + return note, fmt.Errorf("failed to get last insert id: %v", err) + } + + return ns.Query(NoteServiceQuery{ID: &id}) +} \ No newline at end of file diff --git a/playerService.go b/playerService.go new file mode 100644 index 0000000..b124d7c --- /dev/null +++ b/playerService.go @@ -0,0 +1,54 @@ +package main + +import "fmt" + +type PlayerService struct { + db *DB +} +type PlayerServiceQuery struct { + Name *string `db:"name"` + ID *int64 `db:"id"` +} + +func (ps *PlayerService) Query(query PlayerServiceQuery) (Player, error) { + player := Player{} + sqlQuery := "SELECT id, name, guild FROM player" + whereQuery := BuildWhereQuery(query) + if whereQuery != "" { + sqlQuery += " " + whereQuery + } + + err := ps.db.readConn.QueryRow(sqlQuery).Scan(&player.ID, &player.Name, &player.Guild.ID) + if err != nil { + return player, fmt.Errorf("failed getting player for query %q: %v", sqlQuery, err) + } + + return player, nil +} + +func (ps *PlayerService) Create(name string, guild Guild) (Player, error) { + player := Player{} + res, err := ps.db.writeConn.Exec("insert into player (name, guild) values (?, ?)", name, guild.ID) + if err != nil { + return player, fmt.Errorf("failed to insert player: %v", err) + } + + id, err := res.LastInsertId() + if err != nil { + return player, fmt.Errorf("failed to get last insert id: %v", err) + } + + return ps.Query(PlayerServiceQuery{ID: &id}) +} + +func (ps *PlayerService) GetOrCreate(name string, guild Guild) (Player, error) { + player := Player{} + player, err := ps.Query(PlayerServiceQuery{Name: &name}) + if err != nil { + player, err = ps.Create(name, guild) + if err != nil { + return player, fmt.Errorf("failed creating player: %v", err) + } + } + return player, nil +}