I am using Apollo server 2.0 as graphql aggregation layer over my rest apis ( different microservices).
I want to generate graphql schema directly from the api response of microservices instead of manually writing them by hand which could be error prone.
e.g If my api response is
const restApiResponse = {
  "id": 512,
  "personName": "Caribbean T20 2016",
  "personShortName": "caribbean-t20 2016",
  "startDate": "2016-06-29T19:30:00.000Z",
  "endDate": "2016-08-08T18:29:59.000Z",
  "status": 0,
};
Then I want to generate below schema based on the typeName supplied e.g Person
 -
type Person {
  id: Float
  personName: String
  personShortName: String
  startDate: String
  endDate: String
  status: Float
}
                Finally after lots of searches and look up I wrote a script to do that for me -
There are some minor issues with this such as ints are parsed as Floats but thats fine as I can replace them with int if required.
const { composeWithJson } = require('graphql-compose-json');
const { GQC } = require('graphql-compose');
const { printSchema } = require('graphql'); // CommonJS
const restApiResponse = {
    "id": 399,
    "templateId": 115,
    "amount": 100000,
    "amountINR": 100000,
    "amountUSD": 0,
    "currencyCode": "INR",
    "createdAt": "2018-06-07T00:08:28.000Z",
    "createdBy": 36,
};
const GqlType = composeWithJson('Template', restApiResponse);
const PersonGraphQLType = GqlType.getType();
GqlType.addResolver({
    name: 'findById',
    type: GqlType,
    args: {
      id: 'Int!',
    },
    resolve: rp => {
    },
  });
  GQC.rootQuery().addFields({
    person: GqlType.getResolver('findById'),
  });
const schema = GQC.buildSchema();
console.log(printSchema(schema));
It generates output like this -
type Template {
  id: Float
  templateId: Float
  amount: Float
  amountINR: Float
  amountUSD: Float
  currencyCode: String
  createdAt: String
  createdBy: Float
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With