blob: 5b310b6301c93505964f161289432a4879b6ee4f [file] [log] [blame]
package importer
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"github.com/golang/glog"
"github.com/itaysk/regogo"
)
var jsonContentType = "application/json"
var addImgTmpl = `mutation {
addImage(input: [{ objectPath: %s }]) {
image {
id
}
}
}`
type Query struct {
Query string `json:"query"`
}
func EventToQuery(event string) (Query, error) {
key, err := regogo.Get(event, "input.Key")
if err != nil {
return Query{}, err
}
keyStr := key.String()
if keyStr == "" {
return Query{}, errors.New("Key not found")
}
objectPath, err := json.Marshal(key.String())
if err != nil {
return Query{}, err
}
return Query{fmt.Sprintf(addImgTmpl, objectPath)}, nil
}
type Handler struct {
ApiAddr string
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
glog.Error(err)
http.Error(w, "Could not read HTTP request body", http.StatusBadRequest)
return
}
if len(body) == 0 {
// Just a health check from Minio
return
}
bodyStr := string(body)
glog.Infof("Received event from Minio: %s", bodyStr)
query, err := EventToQuery(bodyStr)
if err != nil {
glog.Error(err)
http.Error(w, "INTERNAL", http.StatusBadRequest)
return
}
glog.Info(query)
queryJson, err := json.Marshal(query)
if err != nil {
panic(err)
}
glog.Infof("Query obj: %s", queryJson)
resp, err := http.Post(h.ApiAddr, jsonContentType, bytes.NewReader(queryJson))
if err != nil {
glog.Error(err)
http.Error(w, "Query failed", http.StatusInternalServerError)
return
}
if resp.StatusCode != http.StatusOK {
glog.Error(resp.StatusCode)
http.Error(w, "Query failed", resp.StatusCode)
return
}
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
glog.Info(string(respBody))
}