[firestore] Support update
variations on DocumentReference and WriteBatch
This commit is contained in:
parent
eccd551d43
commit
46136e6c4d
@ -5,7 +5,7 @@
|
|||||||
import CollectionReference from './CollectionReference';
|
import CollectionReference from './CollectionReference';
|
||||||
import DocumentSnapshot from './DocumentSnapshot';
|
import DocumentSnapshot from './DocumentSnapshot';
|
||||||
import Path from './Path';
|
import Path from './Path';
|
||||||
import { firestoreAutoId, isFunction, isObject } from '../../utils';
|
import { firestoreAutoId, isFunction, isObject, isString } from '../../utils';
|
||||||
|
|
||||||
export type WriteOptions = {
|
export type WriteOptions = {
|
||||||
merge?: boolean,
|
merge?: boolean,
|
||||||
@ -156,7 +156,25 @@ export default class DocumentReference {
|
|||||||
.documentSet(this.path, data, writeOptions);
|
.documentSet(this.path, data, writeOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
update(data: Object): Promise<void> {
|
update(...args: Object | string[]): Promise<void> {
|
||||||
|
let data = {};
|
||||||
|
if (args.length === 1) {
|
||||||
|
if (!isObject(args[0])) {
|
||||||
|
throw new Error('DocumentReference.update failed: If using a single argument, it must be an object.');
|
||||||
|
}
|
||||||
|
data = args[0];
|
||||||
|
} else if (args.length % 2 === 1) {
|
||||||
|
throw new Error('DocumentReference.update failed: Must have either a single object argument, or equal numbers of key/value pairs.');
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < args.length; i += 2) {
|
||||||
|
const key = args[i];
|
||||||
|
const value = args[i + 1];
|
||||||
|
if (!isString(key)) {
|
||||||
|
throw new Error(`DocumentReference.update failed: Argument at index ${i} must be a string`);
|
||||||
|
}
|
||||||
|
data[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
return this._firestore._native
|
return this._firestore._native
|
||||||
.documentUpdate(this.path, data);
|
.documentUpdate(this.path, data);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
* WriteBatch representation wrapper
|
* WriteBatch representation wrapper
|
||||||
*/
|
*/
|
||||||
import DocumentReference from './DocumentReference';
|
import DocumentReference from './DocumentReference';
|
||||||
|
import { isObject, isString } from '../../utils';
|
||||||
|
|
||||||
import type { WriteOptions } from './DocumentReference';
|
import type { WriteOptions } from './DocumentReference';
|
||||||
|
|
||||||
@ -58,11 +59,27 @@ export default class WriteBatch {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Update to new method signature
|
update(docRef: DocumentReference, ...args: Object | string[]): WriteBatch {
|
||||||
update(docRef: DocumentReference, data: Object): WriteBatch {
|
|
||||||
// TODO: Validation
|
// TODO: Validation
|
||||||
// validate.isDocumentReference('docRef', docRef);
|
// validate.isDocumentReference('docRef', docRef);
|
||||||
// validate.isDocument('data', data, true);
|
let data = {};
|
||||||
|
if (args.length === 1) {
|
||||||
|
if (!isObject(args[0])) {
|
||||||
|
throw new Error('DocumentReference.update failed: If using two arguments, the second must be an object.');
|
||||||
|
}
|
||||||
|
data = args[0];
|
||||||
|
} else if (args.length % 2 === 1) {
|
||||||
|
throw new Error('DocumentReference.update failed: Must have a document reference, followed by either a single object argument, or equal numbers of key/value pairs.');
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < args.length; i += 2) {
|
||||||
|
const key = args[i];
|
||||||
|
const value = args[i + 1];
|
||||||
|
if (!isString(key)) {
|
||||||
|
throw new Error(`DocumentReference.update failed: Argument at index ${i + 1} must be a string`);
|
||||||
|
}
|
||||||
|
data[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._writes.push({
|
this._writes.push({
|
||||||
data,
|
data,
|
||||||
|
@ -388,10 +388,22 @@ function documentReferenceTests({ describe, it, context, firebase }) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
context('update()', () => {
|
context('update()', () => {
|
||||||
it('should update Document', () => {
|
it('should update Document using object', () => {
|
||||||
return firebase.native.firestore()
|
return firebase.native.firestore()
|
||||||
.doc('document-tests/doc1')
|
.doc('document-tests/doc1')
|
||||||
.set({ name: 'updated' })
|
.update({ name: 'updated' })
|
||||||
|
.then(async () => {
|
||||||
|
const doc = await firebase.native.firestore().doc('document-tests/doc1').get();
|
||||||
|
doc.data().name.should.equal('updated');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('update()', () => {
|
||||||
|
it('should update Document using key/value pairs', () => {
|
||||||
|
return firebase.native.firestore()
|
||||||
|
.doc('document-tests/doc1')
|
||||||
|
.update('name', 'updated')
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
const doc = await firebase.native.firestore().doc('document-tests/doc1').get();
|
const doc = await firebase.native.firestore().doc('document-tests/doc1').get();
|
||||||
doc.data().name.should.equal('updated');
|
doc.data().name.should.equal('updated');
|
||||||
|
@ -36,7 +36,7 @@ function firestoreTests({ describe, it, context, firebase }) {
|
|||||||
.set(nycRef, { name: 'New York City' })
|
.set(nycRef, { name: 'New York City' })
|
||||||
.set(sfRef, { name: 'San Francisco' })
|
.set(sfRef, { name: 'San Francisco' })
|
||||||
.update(nycRef, { population: 1000000 })
|
.update(nycRef, { population: 1000000 })
|
||||||
.update(sfRef, { name: 'San Fran' })
|
.update(sfRef, 'name', 'San Fran')
|
||||||
.set(lRef, { population: 3000000 }, { merge: true })
|
.set(lRef, { population: 3000000 }, { merge: true })
|
||||||
.delete(ayRef)
|
.delete(ayRef)
|
||||||
.commit()
|
.commit()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user