Skip to content

Commit

Permalink
feat!: add QoL improvements for converters (#1595)
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Chen committed Aug 24, 2021
1 parent b6c5a1a commit 39e5138
Show file tree
Hide file tree
Showing 9 changed files with 793 additions and 73 deletions.
19 changes: 13 additions & 6 deletions dev/src/bulk-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ export class BulkWriter {
*/
create<T>(
documentRef: firestore.DocumentReference<T>,
data: T
data: firestore.WithFieldValue<T>
): Promise<WriteResult> {
this._verifyNotClosed();
return this._enqueue(documentRef, 'create', bulkCommitBatch =>
Expand Down Expand Up @@ -654,13 +654,20 @@ export class BulkWriter {
*/
set<T>(
documentRef: firestore.DocumentReference<T>,
data: T | Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options?: firestore.SetOptions
): Promise<WriteResult> {
this._verifyNotClosed();
return this._enqueue(documentRef, 'set', bulkCommitBatch =>
bulkCommitBatch.set(documentRef, data, options)
);
return this._enqueue(documentRef, 'set', bulkCommitBatch => {
if (options) {
return bulkCommitBatch.set(documentRef, data, options);
} else {
return bulkCommitBatch.set(
documentRef,
data as firestore.WithFieldValue<T>
);
}
});
}

/**
Expand Down Expand Up @@ -706,7 +713,7 @@ export class BulkWriter {
*/
update<T>(
documentRef: firestore.DocumentReference<T>,
dataOrField: firestore.UpdateData | string | FieldPath,
dataOrField: firestore.UpdateData<T> | string | FieldPath,
...preconditionOrValues: Array<
{lastUpdateTime?: Timestamp} | unknown | string | FieldPath
>
Expand Down
2 changes: 1 addition & 1 deletion dev/src/document-change.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export type DocumentChangeType = 'added' | 'removed' | 'modified';
* @class DocumentChange
*/
export class DocumentChange<T = firestore.DocumentData>
implements firestore.DocumentChange
implements firestore.DocumentChange<T>
{
private readonly _type: DocumentChangeType;
private readonly _document: QueryDocumentSnapshot<T>;
Expand Down
28 changes: 17 additions & 11 deletions dev/src/reference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ export class DocumentReference<T = firestore.DocumentData>
*
* @param _firestore The Firestore Database client.
* @param _path The Path of this reference.
* @param _converter The converter to use when serializing data.
*/
constructor(
private readonly _firestore: Firestore,
Expand Down Expand Up @@ -356,7 +357,7 @@ export class DocumentReference<T = firestore.DocumentData>
* console.log(`Failed to create document: ${err}`);
* });
*/
create(data: T): Promise<WriteResult> {
create(data: firestore.WithFieldValue<T>): Promise<WriteResult> {
const writeBatch = new WriteBatch(this._firestore);
return writeBatch
.create(this, data)
Expand Down Expand Up @@ -395,8 +396,11 @@ export class DocumentReference<T = firestore.DocumentData>
.then(([writeResult]) => writeResult);
}

set(data: Partial<T>, options: firestore.SetOptions): Promise<WriteResult>;
set(data: T): Promise<WriteResult>;
set(
data: firestore.PartialWithFieldValue<T>,
options: firestore.SetOptions
): Promise<WriteResult>;
set(data: firestore.WithFieldValue<T>): Promise<WriteResult>;
/**
* Writes to the document referred to by this DocumentReference. If the
* document does not yet exist, it will be created. If you pass
Expand All @@ -421,14 +425,16 @@ export class DocumentReference<T = firestore.DocumentData>
* });
*/
set(
data: T | Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options?: firestore.SetOptions
): Promise<WriteResult> {
const writeBatch = new WriteBatch(this._firestore);
return writeBatch
.set(this, data, options)
.commit()
.then(([writeResult]) => writeResult);
let writeBatch = new WriteBatch(this._firestore);
if (options) {
writeBatch = writeBatch.set(this, data, options);
} else {
writeBatch = writeBatch.set(this, data as firestore.WithFieldValue<T>);
}
return writeBatch.commit().then(([writeResult]) => writeResult);
}

/**
Expand Down Expand Up @@ -461,7 +467,7 @@ export class DocumentReference<T = firestore.DocumentData>
* });
*/
update(
dataOrField: firestore.UpdateData | string | firestore.FieldPath,
dataOrField: firestore.UpdateData<T> | string | firestore.FieldPath,
...preconditionOrValues: Array<
unknown | string | firestore.FieldPath | firestore.Precondition
>
Expand Down Expand Up @@ -2609,7 +2615,7 @@ export class CollectionReference<T = firestore.DocumentData>
* console.log(`Added document with name: ${documentReference.id}`);
* });
*/
add(data: T): Promise<DocumentReference<T>> {
add(data: firestore.WithFieldValue<T>): Promise<DocumentReference<T>> {
const firestoreData = this._queryOptions.converter.toFirestore(data);
validateDocumentData(
'data',
Expand Down
22 changes: 16 additions & 6 deletions dev/src/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,17 +212,23 @@ export class Transaction implements firestore.Transaction {
* });
* });
*/
create<T>(documentRef: firestore.DocumentReference<T>, data: T): Transaction {
create<T>(
documentRef: firestore.DocumentReference<T>,
data: firestore.WithFieldValue<T>
): Transaction {
this._writeBatch.create(documentRef, data);
return this;
}

set<T>(
documentRef: firestore.DocumentReference<T>,
data: Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options: firestore.SetOptions
): Transaction;
set<T>(documentRef: firestore.DocumentReference<T>, data: T): Transaction;
set<T>(
documentRef: firestore.DocumentReference<T>,
data: firestore.WithFieldValue<T>
): Transaction;
/**
* Writes to the document referred to by the provided
* [DocumentReference]{@link DocumentReference}. If the document
Expand Down Expand Up @@ -252,10 +258,14 @@ export class Transaction implements firestore.Transaction {
*/
set<T>(
documentRef: firestore.DocumentReference<T>,
data: T | Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options?: firestore.SetOptions
): Transaction {
this._writeBatch.set(documentRef, data, options);
if (options) {
this._writeBatch.set(documentRef, data, options);
} else {
this._writeBatch.set(documentRef, data as firestore.WithFieldValue<T>);
}
return this;
}

Expand Down Expand Up @@ -299,7 +309,7 @@ export class Transaction implements firestore.Transaction {
*/
update<T>(
documentRef: firestore.DocumentReference<T>,
dataOrField: firestore.UpdateData | string | firestore.FieldPath,
dataOrField: firestore.UpdateData<T> | string | firestore.FieldPath,
...preconditionOrValues: Array<
firestore.Precondition | unknown | string | firestore.FieldPath
>
Expand Down
8 changes: 6 additions & 2 deletions dev/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
* limitations under the License.
*/

import {FirestoreDataConverter, DocumentData} from '@google-cloud/firestore';
import {
FirestoreDataConverter,
DocumentData,
WithFieldValue,
} from '@google-cloud/firestore';

import {CallOptions} from 'google-gax';
import {Duplex} from 'stream';
Expand Down Expand Up @@ -114,7 +118,7 @@ export type RBTree = any;
* @internal
*/
const defaultConverterObj: FirestoreDataConverter<DocumentData> = {
toFirestore(modelObject: DocumentData): DocumentData {
toFirestore(modelObject: WithFieldValue<DocumentData>): DocumentData {
return modelObject;
},
fromFirestore(snapshot: QueryDocumentSnapshot): DocumentData {
Expand Down
36 changes: 20 additions & 16 deletions dev/src/write-batch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,14 @@ export class WriteBatch implements firestore.WriteBatch {
* console.log('Successfully executed batch.');
* });
*/
create<T>(documentRef: firestore.DocumentReference<T>, data: T): WriteBatch {
create<T>(
documentRef: firestore.DocumentReference<T>,
data: firestore.WithFieldValue<T>
): WriteBatch {
const ref = validateDocumentReference('documentRef', documentRef);
const firestoreData = ref._converter.toFirestore(data);
const firestoreData = ref._converter.toFirestore(
data as firestore.WithFieldValue<T>
);
validateDocumentData(
'data',
firestoreData,
Expand Down Expand Up @@ -268,14 +273,12 @@ export class WriteBatch implements firestore.WriteBatch {

set<T>(
documentRef: firestore.DocumentReference<T>,
data: Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options: firestore.SetOptions
): WriteBatch;
set<T>(documentRef: firestore.DocumentReference<T>, data: T): WriteBatch;
set<T>(
documentRef: firestore.DocumentReference<T>,
data: T | Partial<T>,
options?: firestore.SetOptions
data: firestore.WithFieldValue<T>
): WriteBatch;
/**
* Write to the document referred to by the provided
Expand Down Expand Up @@ -308,7 +311,7 @@ export class WriteBatch implements firestore.WriteBatch {
*/
set<T>(
documentRef: firestore.DocumentReference<T>,
data: T | Partial<T>,
data: firestore.PartialWithFieldValue<T>,
options?: firestore.SetOptions
): WriteBatch {
validateSetOptions('options', options, {optional: true});
Expand Down Expand Up @@ -405,7 +408,7 @@ export class WriteBatch implements firestore.WriteBatch {
*/
update<T = firestore.DocumentData>(
documentRef: firestore.DocumentReference<T>,
dataOrField: firestore.UpdateData | string | firestore.FieldPath,
dataOrField: firestore.UpdateData<T> | string | firestore.FieldPath,
...preconditionOrValues: Array<
| {lastUpdateTime?: firestore.Timestamp}
| unknown
Expand Down Expand Up @@ -470,15 +473,16 @@ export class WriteBatch implements firestore.WriteBatch {
// eslint-disable-next-line prefer-rest-params
validateMaxNumberOfArguments('update', arguments, 3);

const data = dataOrField as firestore.UpdateData;
Object.entries(data).forEach(([key, value]) => {
// Skip `undefined` values (can be hit if `ignoreUndefinedProperties`
// is set)
if (value !== undefined) {
validateFieldPath(key, key);
updateMap.set(FieldPath.fromArgument(key), value);
Object.entries(dataOrField as firestore.UpdateData<T>).forEach(
([key, value]) => {
// Skip `undefined` values (can be hit if `ignoreUndefinedProperties`
// is set)
if (value !== undefined) {
validateFieldPath(key, key);
updateMap.set(FieldPath.fromArgument(key), value);
}
}
});
);

if (preconditionOrValues.length > 0) {
validateUpdatePrecondition(
Expand Down
Loading

0 comments on commit 39e5138

Please sign in to comment.