Skip to content

Instantly share code, notes, and snippets.

@robyoung
Forked from jabley/lpa_help.go
Created June 19, 2014 13:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robyoung/7114d25530a4bb586fb7 to your computer and use it in GitHub Desktop.
Save robyoung/7114d25530a4bb586fb7 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"time"
)
func main() {
var helpUriTemplate = "https://www.performance.service.gov.uk/data/lasting-power-of-attorney/journey?filter_by=eventAction%%3Ahelp.inline&group_by=eventDestination&collect=uniqueEvents%%3Asum&period=week&start_at=%s&end_at=%s"
var volumesUriTemplate = "https://www.performance.service.gov.uk/data/lasting-power-of-attorney/volumes?collect=value%%3Asum&period=week&start_at=%s&end_at=%s&group_by=key"
launchDate := time.Date(2013, time.November, 11, 0, 0, 0, 0, time.UTC)
for date := range generateStartDate(launchDate) {
// fmt.Printf("%v\n", date)
jsonResponse := grabData(helpUriTemplate, date)
doc := parse(jsonResponse)
sum := extractSum(doc)
jsonResponse = grabData(volumesUriTemplate, date)
doc = parse(jsonResponse)
volume := extractVolume(doc)
fmt.Printf("%v\t%4v\t%4v\t%4v\n", date.Format("2006-01-02"), sum, volume, sum/volume)
}
}
func generateStartDate(startDate time.Time) chan time.Time {
ch := make(chan time.Time)
endDate := time.Now()
go func() {
for i := startDate; i.Before(endDate); i = i.AddDate(0, 0, 7) {
ch <- i
}
close(ch)
}()
return ch
}
func grabData(uriTemplate string, startDate time.Time) []byte {
endDate := startDate.AddDate(0, 0, 7)
uri := fmt.Sprintf(uriTemplate, urlSafeDate(startDate), urlSafeDate(endDate))
// fmt.Println(uri)
res, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
return body
}
func parse(jsonResponse []byte) map[string]interface{} {
var doc interface{}
err := json.Unmarshal(jsonResponse, &doc)
if err != nil {
log.Fatal(err)
}
return doc.(map[string]interface{})
}
func extractSum(doc map[string]interface{}) float64 {
data := doc["data"].([]interface{})
for _, record := range data {
r := record.(map[string]interface{})
if r["eventDestination"] == "how-much-does-it-cost-to-apply-to-register-an-lpa" {
return r["uniqueEvents:sum"].(float64)
}
}
return 0.0
}
func extractVolume(doc map[string]interface{}) float64 {
res := 0.0
data := doc["data"].([]interface{})
for _, record := range data {
r := record.(map[string]interface{})
switch r["key"] {
case "health_and_welfare_digital_applications",
"property_and_financial_digital_applications":
{
res += r["value:sum"].(float64)
}
}
}
return res
}
func urlSafeDate(date time.Time) string {
return url.QueryEscape(date.Format("2006-01-02T15:04:05-07:00"))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment