diff --git a/back/store.go b/back/store.go index 5df6586..7a89be4 100644 --- a/back/store.go +++ b/back/store.go @@ -5,10 +5,10 @@ import ( "errors" "log" "os" - "time" "crawshaw.io/sqlite" "crawshaw.io/sqlite/sqlitex" + "github.com/rickb777/date" ) type GenString func(length int) (string, error) @@ -118,9 +118,9 @@ func (s *Store) createSchema() error { } type CreateEventCommand struct { - Name string - Description string - EarliestDate, LatestDate time.Time + Name string + Description string + Earliest, Latest date.Date } type CreateEventResult struct { @@ -154,8 +154,8 @@ func (s *Store) CreateEvent(ctx context.Context, cmd CreateEventCommand) (result adminCode, cmd.Name, cmd.Description, - cmd.EarliestDate.Format(dbDateLayout), - cmd.LatestDate.Format(dbDateLayout), + cmd.Earliest.Format(dbDateLayout), + cmd.Latest.Format(dbDateLayout), ) if err != nil { return @@ -171,9 +171,9 @@ type GetEventMetadataQuery struct { } type GetEventMetadataResult struct { - Name string - Description string - EarliestDate, LatestDate time.Time + Name string + Description string + Earliest, Latest date.Date } func (s *Store) GetEventMetadata(ctx context.Context, query GetEventMetadataQuery) (GetEventMetadataResult, error) { @@ -196,11 +196,11 @@ func (s *Store) GetEventMetadata(ctx context.Context, query GetEventMetadataQuer latestDateString := stmt.ColumnText(3) var err error - result.EarliestDate, err = time.Parse(dbDateLayout, earliestDateString) + result.Earliest, err = date.Parse(dbDateLayout, earliestDateString) if err != nil { return err } - result.LatestDate, err = time.Parse(dbDateLayout, latestDateString) + result.Latest, err = date.Parse(dbDateLayout, latestDateString) return err }, query.AlphaID) if err != nil { @@ -242,7 +242,7 @@ func (s *Store) GetEventResponses(ctx context.Context, query GetEventResponsesQu type CreateEventResponseCommand struct { EventAlphaID string - DateHours map[time.Time]int + DateHours map[date.Date]int } type CreateEventResponseResult struct { diff --git a/back/store_test.go b/back/store_test.go index dab1098..b299162 100644 --- a/back/store_test.go +++ b/back/store_test.go @@ -3,9 +3,9 @@ package back_test import ( "context" "testing" - "time" "github.com/matryer/is" + "github.com/rickb777/date" "gitlab.codemonkeysoftware.net/b/henwen/back" ) @@ -23,15 +23,15 @@ func TestCreateEvent(t *testing.T) { is.NoErr(err) defer store.Close() - earliest := time.Date(2020, 04, 05, 0, 0, 0, 0, time.UTC) - latest := time.Date(2020, 04, 05, 0, 0, 0, 0, time.UTC) + earliest := date.New(2020, 4, 5) + latest := date.New(2020, 4, 5) const name = "abc" const description = "def" createResult, err := store.CreateEvent(context.Background(), back.CreateEventCommand{ - Name: name, - Description: description, - EarliestDate: earliest, - LatestDate: latest, + Name: name, + Description: description, + Earliest: earliest, + Latest: latest, }) is.NoErr(err) @@ -41,8 +41,8 @@ func TestCreateEvent(t *testing.T) { is.NoErr(err) is.Equal(metadataResult.Name, name) is.Equal(metadataResult.Description, description) - is.True(metadataResult.EarliestDate.Equal(earliest)) - is.True(metadataResult.LatestDate.Equal(latest)) + is.True(metadataResult.Earliest.Equal(earliest)) + is.True(metadataResult.Latest.Equal(latest)) } func TestGetEventResponses(t *testing.T) { @@ -51,10 +51,10 @@ func TestGetEventResponses(t *testing.T) { createEvent := func(is *is.I) (eventID string) { event, err := store.CreateEvent(context.Background(), back.CreateEventCommand{ - Name: "blah", + Name: "blah", Description: "stuff happening", - EarliestDate: time.Now(), - LatestDate: time.Now().AddDate(0,0,1), + Earliest: date.Today(), + Latest: date.Today().Add(1), }) is.NoErr(err) return event.AlphaID @@ -98,4 +98,4 @@ func TestGetEventResponses(t *testing.T) { is.Equal(getTotalResponses(is, eventID), 1) }) -} \ No newline at end of file +} diff --git a/front/server.go b/front/server.go index bfd503d..eb31c66 100644 --- a/front/server.go +++ b/front/server.go @@ -9,6 +9,7 @@ import ( "strconv" "time" + "github.com/rickb777/date" hm "gitlab.codemonkeysoftware.net/b/hatmill" a "gitlab.codemonkeysoftware.net/b/hatmill/attribute" e "gitlab.codemonkeysoftware.net/b/hatmill/element" @@ -84,14 +85,15 @@ func disableIf(cond bool, input hm.Term) hm.Term { } type voteState struct { - name string - earliestDate, latestDate time.Time + name string + earliest, latest date.Date } func voteForm(disabled bool, st voteState) hm.Term { - var dates []time.Time - for curr := st.earliestDate; curr.Before(st.latestDate.Add(time.Hour)); curr = curr.AddDate(0, 0, 1) { - dates = append(dates, curr) + dateSpan := st.latest.Sub(st.earliest) + var dates []date.Date + for offset := date.PeriodOfDays(0); offset <= dateSpan; offset++ { + dates = append(dates, st.earliest.Add(offset)) } var ths = hm.Terms{e.Th()()} @@ -133,8 +135,8 @@ func (h *handler) handleVote(w http.ResponseWriter, r *http.Request) { } state := voteState{ - earliestDate: event.EarliestDate, - latestDate: event.LatestDate, + earliest: event.Earliest, + latest: event.Latest, } body := hm.Terms{ e.P()(hm.Text(event.Description)), @@ -148,9 +150,9 @@ func (h *handler) handleDoVote(w http.ResponseWriter, r *http.Request) { // TODO Use actual data. state := voteState{ - name: "Suzie Q", - earliestDate: time.Date(2006, time.May, 3, 0, 0, 0, 0, time.UTC), - latestDate: time.Date(2006, time.May, 8, 0, 0, 0, 0, time.UTC), + name: "Suzie Q", + earliest: date.New(2006, time.May, 3), + latest: date.New(2006, time.May, 8), } body := hm.Terms{ e.P()(hm.Text("At Billy's house. Bring presents. Eat cake.")), @@ -188,12 +190,12 @@ func (h *handler) handleCreate(w http.ResponseWriter, r *http.Request) { func (h *handler) handleDoCreate(w http.ResponseWriter, r *http.Request) { // TODO consider redirecting to admin - earliest, err := time.Parse(formDateLayout, r.FormValue(fieldNameEarliest)) + earliest, err := date.Parse(formDateLayout, r.FormValue(fieldNameEarliest)) if err != nil { fmt.Fprint(w, "bad earliest date") return } - latest, err := time.Parse(formDateLayout, r.FormValue(fieldNameLatest)) + latest, err := date.Parse(formDateLayout, r.FormValue(fieldNameLatest)) if err != nil { fmt.Fprint(w, "bad latest date") return @@ -206,10 +208,10 @@ func (h *handler) handleDoCreate(w http.ResponseWriter, r *http.Request) { description := r.FormValue(fieldNameDescription) event, err := h.store.CreateEvent(context.Background(), back.CreateEventCommand{ - Name: eventName, - Description: description, - EarliestDate: earliest, - LatestDate: latest, + Name: eventName, + Description: description, + Earliest: earliest, + Latest: latest, }) if err != nil { fmt.Fprint(w, err) @@ -292,7 +294,7 @@ func (h *handler) handleAdmin(w http.ResponseWriter, r *http.Request) { e.Input( a.Name(fieldNameEarliest), a.Type("date"), - a.Value(metadata.EarliestDate.Format(formDateLayout)), + a.Value(metadata.Earliest.Format(formDateLayout)), ), e.Br(), @@ -300,7 +302,7 @@ func (h *handler) handleAdmin(w http.ResponseWriter, r *http.Request) { e.Input( a.Name(fieldNameLatest), a.Type("date"), - a.Value(metadata.LatestDate.Format(formDateLayout)), + a.Value(metadata.Latest.Format(formDateLayout)), ), e.Br(), diff --git a/go.mod b/go.mod index 59d734c..2c13d3d 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,6 @@ go 1.14 require ( crawshaw.io/sqlite v0.2.5 github.com/matryer/is v1.3.0 + github.com/rickb777/date v1.12.4 gitlab.codemonkeysoftware.net/b/hatmill v0.0.5 ) diff --git a/go.sum b/go.sum index feaf13c..fc7a738 100644 --- a/go.sum +++ b/go.sum @@ -4,5 +4,11 @@ crawshaw.io/sqlite v0.2.5/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4= github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/matryer/is v1.3.0 h1:9qiso3jaJrOe6qBRJRBt2Ldht05qDiFP9le0JOIhRSI= github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/rickb777/date v1.12.4 h1:+6IzcCCS/1t17DrmnEvrznyq7nM8vPwir6/UhlyohKw= +github.com/rickb777/date v1.12.4/go.mod h1:xP0eo/I5qmUt97yRGClHZfyLZ3ikMw6v6SU5MOGZTE0= +github.com/rickb777/plural v1.2.0 h1:5tvEc7UBCZ7l8h/2UeybSkt/uu1DQsZFOFdNevmUhlE= +github.com/rickb777/plural v1.2.0/go.mod h1:UdpyWFCGbo3mvK3f/PfZOAOrkjzJlYN/sD46XNWJ+Es= gitlab.codemonkeysoftware.net/b/hatmill v0.0.5 h1:7L70G1Qmdm7bSwH58qWY5psXOwoqcvokLhc4BPSIjWo= gitlab.codemonkeysoftware.net/b/hatmill v0.0.5/go.mod h1:3jggrD9qkK8kXt0d3+Kwg3zti2PfPcociz7r3oxtjWU= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=