All legislator calls complete

This commit is contained in:
Brian Buller 2016-06-16 12:26:36 -05:00
parent db7d2a4cc2
commit 6fdf497703
4 changed files with 137 additions and 23 deletions

View File

@ -17,8 +17,11 @@ func main() {
}
o := openstates.Create(apiKey)
//d, err := o.StateMetadata(states.Kansas)
d, err := o.GetBillDetailFromID("KSB00002165")
//d, err := o.GetBillDetailFromID("KSB00002165")
//d, err := o.GetBillDetail(states.Kansas, "2013-2014", "HR 6020")
//d, err := o.GetLegislatorsForState(states.Kansas)
//d, err := o.GetLegislatorDetail("KSL000018")
d, err := o.GetLegislatorsForGeo(35.79, -78.78)
if err != nil {
fmt.Println(err.Error())
return

View File

@ -1,7 +1,64 @@
package openstates
import "time"
// Legislator is a legislator
type Legislator struct {
LegID string `json:"leg_id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
MiddleName string `json:"middle_name"`
District string `json:"district"`
Chamber string `json:"chamber"`
URL string `json:"url"`
CreatedAtStr string `json:"created_at"`
CreatedAt time.Time `json:"-"`
UpdatedAtStr string `json:"updated_at"`
UpdatedAt time.Time `json:"-"`
Email string `json:"email"`
Active bool `json:"active"`
State string `json:"state"`
Offices []Office `json:"offices"`
OfficeAddress string `json:"office_address"`
VotesmartID string `json:"votesmart_id"`
FullName string `json:"full_name"`
LegID string `json:"leg_id"`
Party string `json:"party"`
Suffixes string `json:"suffixes"`
ID string `json:"id"`
PhotoURL string `json:"photo_url"`
Fax string `json:"+fax"`
Level string `json:"level"`
Phone string `json:"+phone"`
OldRoles map[string][]Role `json:"old_roles"`
Roles []Role `json:"roles"`
NameOnBill string `json:"name"` // Shows up when pulling bill detail
}
// Office is a legislators office
type Office struct {
Fax string `json:"fax"`
Name string `json:"name"`
Phone string `json:"phone"`
Address string `json:"address"`
Type string `json:"type"`
Email string `json:"email"`
}
// Role is a legislators role
type Role struct {
Term string `json:"term"`
StartDateStr string `json:"start_date"`
StartDate time.Time `json:"-"`
EndDateStr string `json:"end_date"`
EndDate time.Time `json:"-"`
District string `json:"district"`
Chamber string `json:"chamber"`
State string `json:"state"`
Party string `json:"party"`
Type string `json:"type"`
CommitteeID string `json:"committee_id"`
SubCommittee string `json:"subcommittee"`
Committee string `json:"committee"`
Position string `json:"position"`
}

View File

@ -2,7 +2,11 @@ package openstates
import (
"encoding/json"
"errors"
"net/url"
"strconv"
"github.com/br0xen/sunlight-api/openstates/states"
)
// SearchLegislators retrieves a list of legislators based on a number of
@ -27,8 +31,74 @@ func (o *OpenStates) SearchLegislators(v url.Values) ([]Legislator, error) {
}
err = json.Unmarshal(getVal, &ret)
if err == nil {
//for i := range ret {
//}
for i := range ret {
o.fixLegislatorTimes(&ret[i])
}
}
return ret, err
}
// GetLegislatorsForState returns all legislators for a specific state
func (o *OpenStates) GetLegislatorsForState(st string) ([]Legislator, error) {
st, err := states.ScrubToAbbr(st)
if err != nil {
return []Legislator{}, err
}
v := url.Values{}
v.Set("state", st)
return o.SearchLegislators(v)
}
// GetLegislatorDetail returns the detail for a legislator
func (o *OpenStates) GetLegislatorDetail(id string) (*Legislator, error) {
var ret *Legislator
var err error
var getVal []byte
v := url.Values{}
if getVal, err = o.call("legislators/"+id, v); err != nil {
return ret, err
}
err = json.Unmarshal(getVal, &ret)
o.fixLegislatorTimes(ret)
return ret, err
}
// GetLegislatorsForGeo return all legislators for a latitude & longitude
func (o *OpenStates) GetLegislatorsForGeo(lat, lng float64) ([]Legislator, error) {
var ret []Legislator
var err error
var getVal []byte
v := url.Values{}
v.Set("lat", strconv.FormatFloat(lat, 'f', -1, 64))
v.Set("long", strconv.FormatFloat(lng, 'f', -1, 64))
if getVal, err = o.call("legislators/geo/", v); err != nil {
return ret, err
}
err = json.Unmarshal(getVal, &ret)
if err == nil {
for i := range ret {
o.fixLegislatorTimes(&ret[i])
}
}
return ret, err
}
func (o *OpenStates) fixLegislatorTimes(l *Legislator) error {
if err := UnmarshalTimeString(l.CreatedAtStr, &l.CreatedAt); err != nil {
return errors.New("No Created At Time")
}
if err := UnmarshalTimeString(l.UpdatedAtStr, &l.UpdatedAt); err != nil {
return errors.New("No Updated At Time")
}
for i := range l.Roles {
UnmarshalTimeString(l.Roles[i].EndDateStr, &l.Roles[i].EndDate)
UnmarshalTimeString(l.Roles[i].StartDateStr, &l.Roles[i].StartDate)
}
for k := range l.OldRoles {
for i := range l.OldRoles[k] {
UnmarshalTimeString(l.OldRoles[k][i].EndDateStr, &l.OldRoles[k][i].EndDate)
UnmarshalTimeString(l.OldRoles[k][i].StartDateStr, &l.OldRoles[k][i].StartDate)
}
}
return nil
}

View File

@ -56,12 +56,9 @@ func (o *OpenStates) AllMetadata() ([]StateMeta, error) {
func (o *OpenStates) StateMetadata(st string) (*StateMeta, error) {
var ret *StateMeta
var err error
orig := st
if states.IsValidName(st) {
st, err = states.NameToAbbr(st)
}
if !states.IsValidAbbr(st) {
return ret, errors.New("Invalid State: " + orig)
st, err = states.ScrubToAbbr(st)
if err != nil {
return ret, err
}
var getVal []byte
vals := url.Values{}
@ -84,16 +81,3 @@ func UnmarshalTimeString(s string, t *time.Time) error {
*t, err = time.Parse("2006-01-02 15:04:05", s)
return err
}
/*
resp, err := http.Get("http://openstates.org/api/v1/legislators/geo/?apikey=" + site.OpenStatesKey + "&lat=" + lat + "&long=" + lng)
if err != nil {
fmt.Fprint(w, "{\"status\":\"error\"}")
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Fprint(w, string(body))
// http://openstates.org/api/v1/legislators/geo/?lat=35.79&long=-78.78
// https://sunlightlabs.github.io/openstates-api/legislators.html#examples/geo-lookup
*/