|
20 | 20 | import * as firestore from '../../index';
|
21 | 21 |
|
22 | 22 | 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'; |
24 | 27 | import { debugAssert } from '../../../src/util/assert';
|
25 | 28 | import { cast } from '../../../lite/src/api/util';
|
26 | 29 | import { DocumentSnapshot, QuerySnapshot } from './snapshot';
|
27 | 30 | import {
|
| 31 | + applyFirestoreDataConverter, |
28 | 32 | getDocsViaSnapshotListener,
|
29 | 33 | getDocViaSnapshotListener,
|
30 | 34 | SnapshotMetadata
|
31 | 35 | } from '../../../src/api/database';
|
32 | 36 | 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'; |
34 | 44 | import { Document } from '../../../src/model/document';
|
| 45 | +import { DeleteMutation, Precondition } from '../../../src/model/mutation'; |
| 46 | +import { FieldPath } from '../../../src/api/field_path'; |
35 | 47 |
|
36 | 48 | export function getDoc<T>(
|
37 | 49 | reference: firestore.DocumentReference<T>
|
@@ -141,6 +153,133 @@ export function getQueryFromServer<T>(
|
141 | 153 | });
|
142 | 154 | }
|
143 | 155 |
|
| 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 | + |
144 | 283 | /**
|
145 | 284 | * Converts a ViewSnapshot that contains the single document specified by `ref`
|
146 | 285 | * to a DocumentSnapshot.
|
|
0 commit comments