gqlify
gqlify copied to clipboard
Encapsulate payload in update passed to dataSource
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
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'}]
}
}) {...}