gqlify icon indicating copy to clipboard operation
gqlify copied to clipboard

Encapsulate payload in update passed to dataSource

Open wwwy3y3 opened this issue 7 years ago • 1 comments

Is your feature request related to a problem? Please describe. For issues below:

  • #34: Atomic operation on nested array in GraphQL API
  • #35: Support firestore.FieldValue.serverTimestamp()

Also for future possible features like:

  • Increase/decrease a field value
  • update nested object field without overriding the whole object field

Describe the solution you'd like We should somehow encapsulate the payload that passed to create/update methods in dataSource.

Implementaion detail

enum ArrayOperator {
  set = 'set',
  add = 'add',
  remove = 'remove',
}

interface ArrayUpdateOperation {
  fieldName: string;
  operator:  ArrayOperator
}

interface Mutation {
  getData(): Record<string, any>;
  getArrayOperations(): ArrayUpdateOperation[];
}

interface ListMutable {
  // origin:
  // update(where: Where, payload: any): Promise<any>;
  // new:
  update(where: Where, mutation: Mutation): Promise<any>;
}

API

getData(): Record<string, any>

Should directly replace the original values with payload got from getData()

getArrayOperations(): ArrayUpdateOperation[]

getArrayOperations() will provide atomic operations like add, set, remove to dataSource

wwwy3y3 avatar Dec 26 '18 08:12 wwwy3y3

In v3.0.0(https://github.com/Canner/gqlify/releases/tag/v3.0.0), we add set field to array field of create/update mutation.

Change

Create mutation

Before

createUser(data: {
  members: [{name: 'wwwy3y3'}]
}) {...}

After v3.0.0

createUser(data: {
  members: {
    set: [{name: 'wwwy3y3'}]
  }
}) {...}

Update mutation

Before

updateUser(data: {
  members: [{name: 'wwwy3y3'}]
}) {...}

After v3.0.0

updateUser(data: {
  members: {
    set: [{name: 'wwwy3y3'}]
  }
}) {...}

wwwy3y3 avatar Feb 05 '19 14:02 wwwy3y3