Coder Social home page Coder Social logo

Comments (2)

zopf avatar zopf commented on July 3, 2024

Here's my hack to make deletions possible: wellth-app@886e8f3

from graffiti-mongoose.

zopf avatar zopf commented on July 3, 2024

... and then I made this middleware that I can drop into my Koa stack to grab null variables from things that look like mutations and add their paths to the deletions argument:

function getPathsToNull(tree, parentPath) {
  const nullPaths = [];
  for (const key in tree) {
    if (tree[key] === null) {
      // add to null paths
      nullPaths.push(
        parentPath ?
          [parentPath, key].join('.') :
          key
      );
    } else if (tree[key] instanceof Object) {
      // descend
      nullPaths.push.apply(nullPaths, getPathsToNull(
        tree[key],
        parentPath ?
          [parentPath, key].join('.') :
          key
      ));
    }
  }
  return nullPaths;
}

function * handleNullVariables(next) {
  const body = this.request.body;
  const { query, variables } = Object.assign({}, body, this.query);
  // TODO: properly parse the full query AST to determine if actually an add/update mutation
  if (query && /mutation[\s\S]*{\s*(update|add)[a-zA-Z_]+\s*\(/i.test(query)) {
    const parsedVariables = (typeof variables === 'string' && variables.length > 0) ?
          JSON.parse(variables) : variables;

    for (const key in parsedVariables) {
      if ({}.hasOwnProperty.call(parsedVariables, key)) {
        const deletions = getPathsToNull(parsedVariables[key]);
        if (deletions && parsedVariables[key] !== null) {
          parsedVariables[key].deletions = deletions;
        }
      }
    }

    const correctedVariables = JSON.stringify(parsedVariables);
    // set both GET and POST vars
    this.request.body.variables = correctedVariables;
    this.query.variables = correctedVariables;
  }
  yield next;
}

export default handleNullVariables;

from graffiti-mongoose.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.