2
0
mirror of synced 2025-02-02 17:43:27 +00:00

[firestore] Support update variations on DocumentReference and WriteBatch

This commit is contained in:
Chris Bianca 2017-10-06 12:36:41 +01:00
parent eccd551d43
commit 46136e6c4d
4 changed files with 55 additions and 8 deletions

View File

@ -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);
} }

View File

@ -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,

View File

@ -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');

View File

@ -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()