gql: refactor dgraph client to reuse code. use updageGraphQLSchema.
diff --git a/controller/schema/dgraph_schema_store.go b/controller/schema/dgraph_schema_store.go
index 4f434d7..6725cbe 100644
--- a/controller/schema/dgraph_schema_store.go
+++ b/controller/schema/dgraph_schema_store.go
@@ -17,21 +17,25 @@
const jsonContentType = "application/json"
const textContentType = "text/plain"
-const getSchemaQuery = `{ "query": "{ getGQLSchema() { generatedSchema } }" }`
+// TODO(giolekva): escape
+const getSchemaQuery = `{ getGQLSchema() { schema generatedSchema } }`
+const setSchemaQuery = `mutation { updateGQLSchema(input: { set: { schema: "%s" } }) { gqlSchema { schema generatedSchema } } }`
const runQuery = `{ "query": "%s" }`
type DgraphClient struct {
- gqlAdddress string
- schemaAddress string
- gqlSchema string
- schema *ast.Schema
+ gqlAddress string
+ schemaAddress string
+ userSchema string
+ generatedSchema string
+ schema *ast.Schema
}
func NewDgraphClient(gqlAddress, schemaAddress string) (GraphQLClient, error) {
ret := &DgraphClient{
- gqlAdddress: gqlAddress,
- schemaAddress: schemaAddress,
- gqlSchema: ""}
+ gqlAddress: gqlAddress,
+ schemaAddress: schemaAddress,
+ userSchema: "",
+ generatedSchema: ""}
if err := ret.fetchSchema(); err != nil {
return nil, err
}
@@ -43,54 +47,45 @@
}
func (s *DgraphClient) AddSchema(gqlSchema string) error {
- return s.SetSchema(s.gqlSchema + gqlSchema)
+ return s.SetSchema(s.userSchema + gqlSchema)
}
func (s *DgraphClient) SetSchema(gqlSchema string) error {
- glog.Info("Setting GraphQL schema:")
+ glog.Info("Setting GraphQL schema")
glog.Info(gqlSchema)
- resp, err := http.Post(
- s.schemaAddress+"/schema",
- textContentType,
- bytes.NewReader([]byte(gqlSchema)))
+ resp, err := s.runQuery(
+ fmt.Sprintf(setSchemaQuery, sanitizeSchema(gqlSchema)),
+ s.schemaAddress)
if err != nil {
return err
}
- glog.Infof("Response status code: %d", resp.StatusCode)
- respBody, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return err
- }
- glog.Infof("Result: %s", string(respBody))
- s.gqlSchema = gqlSchema
- return s.fetchSchema()
+ return s.updateSchema(resp)
}
func (s *DgraphClient) fetchSchema() error {
- glog.Infof("Getting GraphQL schema with query: %s", getSchemaQuery)
- resp, err := http.Post(
- s.schemaAddress,
- jsonContentType,
- bytes.NewReader([]byte(getSchemaQuery)))
+ glog.Infof("Getting GraphQL schema")
+ resp, err := s.runQuery(getSchemaQuery, s.schemaAddress)
if err != nil {
return err
}
- glog.Infof("Response status code: %d", resp.StatusCode)
- respBody, err := ioutil.ReadAll(resp.Body)
+ return s.updateSchema(resp)
+}
+
+func (s *DgraphClient) updateSchema(resp string) error {
+ userSchema, err := regogo.Get(resp, "input.getGQLSchema.schema")
if err != nil {
return err
}
- glog.Infof("Result: %s", string(respBody))
- gqlSchema, err := regogo.Get(
- string(respBody),
- "input.data.getGQLSchema.generatedSchema")
+ generatedSchema, err := regogo.Get(resp, "input.getGQLSchema.generatedSchema")
if err != nil {
return err
}
- schema, gqlErr := gqlparser.LoadSchema(&ast.Source{Input: gqlSchema.String()})
+ schema, gqlErr := gqlparser.LoadSchema(&ast.Source{Input: generatedSchema.String()})
if gqlErr != nil {
return gqlErr
}
+ s.userSchema = userSchema.String()
+ s.generatedSchema = generatedSchema.String()
s.schema = schema
return nil
}
@@ -100,10 +95,14 @@
if gqlErr != nil {
return "", errors.New(gqlErr.Error())
}
+ return s.runQuery(query, s.gqlAddress)
+}
+
+func (s *DgraphClient) runQuery(query string, onAddr string) (string, error) {
glog.Infof("Running GraphQL query: %s", query)
queryJson := fmt.Sprintf(runQuery, sanitizeQuery(query))
resp, err := http.Post(
- s.gqlAdddress,
+ onAddr,
jsonContentType,
bytes.NewReader([]byte(queryJson)))
if err != nil {