[firestore] Add FieldPath support to DocumentReference and WriteBatch update methods

This commit is contained in:
Chris Bianca
2018-01-12 11:49:45 +00:00
parent 5e062868fc
commit 3dacb35291
5 changed files with 94 additions and 33 deletions

View File

@@ -4,6 +4,8 @@
*/
import CollectionReference from './CollectionReference';
import DocumentSnapshot from './DocumentSnapshot';
import FieldPath from './FieldPath';
import { mergeFieldPathData } from './utils';
import { buildNativeMap } from './utils/serialize';
import { getAppEventName, SharedEventEmitter } from '../../utils/events';
import { getLogger } from '../../utils/log';
@@ -192,10 +194,13 @@ export default class DocumentReference {
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`);
if (isString(key)) {
data[key] = value;
} else if (key instanceof FieldPath) {
data = mergeFieldPathData(data, key._segments, value);
} else {
throw new Error(`DocumentReference.update failed: Argument at index ${i} must be a string or FieldPath`);
}
data[key] = value;
}
}
const nativeData = buildNativeMap(data);

View File

@@ -2,6 +2,8 @@
* @flow
* WriteBatch representation wrapper
*/
import FieldPath from './FieldPath';
import { mergeFieldPathData } from './utils';
import { buildNativeMap } from './utils/serialize';
import { isObject, isString } from '../../utils';
import { getNativeModule } from '../../utils/native';
@@ -67,19 +69,22 @@ export default class WriteBatch {
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.');
throw new Error('WriteBatch.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.');
throw new Error('WriteBatch.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`);
if (isString(key)) {
data[key] = value;
} else if (key instanceof FieldPath) {
data = mergeFieldPathData(data, key._segments, value);
} else {
throw new Error(`WriteBatch.update failed: Argument at index ${i} must be a string or FieldPath`);
}
data[key] = value;
}
}

View File

@@ -0,0 +1,32 @@
/**
* @flow
*/
const buildFieldPathData = (segments: string[], value: any): Object => {
if (segments.length === 1) {
return {
[segments[0]]: value,
};
}
return {
[segments[0]]: buildFieldPathData(segments.slice(1), value),
};
};
export const mergeFieldPathData = (data: Object, segments: string[], value: any): Object => {
if (segments.length === 1) {
return {
...data,
[segments[0]]: value,
};
} else if (data[segments[0]]) {
return {
...data,
[segments[0]]: mergeFieldPathData(data[segments[0]], segments.slice(1), value),
};
}
return {
...data,
[segments[0]]: buildFieldPathData(segments.slice(1), value),
};
};