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 } from './snapshot' ;
27
30
import {
31
+ applyFirestoreDataConverter ,
28
32
getDocViaSnapshotListener ,
29
33
SnapshotMetadata
30
34
} from '../../../src/api/database' ;
31
35
import { ViewSnapshot } from '../../../src/core/view_snapshot' ;
32
- import { DocumentReference } from '../../../lite/src/api/reference' ;
36
+ import {
37
+ CollectionReference ,
38
+ doc ,
39
+ DocumentReference ,
40
+ newUserDataReader
41
+ } from '../../../lite/src/api/reference' ;
42
+ import { invokeCommitRpc } from '../../../src/remote/datastore' ;
43
+ import { DeleteMutation , Precondition } from '../../../src/model/mutation' ;
44
+ import { FieldPath } from '../../../lite/src/api/field_path' ;
33
45
34
46
export function getDoc < T > (
35
47
reference : firestore . DocumentReference < T >
@@ -42,6 +54,131 @@ export function getDoc<T>(
42
54
} ) ;
43
55
}
44
56
57
+ export function setDoc < T > (
58
+ reference : firestore . DocumentReference < T > ,
59
+ data : T
60
+ ) : Promise < void > ;
61
+ export function setDoc < T > (
62
+ reference : firestore . DocumentReference < T > ,
63
+ data : Partial < T > ,
64
+ options : firestore . SetOptions
65
+ ) : Promise < void > ;
66
+ export function setDoc < T > (
67
+ reference : firestore . DocumentReference < T > ,
68
+ data : T ,
69
+ options ?: firestore . SetOptions
70
+ ) : Promise < void > {
71
+ const ref = cast < DocumentReference < T > > ( reference , DocumentReference ) ;
72
+ const firestore = cast ( ref . firestore , Firestore ) ;
73
+
74
+ const [ convertedValue ] = applyFirestoreDataConverter (
75
+ ref . _converter ,
76
+ data ,
77
+ 'setDoc'
78
+ ) ;
79
+ const dataReader = newUserDataReader ( firestore ) ;
80
+ const parsed = dataReader . parseSetData (
81
+ 'setDoc' ,
82
+ ref . _key ,
83
+ convertedValue ,
84
+ options
85
+ ) ;
86
+
87
+ return firestore
88
+ . _getFirestoreClient ( )
89
+ . then ( firestoreClient =>
90
+ firestoreClient . write ( parsed . toMutations ( ref . _key , Precondition . none ( ) ) )
91
+ ) ;
92
+ }
93
+
94
+ export function updateDoc (
95
+ reference : firestore . DocumentReference < unknown > ,
96
+ data : firestore . UpdateData
97
+ ) : Promise < void > ;
98
+ export function updateDoc (
99
+ reference : firestore . DocumentReference < unknown > ,
100
+ field : string | firestore . FieldPath ,
101
+ value : unknown ,
102
+ ...moreFieldsAndValues : unknown [ ]
103
+ ) : Promise < void > ;
104
+ export function updateDoc (
105
+ reference : firestore . DocumentReference < unknown > ,
106
+ fieldOrUpdateData : string | firestore . FieldPath | firestore . UpdateData ,
107
+ value ?: unknown ,
108
+ ...moreFieldsAndValues : unknown [ ]
109
+ ) : Promise < void > {
110
+ const ref = cast < DocumentReference < unknown > > ( reference , DocumentReference ) ;
111
+ const firestore = cast ( ref . firestore , Firestore ) ;
112
+ const dataReader = newUserDataReader ( firestore ) ;
113
+
114
+ let parsed : ParsedUpdateData ;
115
+ if (
116
+ typeof fieldOrUpdateData === 'string' ||
117
+ fieldOrUpdateData instanceof FieldPath
118
+ ) {
119
+ parsed = dataReader . parseUpdateVarargs (
120
+ 'updateDoc' ,
121
+ ref . _key ,
122
+ fieldOrUpdateData ,
123
+ value ,
124
+ moreFieldsAndValues
125
+ ) ;
126
+ } else {
127
+ parsed = dataReader . parseUpdateData (
128
+ 'updateDoc' ,
129
+ ref . _key ,
130
+ fieldOrUpdateData
131
+ ) ;
132
+ }
133
+
134
+ return firestore
135
+ . _getFirestoreClient ( )
136
+ . then ( firestoreClient =>
137
+ firestoreClient . write (
138
+ parsed . toMutations ( ref . _key , Precondition . exists ( true ) )
139
+ )
140
+ ) ;
141
+ }
142
+
143
+ export function deleteDoc (
144
+ reference : firestore . DocumentReference
145
+ ) : Promise < void > {
146
+ const ref = cast < DocumentReference < unknown > > ( reference , DocumentReference ) ;
147
+ const firestore = cast ( ref . firestore , Firestore ) ;
148
+ return firestore
149
+ . _getFirestoreClient ( )
150
+ . then ( firestoreClient =>
151
+ firestoreClient . write ( [ new DeleteMutation ( ref . _key , Precondition . none ( ) ) ] )
152
+ ) ;
153
+ }
154
+
155
+ export function addDoc < T > (
156
+ reference : firestore . CollectionReference < T > ,
157
+ data : T
158
+ ) : Promise < firestore . DocumentReference < T > > {
159
+ const collRef = cast < CollectionReference < T > > ( reference , CollectionReference ) ;
160
+ const firestore = cast ( collRef , Firestore ) ;
161
+ const docRef = doc ( collRef ) ;
162
+
163
+ const [ convertedValue ] = applyFirestoreDataConverter (
164
+ collRef . _converter ,
165
+ data ,
166
+ 'addDoc'
167
+ ) ;
168
+
169
+ const dataReader = newUserDataReader ( collRef . firestore ) ;
170
+ const parsed = dataReader . parseSetData ( 'addDoc' , docRef . _key , convertedValue ) ;
171
+
172
+ return firestore
173
+ . _getFirestoreClient ( )
174
+ . then ( firestoreClient =>
175
+ firestoreClient . write (
176
+ parsed . toMutations ( docRef . _key , Precondition . exists ( false ) )
177
+ )
178
+ )
179
+ . then ( ( ) => docRef ) ;
180
+ }
181
+
45
182
/**
46
183
* Converts a ViewSnapshot that contains the single document specified by `ref`
47
184
* to a DocumentSnapshot.
0 commit comments