package main import ( "database/sql" "encoding/json" "fmt" "log" ) type Member struct { Name string `json:"name"` DietaryPreferences string `json:"dietaryPreferences"` Child bool `json:"child"` } type Rsvp struct { Id int64 `json:"id"` Attending bool `json:"attending"` PartySize int64 `json:"partySize"` PartyMembers []Member `json:"partyMembers"` } func SetupRsvpsTable(db *sql.DB) { _, err := db.Exec(`CREATE TABLE IF NOT EXISTS rsvps ( id INTEGER PRIMARY KEY AUTOINCREMENT, attending BOOLEAN NOT NULL, partySize INTEGER NOT NULL, partyMembers BLOB NOT NULL );`) if err != nil { log.Fatalf("failed to create rsvp table: %s", err.Error()) } } func GetRsvps(db *sql.DB) ([]Rsvp, error) { rows, err := db.Query("SELECT * FROM rsvps ORDER BY id DESC;") if err != nil { return nil, err } defer rows.Close() rsvps := make([]Rsvp, 0) for rows.Next() { var id int64 var attending bool var partySize int64 var rawPartyMembers []byte err = rows.Scan(&id, &attending, &partySize, &rawPartyMembers) if err != nil { return nil, err } var members []Member err := json.Unmarshal(rawPartyMembers, &members) if err != nil { return nil, err } rsvps = append(rsvps, Rsvp{ Id: id, Attending: attending, PartySize: partySize, PartyMembers: members, }) } return rsvps, nil } func (rsvp *Rsvp) CreateRsvp(db *sql.DB) (int64, error) { partyMembersBytes, err := json.Marshal(rsvp.PartyMembers) if err != nil { return -1, err } fmt.Printf("%s\n", partyMembersBytes) result, err := db.Exec( "INSERT INTO rsvps (attending, partySize, partyMembers) VALUES (?, ?, ?);", rsvp.Attending, rsvp.PartySize, partyMembersBytes, ) if err != nil { return -1, err } id, err := result.LastInsertId() if err != nil { return -1, err } rsvp.Id = id return id, nil } type RsvpPublisher interface { PublishNewRsvpNotification(rsvp *Rsvp) (string, error) } func SendRsvpNotification(publisher RsvpPublisher, rsvp *Rsvp) { resp, err := publisher.PublishNewRsvpNotification(rsvp) if err != nil { fmt.Printf("failed publishing notification: %s\n", err.Error()) } fmt.Printf("published notification: %s\n", resp) }