collinenlucy.nl/server/rsvp.go

117 lines
2.2 KiB
Go
Raw Normal View History

2025-06-30 12:37:33 +02:00
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
}
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)
}