summaryrefslogtreecommitdiff
path: root/server/guest/store.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/guest/store.go')
-rw-r--r--server/guest/store.go204
1 files changed, 127 insertions, 77 deletions
diff --git a/server/guest/store.go b/server/guest/store.go
index 1a07161..a5b9374 100644
--- a/server/guest/store.go
+++ b/server/guest/store.go
@@ -4,135 +4,185 @@ import (
"context"
"errors"
+ "github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
-type MemStore struct {
- db *pgxpool.Pool
+type Store struct {
+ database *pgxpool.Pool
}
-func NewMemStore(db *pgxpool.Pool) *MemStore {
- return &MemStore{
- db,
+func NewStore(database *pgxpool.Pool) *Store {
+ return &Store{
+ database,
}
}
-func (m MemStore) Find(creds Credentials) (Guest, error) {
- rows, err := m.db.Query(context.Background(), "select * from guest")
- var guest Guest
+func (store Store) Find(credentials Credentials) (Guest, error) {
+ guestRows, err := store.database.Query(context.Background(),
+ "select * from guest")
if err != nil {
- return guest, err
+ return Guest{}, err
}
- defer rows.Close()
+ defer guestRows.Close()
+ guest, found := createGuest(credentials, guestRows)
- found := false
- for rows.Next() {
- err := rows.Scan(&guest.Id, &guest.FirstName, &guest.LastName, &guest.Attendance, &guest.Email, &guest.Message, &guest.PartySize)
- if err != nil {
- return guest, err
- }
- if guest.FirstName == creds.FirstName && guest.LastName == creds.LastName {
- found = true
- break
- }
+ partyRows, err := store.database.Query(context.Background(),
+ "select * from party")
+ if err != nil {
+ return Guest{}, err
}
+ defer partyRows.Close()
- rows, err = m.db.Query(context.Background(), "select * from party")
+ guest, err = addParty(guest, partyRows)
if err != nil {
- return guest, err
+ return Guest{}, err
}
- defer rows.Close()
- for rows.Next() {
- var guestId int
- var partyGuest PartyGuest
- err := rows.Scan(&guestId, &partyGuest.FirstName, &partyGuest.LastName)
+ if found {
+ return guest, nil
+ }
+ return Guest{}, errors.New("guest not found")
+}
+
+func createGuest(credentials Credentials, guestRows pgx.Rows) (Guest, bool) {
+ var guest Guest
+ for guestRows.Next() {
+ err := guestRows.Scan(&guest.ID, &guest.FirstName, &guest.LastName,
+ &guest.Attendance, &guest.Email, &guest.Message, &guest.PartySize)
if err != nil {
- return guest, err
+ return Guest{}, false
}
- if guestId == guest.Id {
- guest.PartyList = append(guest.PartyList, partyGuest)
+ if guest.FirstName == credentials.FirstName &&
+ guest.LastName == credentials.LastName {
+ return guest, true
}
}
+ return Guest{}, false
+}
- if found {
- return guest, nil
+func addParty(guestWithoutParty Guest, partyRows pgx.Rows) (Guest, error) {
+ guestWithParty := guestWithoutParty
+ for partyRows.Next() {
+ var guestID int
+ var partyGuest PartyGuest
+ err := partyRows.Scan(&guestID, &partyGuest.FirstName, &partyGuest.LastName)
+ if err != nil {
+ return Guest{}, err
+ }
+ if guestID == guestWithParty.ID {
+ guestWithParty.PartyList = append(guestWithParty.PartyList, partyGuest)
+ }
}
- return guest, errors.New("Guest not found")
+ return guestWithParty, nil
}
-func (m MemStore) Get() ([]Guest, error) {
- rows, err := m.db.Query(context.Background(), "select * from guest")
+func (store Store) Get() ([]Guest, error) {
+ guestRows, err := store.database.Query(context.Background(),
+ "select * from guest")
if err != nil {
return nil, err
}
- defer rows.Close()
+ defer guestRows.Close()
- guestSlice := []Guest{}
- for rows.Next() {
- var guest Guest
- err := rows.Scan(&guest.Id, &guest.FirstName, &guest.LastName, &guest.Attendance, &guest.Email, &guest.Message, &guest.PartySize)
- if err != nil {
- return guestSlice, err
- }
- guestSlice = append(guestSlice, guest)
+ guestsWithoutParty, err := store.createGuestSlice(guestRows)
+ if err != nil {
+ return []Guest{}, err
}
- rows, err = m.db.Query(context.Background(), "select * from party")
+ partyRows, err := store.database.Query(context.Background(),
+ "select * from party")
if err != nil {
- return guestSlice, err
+ return []Guest{}, err
}
- defer rows.Close()
+ defer partyRows.Close()
- for rows.Next() {
- var guestId int
+ guestsWithParty, err := addPartySlice(guestsWithoutParty, partyRows)
+ if err != nil {
+ return []Guest{}, err
+ }
+ return guestsWithParty, nil
+}
+
+func (store Store) createGuestSlice(guestRows pgx.Rows) ([]Guest, error) {
+ guests := []Guest{}
+ for guestRows.Next() {
+ var guest Guest
+ err := guestRows.Scan(&guest.ID, &guest.FirstName, &guest.LastName,
+ &guest.Attendance, &guest.Email, &guest.Message, &guest.PartySize)
+ if err != nil {
+ return []Guest{}, err
+ }
+ guests = append(guests, guest)
+ }
+ return guests, nil
+}
+
+func addPartySlice(guestsWithoutParty []Guest,
+ partyRows pgx.Rows) ([]Guest, error) {
+ guestsWithParty := guestsWithoutParty
+ for partyRows.Next() {
+ var guestID int
var partyGuest PartyGuest
- err := rows.Scan(&guestId, &partyGuest.FirstName, &partyGuest.LastName)
+ err := partyRows.Scan(&guestID, &partyGuest.FirstName, &partyGuest.LastName)
if err != nil {
- return guestSlice, err
+ return []Guest{}, err
}
- for i, g := range guestSlice {
- if guestId == g.Id {
- guestSlice[i].PartyList = append(g.PartyList, partyGuest)
+ for i, guest := range guestsWithParty {
+ if guestID == guest.ID {
+ guestsWithParty[i].PartyList = append(guest.PartyList, partyGuest)
}
}
}
- return guestSlice, nil
+ return guestsWithParty, nil
}
-func (m MemStore) Add(guest Guest) error {
- statement := "insert into guest (id, first_name, last_name, attendance, email, message, party_size) values ($1, $2, $3, $4, $5, $6, $7)"
- _, err := m.db.Exec(context.Background(), statement, guest.Id, guest.FirstName, guest.LastName, guest.Attendance, guest.Email, guest.Message, guest.PartySize)
- if err != nil {
+func (store Store) Add(guest Guest) error {
+ if err := store.insertGuest(guest); err != nil {
return err
}
+ return store.insertParty(guest)
+}
- statement = "insert into party (guest_id, first_name, last_name) values ($1, $2, $3)"
- for _, pg := range guest.PartyList {
- _, err = m.db.Exec(context.Background(), statement, guest.Id, pg.FirstName, pg.LastName)
- if err != nil {
- return err
- }
- }
- return nil
+func (store Store) insertGuest(guest Guest) error {
+ statement := `insert into guest (id, first_name, last_name, attendance,
+ email, message, party_size) values ($1, $2, $3, $4, $5, $6, $7)`
+ _, err := store.database.Exec(context.Background(), statement, guest.ID,
+ guest.FirstName, guest.LastName, guest.Attendance, guest.Email,
+ guest.Message, guest.PartySize)
+ return err
}
-func (m MemStore) Update(guest Guest) error {
- statement := "update guest set attendance = $1, email = $2, message = $3, party_size = $4 where id = $5"
- _, err := m.db.Exec(context.Background(), statement, guest.Attendance, guest.Email, guest.Message, guest.PartySize, guest.Id)
- if err != nil {
+func (store Store) Update(guest Guest) error {
+ if err := store.updateGuest(guest); err != nil {
return err
}
-
- statement = "delete from party where guest_id = $1"
- _, err = m.db.Exec(context.Background(), statement, guest.Id)
- if err != nil {
+ if err := store.deleteOldParty(guest.ID); err != nil {
return err
}
+ return store.insertParty(guest)
+}
+
+func (store Store) updateGuest(guest Guest) error {
+ statement := `update guest set attendance = $1, email = $2, message = $3,
+ party_size = $4 where id = $5`
+ _, err := store.database.Exec(context.Background(), statement,
+ guest.Attendance, guest.Email, guest.Message, guest.PartySize, guest.ID)
+ return err
+}
+
+func (store Store) deleteOldParty(guestID int) error {
+ statement := "delete from party where guest_id = $1"
+ _, err := store.database.Exec(context.Background(), statement, guestID)
+ return err
+}
- statement = "insert into party (guest_id, first_name, last_name) values ($1, $2, $3)"
+func (store Store) insertParty(guest Guest) error {
+ statement := `insert into party (guest_id, first_name, last_name)
+ values ($1, $2, $3)`
for _, pg := range guest.PartyList {
- _, err = m.db.Exec(context.Background(), statement, guest.Id, pg.FirstName, pg.LastName)
+ _, err := store.database.Exec(context.Background(), statement, guest.ID,
+ pg.FirstName, pg.LastName)
if err != nil {
return err
}