Save responses in Store
This commit is contained in:
@ -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"
|
||||
|
Reference in New Issue
Block a user