diff --git a/actions/dataset.go b/actions/dataset.go index b923d9b05..c510ae5e8 100644 --- a/actions/dataset.go +++ b/actions/dataset.go @@ -291,9 +291,12 @@ func CreateDataset(node *p2p.QriNode, name string, ds *dataset.Dataset, data caf r.LogEvent(repo.ETDsPinned, ref) } - err = ReadDataset(r, &ref) - if err != nil { - body, err = r.Store().Get(datastore.NewKey(ref.Dataset.BodyPath)) + if err = ReadDataset(r, &ref); err != nil { + return + } + + if body, err = r.Store().Get(datastore.NewKey(ref.Dataset.BodyPath)); err != nil { + fmt.Println("error getting from store:", err.Error()) } return diff --git a/api/datasets.go b/api/datasets.go index afda8b6a2..060737d64 100644 --- a/api/datasets.go +++ b/api/datasets.go @@ -1,6 +1,7 @@ package api import ( + "bytes" "encoding/json" "errors" "fmt" @@ -11,6 +12,8 @@ import ( "path/filepath" "strings" + "github.com/qri-io/ioes" + util "github.com/datatogether/api/apiutil" "github.com/qri-io/dataset" "github.com/qri-io/dataset/dsutil" @@ -24,6 +27,7 @@ import ( // DatasetHandlers wraps a requests struct to interface with http.HandlerFunc type DatasetHandlers struct { lib.DatasetRequests + node *p2p.QriNode repo repo.Repo ReadOnly bool } @@ -31,7 +35,7 @@ type DatasetHandlers struct { // NewDatasetHandlers allocates a DatasetHandlers pointer func NewDatasetHandlers(node *p2p.QriNode, readOnly bool) *DatasetHandlers { req := lib.NewDatasetRequests(node, nil) - h := DatasetHandlers{*req, node.Repo, readOnly} + h := DatasetHandlers{*req, node, node.Repo, readOnly} return &h } @@ -392,11 +396,31 @@ func (h *DatasetHandlers) initHandler(w http.ResponseWriter, r *http.Request) { defer os.Remove(f.Name()) io.Copy(f, tfFile) if dsp.Transform == nil { - dsp.Transform = &dataset.TransformPod{ - Syntax: "skylark", - ScriptPath: f.Name(), - } + dsp.Transform = &dataset.TransformPod{} + } + dsp.Transform.Syntax = "skylark" + dsp.Transform.ScriptPath = f.Name() + } + + vizFile, _, err := r.FormFile("viz") + if err != nil && err != http.ErrMissingFile { + util.WriteErrResponse(w, http.StatusBadRequest, fmt.Errorf("error opening viz file: %s", err)) + return + } + if vizFile != nil { + // TODO - this assumes an html viz file + f, err := ioutil.TempFile("", "viz") + if err != nil { + util.WriteErrResponse(w, http.StatusBadRequest, err) + return + } + defer os.Remove(f.Name()) + io.Copy(f, vizFile) + if dsp.Viz == nil { + dsp.Viz = &dataset.Viz{} } + dsp.Viz.Format = "html" + dsp.Viz.ScriptPath = f.Name() } dsp.Peername = r.FormValue("peername") @@ -423,6 +447,18 @@ func (h *DatasetHandlers) initHandler(w http.ResponseWriter, r *http.Request) { } + // TODO - fix this awful mess, ioes needs some method for piping it's output + prev := h.node.LocalStreams + defer func() { + h.node.LocalStreams = prev + }() + + in := &bytes.Buffer{} + out := &bytes.Buffer{} + errOut := &bytes.Buffer{} + s := ioes.NewIOStreams(in, out, errOut) + h.node.LocalStreams = s + res := &repo.DatasetRef{} p := &lib.SaveParams{ Dataset: dsp, @@ -435,16 +471,30 @@ func (h *DatasetHandlers) initHandler(w http.ResponseWriter, r *http.Request) { util.WriteErrResponse(w, http.StatusInternalServerError, err) return } + if p.ReturnBody { // TODO - this'll only work for JSON responses - data := []byte{} - if err := json.NewDecoder(res.Dataset.Body.(io.Reader)).Decode(&data); err != nil { + data, err := ioutil.ReadAll(res.Dataset.Body.(io.Reader)) + if err != nil { + log.Info(err.Error()) util.WriteErrResponse(w, http.StatusInternalServerError, err) return } + res.Dataset.Body = json.RawMessage(data) } - util.WriteResponse(w, res.Dataset) + + // util.WriteResponse(w, res) + env := map[string]interface{}{ + "meta": map[string]interface{}{ + "code": http.StatusOK, + "message": string(out.Bytes()), + }, + "data": res.Dataset, + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(env) } func (h *DatasetHandlers) addHandler(w http.ResponseWriter, r *http.Request) { diff --git a/api/testdata/api.snapshot b/api/testdata/api.snapshot index 5a9312441..f6764b7af 100755 Binary files a/api/testdata/api.snapshot and b/api/testdata/api.snapshot differ