Skip to content

Commit 5f51ab5

Browse files
Add setDoc, updateDoc, deleteDoc and addDoc (#3306)
1 parent 5d6b749 commit 5f51ab5

File tree

5 files changed

+359
-7
lines changed

5 files changed

+359
-7
lines changed

.changeset/tame-countries-marry.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
---
3+

packages/firestore/exp/src/api/reference.ts

Lines changed: 141 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,30 @@
2020
import * as firestore from '../../index';
2121

2222
import { Firestore } from './database';
23-
import { DocumentKeyReference } from '../../../src/api/user_data_reader';
23+
import {
24+
DocumentKeyReference,
25+
ParsedUpdateData
26+
} from '../../../src/api/user_data_reader';
2427
import { debugAssert } from '../../../src/util/assert';
2528
import { cast } from '../../../lite/src/api/util';
2629
import { DocumentSnapshot, QuerySnapshot } from './snapshot';
2730
import {
31+
applyFirestoreDataConverter,
2832
getDocsViaSnapshotListener,
2933
getDocViaSnapshotListener,
3034
SnapshotMetadata
3135
} from '../../../src/api/database';
3236
import { ViewSnapshot } from '../../../src/core/view_snapshot';
33-
import { DocumentReference, Query } from '../../../lite/src/api/reference';
37+
import {
38+
CollectionReference,
39+
doc,
40+
DocumentReference,
41+
newUserDataReader,
42+
Query
43+
} from '../../../lite/src/api/reference';
3444
import { Document } from '../../../src/model/document';
45+
import { DeleteMutation, Precondition } from '../../../src/model/mutation';
46+
import { FieldPath } from '../../../src/api/field_path';
3547

3648
export function getDoc<T>(
3749
reference: firestore.DocumentReference<T>
@@ -141,6 +153,133 @@ export function getQueryFromServer<T>(
141153
});
142154
}
143155

156+
export function setDoc<T>(
157+
reference: firestore.DocumentReference<T>,
158+
data: T
159+
): Promise<void>;
160+
export function setDoc<T>(
161+
reference: firestore.DocumentReference<T>,
162+
data: Partial<T>,
163+
options: firestore.SetOptions
164+
): Promise<void>;
165+
export function setDoc<T>(
166+
reference: firestore.DocumentReference<T>,
167+
data: T,
168+
options?: firestore.SetOptions
169+
): Promise<void> {
170+
const ref = cast<DocumentReference<T>>(reference, DocumentReference);
171+
const firestore = cast(ref.firestore, Firestore);
172+
173+
const convertedValue = applyFirestoreDataConverter(
174+
ref._converter,
175+
data,
176+
options
177+
);
178+
const dataReader = newUserDataReader(firestore);
179+
const parsed = dataReader.parseSetData(
180+
'setDoc',
181+
ref._key,
182+
convertedValue,
183+
ref._converter !== null,
184+
options
185+
);
186+
187+
return firestore
188+
._getFirestoreClient()
189+
.then(firestoreClient =>
190+
firestoreClient.write(parsed.toMutations(ref._key, Precondition.none()))
191+
);
192+
}
193+
194+
export function updateDoc(
195+
reference: firestore.DocumentReference<unknown>,
196+
data: firestore.UpdateData
197+
): Promise<void>;
198+
export function updateDoc(
199+
reference: firestore.DocumentReference<unknown>,
200+
field: string | firestore.FieldPath,
201+
value: unknown,
202+
...moreFieldsAndValues: unknown[]
203+
): Promise<void>;
204+
export function updateDoc(
205+
reference: firestore.DocumentReference<unknown>,
206+
fieldOrUpdateData: string | firestore.FieldPath | firestore.UpdateData,
207+
value?: unknown,
208+
...moreFieldsAndValues: unknown[]
209+
): Promise<void> {
210+
const ref = cast<DocumentReference<unknown>>(reference, DocumentReference);
211+
const firestore = cast(ref.firestore, Firestore);
212+
const dataReader = newUserDataReader(firestore);
213+
214+
let parsed: ParsedUpdateData;
215+
if (
216+
typeof fieldOrUpdateData === 'string' ||
217+
fieldOrUpdateData instanceof FieldPath
218+
) {
219+
parsed = dataReader.parseUpdateVarargs(
220+
'updateDoc',
221+
ref._key,
222+
fieldOrUpdateData,
223+
value,
224+
moreFieldsAndValues
225+
);
226+
} else {
227+
parsed = dataReader.parseUpdateData(
228+
'updateDoc',
229+
ref._key,
230+
fieldOrUpdateData
231+
);
232+
}
233+
234+
return firestore
235+
._getFirestoreClient()
236+
.then(firestoreClient =>
237+
firestoreClient.write(
238+
parsed.toMutations(ref._key, Precondition.exists(true))
239+
)
240+
);
241+
}
242+
243+
export function deleteDoc(
244+
reference: firestore.DocumentReference
245+
): Promise<void> {
246+
const ref = cast<DocumentReference<unknown>>(reference, DocumentReference);
247+
const firestore = cast(ref.firestore, Firestore);
248+
return firestore
249+
._getFirestoreClient()
250+
.then(firestoreClient =>
251+
firestoreClient.write([new DeleteMutation(ref._key, Precondition.none())])
252+
);
253+
}
254+
255+
export function addDoc<T>(
256+
reference: firestore.CollectionReference<T>,
257+
data: T
258+
): Promise<firestore.DocumentReference<T>> {
259+
const collRef = cast<CollectionReference<T>>(reference, CollectionReference);
260+
const firestore = cast(collRef, Firestore);
261+
const docRef = doc(collRef);
262+
263+
const convertedValue = applyFirestoreDataConverter(collRef._converter, data);
264+
265+
const dataReader = newUserDataReader(collRef.firestore);
266+
const parsed = dataReader.parseSetData(
267+
'addDoc',
268+
docRef._key,
269+
convertedValue,
270+
collRef._converter !== null
271+
);
272+
273+
return firestore
274+
._getFirestoreClient()
275+
.then(firestoreClient =>
276+
firestoreClient.write(
277+
parsed.toMutations(docRef._key, Precondition.exists(false))
278+
)
279+
)
280+
.then(() => docRef);
281+
}
282+
144283
/**
145284
* Converts a ViewSnapshot that contains the single document specified by `ref`
146285
* to a DocumentSnapshot.

packages/firestore/exp/test/helpers.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
DEFAULT_SETTINGS
2727
} from '../../test/integration/util/settings';
2828
import { collection } from '../../lite/src/api/reference';
29+
import { setDoc } from '../src/api/reference';
2930
import { AutoId } from '../../src/util/misc';
3031

3132
let appCount = 0;
@@ -63,3 +64,14 @@ export function withTestDoc(
6364
): Promise<void> {
6465
return withTestDb(db => fn(doc(collection(db, 'test-collection'))));
6566
}
67+
68+
export function withTestDocAndInitialData(
69+
data: firestore.DocumentData,
70+
fn: (doc: firestore.DocumentReference) => void | Promise<void>
71+
): Promise<void> {
72+
return withTestDb(async db => {
73+
const ref = doc(collection(db, 'test-collection'));
74+
await setDoc(ref, data);
75+
return fn(ref);
76+
});
77+
}

0 commit comments

Comments
 (0)