20
20
import typing as _typing
21
21
import datetime as _dt
22
22
import firebase_functions .private .util as _util
23
+ import firebase_functions .private .path_pattern as _path_pattern
23
24
import firebase_functions .core as _core
24
25
import cloudevents .http as _ce
25
26
@@ -91,12 +92,12 @@ class Event(_core.CloudEvent[_core.T]):
91
92
def _db_endpoint_handler (
92
93
func : _C1 | _C2 ,
93
94
event_type : str ,
95
+ ref_pattern : _path_pattern .PathPattern ,
96
+ instance_pattern : _path_pattern .PathPattern ,
94
97
raw : _ce .CloudEvent ,
95
98
) -> None :
96
99
event_attributes = raw ._get_attributes ()
97
100
event_data : _typing .Any = raw .get_data ()
98
- # TODO Params are built locally via path pattern which is currently unimplemented
99
- params : dict [str , str ] = {}
100
101
database_event_data = event_data
101
102
if event_type == _event_type_deleted :
102
103
database_event_data = database_event_data ["data" ]
@@ -112,10 +113,16 @@ def _db_endpoint_handler(
112
113
before = before ,
113
114
after = after ,
114
115
)
116
+ event_instance = event_attributes ["instance" ]
117
+ event_ref = event_attributes ["ref" ]
118
+ params : dict [str , str ] = {
119
+ ** ref_pattern .extract_matches (event_ref ),
120
+ ** instance_pattern .extract_matches (event_instance ),
121
+ }
115
122
database_event = Event (
116
123
firebase_database_host = event_attributes ["firebasedatabasehost" ],
117
- instance = event_attributes [ "instance" ] ,
118
- reference = event_attributes [ "ref" ] ,
124
+ instance = event_instance ,
125
+ reference = event_ref ,
119
126
location = event_attributes ["location" ],
120
127
specversion = event_attributes ["specversion" ],
121
128
id = event_attributes ["id" ],
@@ -155,15 +162,27 @@ def example(event: Event[Change[object]]) -> None:
155
162
options = DatabaseOptions (** kwargs )
156
163
157
164
def on_value_written_inner_decorator (func : _C1 ):
165
+ ref_pattern = _path_pattern .PathPattern (options .reference )
166
+ instance_pattern = _path_pattern .PathPattern (
167
+ options .instance if options .instance is not None else "*" )
158
168
159
169
@_functools .wraps (func )
160
170
def on_value_written_wrapped (raw : _ce .CloudEvent ):
161
- return _db_endpoint_handler (func , _event_type_written , raw )
171
+ return _db_endpoint_handler (
172
+ func ,
173
+ _event_type_written ,
174
+ ref_pattern ,
175
+ instance_pattern ,
176
+ raw ,
177
+ )
162
178
163
179
_util .set_func_endpoint_attr (
164
180
on_value_written_wrapped ,
165
- options ._endpoint (event_type = _event_type_written ,
166
- func_name = func .__name__ ),
181
+ options ._endpoint (
182
+ event_type = _event_type_written ,
183
+ func_name = func .__name__ ,
184
+ instance_pattern = instance_pattern ,
185
+ ),
167
186
)
168
187
return on_value_written_wrapped
169
188
@@ -193,15 +212,27 @@ def example(event: Event[Change[object]]) -> None:
193
212
options = DatabaseOptions (** kwargs )
194
213
195
214
def on_value_updated_inner_decorator (func : _C1 ):
215
+ ref_pattern = _path_pattern .PathPattern (options .reference )
216
+ instance_pattern = _path_pattern .PathPattern (
217
+ options .instance if options .instance is not None else "*" )
196
218
197
219
@_functools .wraps (func )
198
220
def on_value_updated_wrapped (raw : _ce .CloudEvent ):
199
- return _db_endpoint_handler (func , _event_type_updated , raw )
221
+ return _db_endpoint_handler (
222
+ func ,
223
+ _event_type_updated ,
224
+ ref_pattern ,
225
+ instance_pattern ,
226
+ raw ,
227
+ )
200
228
201
229
_util .set_func_endpoint_attr (
202
230
on_value_updated_wrapped ,
203
- options ._endpoint (event_type = _event_type_updated ,
204
- func_name = func .__name__ ),
231
+ options ._endpoint (
232
+ event_type = _event_type_updated ,
233
+ func_name = func .__name__ ,
234
+ instance_pattern = instance_pattern ,
235
+ ),
205
236
)
206
237
return on_value_updated_wrapped
207
238
@@ -231,15 +262,27 @@ def example(event: Event[object]):
231
262
options = DatabaseOptions (** kwargs )
232
263
233
264
def on_value_created_inner_decorator (func : _C2 ):
265
+ ref_pattern = _path_pattern .PathPattern (options .reference )
266
+ instance_pattern = _path_pattern .PathPattern (
267
+ options .instance if options .instance is not None else "*" )
234
268
235
269
@_functools .wraps (func )
236
270
def on_value_created_wrapped (raw : _ce .CloudEvent ):
237
- return _db_endpoint_handler (func , _event_type_created , raw )
271
+ return _db_endpoint_handler (
272
+ func ,
273
+ _event_type_created ,
274
+ ref_pattern ,
275
+ instance_pattern ,
276
+ raw ,
277
+ )
238
278
239
279
_util .set_func_endpoint_attr (
240
280
on_value_created_wrapped ,
241
- options ._endpoint (event_type = _event_type_created ,
242
- func_name = func .__name__ ),
281
+ options ._endpoint (
282
+ event_type = _event_type_created ,
283
+ func_name = func .__name__ ,
284
+ instance_pattern = instance_pattern ,
285
+ ),
243
286
)
244
287
return on_value_created_wrapped
245
288
@@ -269,15 +312,27 @@ def example(event: Event[object]) -> None:
269
312
options = DatabaseOptions (** kwargs )
270
313
271
314
def on_value_deleted_inner_decorator (func : _C2 ):
315
+ ref_pattern = _path_pattern .PathPattern (options .reference )
316
+ instance_pattern = _path_pattern .PathPattern (
317
+ options .instance if options .instance is not None else "*" )
272
318
273
319
@_functools .wraps (func )
274
320
def on_value_deleted_wrapped (raw : _ce .CloudEvent ):
275
- return _db_endpoint_handler (func , _event_type_deleted , raw )
321
+ return _db_endpoint_handler (
322
+ func ,
323
+ _event_type_deleted ,
324
+ ref_pattern ,
325
+ instance_pattern ,
326
+ raw ,
327
+ )
276
328
277
329
_util .set_func_endpoint_attr (
278
330
on_value_deleted_wrapped ,
279
- options ._endpoint (event_type = _event_type_deleted ,
280
- func_name = func .__name__ ),
331
+ options ._endpoint (
332
+ event_type = _event_type_deleted ,
333
+ func_name = func .__name__ ,
334
+ instance_pattern = instance_pattern ,
335
+ ),
281
336
)
282
337
return on_value_deleted_wrapped
283
338
0 commit comments