diff --git a/main.go b/main.go index b14d124..a0389d2 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,7 @@ func main() { ping.SendPing(db, failureSite) http.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) { - pings := ping.List(db) + pings := ping.ListGroupedBySite(db) if output, err := json.Marshal(pings); err != nil { w.Write([]byte(err.Error())) diff --git a/ping/ping.go b/ping/ping.go index 7fbaa07..671e133 100644 --- a/ping/ping.go +++ b/ping/ping.go @@ -101,3 +101,43 @@ func List(db *sql.DB) []PingResponse { return pings } + +type SiteResponse struct { + created_at string + Name string + Url string + Pings []Ping +} + +func ListGroupedBySite(db *sql.DB) []SiteResponse { + + responses := make([]SiteResponse, 0) + + for _, site := range sites.List(db) { + s := SiteResponse{Url: site.Url, Name: site.Name, created_at: site.Created_at} + s.Pings = listForSite(db, site) + responses = append(responses, s) + } + + return responses +} + +func listForSite(db *sql.DB, site sites.Site) []Ping { + rows, err := db.Query(`SELECT ping.timestamp, ping.status FROM ping WHERE site = ? ORDER BY timestamp DESC`, site.Url) + + if err != nil { + panic(err) + } + defer rows.Close() + + pings := make([]Ping, 0) + + for rows.Next() { + p := Ping{} + rows.Scan(&p.Timestamp, &p.Status) + p.Site = site + pings = append(pings, p) + } + + return pings +} diff --git a/sites/sites.go b/sites/sites.go index 62c1edf..599403c 100644 --- a/sites/sites.go +++ b/sites/sites.go @@ -18,7 +18,7 @@ func CreateTable(db *sql.DB) { } type Site struct { - created_at uint64 + Created_at string Name string Url string } @@ -32,3 +32,22 @@ SET func (s *Site) Save(db *sql.DB) { db.Exec(upsertQuery, s.Url, s.Name) } + +func List(db *sql.DB) []Site { + rows, err := db.Query(`SELECT url, name, created_at FROM sites ORDER BY created_at DESC`) + + if err != nil { + panic(err) + } + defer rows.Close() + + sites := make([]Site, 0) + + for rows.Next() { + s := Site{} + rows.Scan(&s.Url, &s.Name, &s.Created_at) + sites = append(sites, s) + } + + return sites +}