···
+
// this adds to the existing count
+
func AddPunch(e Execer, punch Punch) error {
+
insert into punchcard (did, date, count)
+
on conflict(did, date) do update set
+
count = coalesce(punchcard.count, 0) + excluded.count;
+
`, punch.Did, punch.Date.Format(time.DateOnly), punch.Count)
+
type Punchcard struct {
+
func MakePunchcard(e Execer, filters ...filter) (Punchcard, error) {
+
punchcard := Punchcard{}
+
var conditions []string
+
for _, filter := range filters {
+
conditions = append(conditions, filter.Condition())
+
args = append(args, filter.arg)
+
whereClause = " where " + strings.Join(conditions, " and ")
+
select date, sum(count) as total_count
+
rows, err := e.Query(query, args...)
+
var count sql.NullInt64
+
if err := rows.Scan(&date, &count); err != nil {
+
punch.Date, err = time.Parse(time.DateOnly, date)
+
fmt.Println("invalid date")
+
// this punch is not recorded if date is invalid
+
punch.Count = int(count.Int64)
+
punchcard.Punches = append(punchcard.Punches, punch)
+
punchcard.Total += punch.Count