github.com/aleksi/gonuts.io@v0.0.0-20130622121132-3b0f2d1999fb/app/gonuts/common.go (about) 1 package gonuts 2 3 import ( 4 "appengine" 5 "appengine/urlfetch" 6 "bytes" 7 "encoding/json" 8 "fmt" 9 "io/ioutil" 10 "net/http" 11 "net/url" 12 ) 13 14 var ( 15 searchFindUrl url.URL 16 searchAddUrl url.URL 17 searchRemoveUrl url.URL 18 ) 19 20 func init() { 21 searchFindUrl = url.URL{Scheme: "http", Path: "/"} 22 if appengine.IsDevAppServer() { 23 searchFindUrl.Host = "localhost:8081" 24 } else { 25 searchFindUrl.Host = "search-gonuts-io.appspot.com" 26 } 27 28 searchAddUrl = searchFindUrl 29 searchAddUrl.Path = "/add" 30 searchAddUrl.RawQuery = fmt.Sprintf("token=%s", addSecretToken) 31 32 searchRemoveUrl = searchFindUrl 33 searchRemoveUrl.Path = "/remove" 34 searchRemoveUrl.RawQuery = fmt.Sprintf("token=%s", addSecretToken) 35 } 36 37 func LogError(c appengine.Context, err error) { 38 if err != nil { 39 c.Warningf("%s", err) 40 } 41 } 42 43 func PanicIfErr(err error) { 44 if err != nil { 45 panic(err) 46 } 47 } 48 49 func AddToSearchIndex(c appengine.Context, nut *Nut) (err error) { 50 m := make(map[string]interface{}) 51 m["Nut"] = nut 52 b, err := json.Marshal(m) 53 if err != nil { 54 return 55 } 56 57 req, err := http.NewRequest("POST", searchAddUrl.String(), bytes.NewReader(b)) 58 if err != nil { 59 return 60 } 61 req.Header.Set("Content-Type", "application/json") 62 63 client := urlfetch.Client(c) 64 res, err := client.Do(req) 65 66 if err == nil { 67 res.Body.Close() 68 if res.StatusCode != 201 { 69 err = fmt.Errorf("%s -> %d", searchAddUrl.String(), res.StatusCode) 70 } 71 } 72 return 73 } 74 75 func RemoveFromSearchIndex(c appengine.Context, nut *Nut) (err error) { 76 m := make(map[string]interface{}) 77 m["Nut"] = nut 78 b, err := json.Marshal(m) 79 if err != nil { 80 return 81 } 82 83 req, err := http.NewRequest("POST", searchRemoveUrl.String(), bytes.NewReader(b)) 84 if err != nil { 85 return 86 } 87 req.Header.Set("Content-Type", "application/json") 88 89 client := urlfetch.Client(c) 90 res, err := client.Do(req) 91 92 if err == nil { 93 res.Body.Close() 94 if res.StatusCode != 204 { 95 err = fmt.Errorf("%s -> %d", searchRemoveUrl.String(), res.StatusCode) 96 } 97 } 98 return 99 } 100 101 func SearchIndex(c appengine.Context, q string) (pairs [][]string, err error) { 102 client := urlfetch.Client(c) 103 u := searchFindUrl 104 u.RawQuery = url.Values{"q": []string{q}}.Encode() 105 res, err := client.Get(u.String()) 106 if err == nil { 107 defer res.Body.Close() 108 if res.StatusCode != 200 { 109 err = fmt.Errorf("%s -> %d", u.String(), res.StatusCode) 110 return 111 } 112 } 113 114 b, err := ioutil.ReadAll(res.Body) 115 if err != nil { 116 return 117 } 118 c.Infof("Response from search: %s", b) 119 120 m := make(map[string]interface{}) 121 err = json.Unmarshal(b, &m) 122 if err != nil { 123 return 124 } 125 126 nuts := m["Nuts"].([]interface{}) 127 pairs = make([][]string, len(nuts)) 128 for i, n := range nuts { 129 nm := n.(map[string]interface{}) 130 pairs[i] = []string{nm["Vendor"].(string), nm["Name"].(string)} 131 } 132 return 133 }