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  }