Save responses in Store

This commit is contained in:
2020-09-27 15:44:04 -06:00
parent cd261000fc
commit bc486fa976
3 changed files with 247 additions and 30 deletions

View File

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"io"
"log"
"net/http"
"net/url"
"strconv"
@ -69,6 +70,7 @@ var timeLabels = []string{
}
type voteState struct {
eventAlphaID string
name string
earliest, latest date.Date
}
@ -90,15 +92,22 @@ func voteForm(disabled bool, st voteState) hm.Term {
var row = hm.Terms{
e.Td()(hm.Text(timeLabels[hour])),
}
for day := 0; day < len(dates); day++ {
row = append(row, e.Td()(e.Input(a.Type("checkbox"), a.Disabled(disabled))))
for _, day := range dates {
value := fmt.Sprintf("%8s-%02d", day.Format("20060102"), hour)
row = append(row, e.Td()(e.Input(
a.Name("slot"),
a.Value(value),
a.Type("checkbox"),
a.Disabled(disabled),
)))
}
rows = append(rows, e.Tr()(row))
}
return e.Form(a.Method(http.MethodPost), a.Action(pathDoVote))(
e.Label()(hm.Text("What's your name?")),
e.Input(a.Type("hidden"), a.Name(keyEventID), a.Value(st.eventAlphaID)),
e.Label(a.For(fieldNameGuestName))(hm.Text("What's your name?")),
e.Br(),
e.Input(a.Size(40), a.Value(st.name), a.Disabled(disabled)),
e.Input(a.Name(fieldNameGuestName), a.Size(40), a.Value(st.name), a.Disabled(disabled)),
e.Fieldset()(
e.Legend()(hm.Text("When are you available?")),
e.Table()(rows),
@ -130,11 +139,50 @@ func (h *handler) handleVote(w http.ResponseWriter, r *http.Request) {
}
func (h *handler) handleDoVote(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Println(err)
http.Error(w, "invalid form values", http.StatusBadRequest)
return
}
cmd := back.CreateEventResponseCommand{
EventAlphaID: r.URL.Query().Get(keyEventID),
DateHours: make(map[date.Date]map[int]struct{}),
}
for _, slot := range r.PostForm["slot"] {
var dateString string
var hour int
_, err := fmt.Sscanf(slot, "%8s-%02d", &dateString, &hour)
if err != nil {
log.Println(err)
http.Error(w, "invalid form values", http.StatusBadRequest)
return
}
d, err := date.Parse("20060102", dateString)
if err != nil {
log.Println(err)
http.Error(w, "invalid form values", http.StatusBadRequest)
return
}
if cmd.DateHours[d] == nil {
cmd.DateHours[d] = make(map[int]struct{})
}
cmd.DateHours[d][hour] = struct{}{}
}
_, err = h.store.CreateEventResponse(r.Context(), cmd)
if err != nil {
log.Println(err)
// TODO handle not found
http.Error(w, "internal server error", http.StatusInternalServerError)
return
}
// TODO Consider redirecting to vote edit page once that exists.
// TODO Use actual data.
state := voteState{
name: "Suzie Q",
name: r.Form.Get(fieldNameGuestName),
earliest: date.New(2006, time.May, 3),
latest: date.New(2006, time.May, 8),
}
@ -252,7 +300,7 @@ func (h *handler) handleAdmin(w http.ResponseWriter, r *http.Request) {
return
}
responses, err := h.store.GetEventResponses(context.Background(), back.GetEventResponsesQuery{
responses, err := h.store.GetEventResponseSummary(context.Background(), back.GetEventResponseSummaryQuery{
AlphaID: eventID,
})
if err != nil {
@ -326,6 +374,7 @@ const (
fieldNameLatest = "latestDate"
fieldNameEventName = "eventName"
fieldNameDescription = "eventDescription"
fieldNameGuestName = "guestName"
)
const keyEventID = "event_id"