Skip to content

Commit 1fc9a18

Browse files
committed
Make dataconnect params optional
1 parent b7fcfad commit 1fc9a18

File tree

3 files changed

+64
-31
lines changed

3 files changed

+64
-31
lines changed

src/firebase_functions/dataconnect_fn.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
AuthType = _typing.Literal["app_user", "admin", "unknown"]
3434

35+
3536
@_dataclass.dataclass(frozen=True)
3637
class Event(_core.CloudEvent[_core.T]):
3738
"""
@@ -64,6 +65,7 @@ class Event(_core.CloudEvent[_core.T]):
6465
The unique identifier for the principal.
6566
"""
6667

68+
6769
@_dataclass.dataclass(frozen=True)
6870
class GraphqlErrorExtensions:
6971
"""
@@ -183,6 +185,7 @@ class Mutation:
183185
It conforms to https://spec.graphql.org/draft/#sec-Errors.
184186
"""
185187

188+
186189
@_dataclass.dataclass(frozen=True)
187190
class MutationEventData:
188191
"""
@@ -191,16 +194,17 @@ class MutationEventData:
191194

192195
payload: Mutation
193196

197+
194198
_E1 = Event[MutationEventData]
195199
_C1 = _typing.Callable[[_E1], None]
196200

197201

198202
def _dataconnect_endpoint_handler(
199203
func: _C1,
200204
event_type: str,
201-
service_pattern: _path_pattern.PathPattern,
202-
connector_pattern: _path_pattern.PathPattern,
203-
operation_pattern: _path_pattern.PathPattern,
205+
service_pattern: _path_pattern.PathPattern | None,
206+
connector_pattern: _path_pattern.PathPattern | None,
207+
operation_pattern: _path_pattern.PathPattern | None,
204208
raw: _ce.CloudEvent,
205209
) -> None:
206210
# Currently, only mutationExecuted is supported
@@ -214,11 +218,20 @@ def _dataconnect_endpoint_handler(
214218
event_service = event_attributes["service"]
215219
event_connector = event_attributes["connector"]
216220
event_operation = event_attributes["operation"]
217-
params: dict[str, str] = {
218-
**service_pattern.extract_matches(event_service),
219-
**connector_pattern.extract_matches(event_connector),
220-
**operation_pattern.extract_matches(event_operation),
221-
}
221+
params: dict[str, str] = {}
222+
223+
if service_pattern:
224+
params = {**params, **service_pattern.extract_matches(event_service)}
225+
if connector_pattern:
226+
params = {
227+
**params,
228+
**connector_pattern.extract_matches(event_connector)
229+
}
230+
if operation_pattern:
231+
params = {
232+
**params,
233+
**operation_pattern.extract_matches(event_operation)
234+
}
222235

223236
event_auth_type = event_attributes["authtype"]
224237
event_auth_id = event_attributes["authid"]
@@ -270,9 +283,12 @@ def mutation_executed_handler(event: Event[MutationEventData]):
270283
options = DataConnectOptions(**kwargs)
271284

272285
def on_mutation_executed_inner_decorator(func: _C1):
273-
service_pattern = _path_pattern.PathPattern(options.service)
274-
connector_pattern = _path_pattern.PathPattern(options.connector)
275-
operation_pattern = _path_pattern.PathPattern(options.operation)
286+
service_pattern = _path_pattern.PathPattern(
287+
options.service) if options.service else None
288+
connector_pattern = _path_pattern.PathPattern(
289+
options.connector) if options.connector else None
290+
operation_pattern = _path_pattern.PathPattern(
291+
options.operation) if options.operation else None
276292

277293
@_functools.wraps(func)
278294
def on_mutation_executed_wrapped(raw: _ce.CloudEvent):

src/firebase_functions/options.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,17 +1159,17 @@ class DataConnectOptions(RuntimeOptions):
11591159
Internal use only.
11601160
"""
11611161

1162-
service: str
1162+
service: str | None = None
11631163
"""
11641164
The Firebase Data Connect service ID.
11651165
"""
11661166

1167-
connector: str
1167+
connector: str | None = None
11681168
"""
11691169
The Firebase Data Connect connector ID.
11701170
"""
11711171

1172-
operation: str
1172+
operation: str | None = None
11731173
"""
11741174
Name of the operation.
11751175
"""
@@ -1179,9 +1179,6 @@ def _endpoint(
11791179
**kwargs,
11801180
) -> _manifest.ManifestEndpoint:
11811181
assert kwargs["event_type"] is not None
1182-
assert kwargs["service_pattern"] is not None
1183-
assert kwargs["connector_pattern"] is not None
1184-
assert kwargs["operation_pattern"] is not None
11851182

11861183
service_pattern: _path_pattern.PathPattern = kwargs["service_pattern"]
11871184
connector_pattern: _path_pattern.PathPattern = kwargs["connector_pattern"]
@@ -1190,20 +1187,23 @@ def _endpoint(
11901187
event_filters: _typing.Any = {}
11911188
event_filters_path_patterns: _typing.Any = {}
11921189

1193-
if service_pattern.has_wildcards:
1194-
event_filters_path_patterns["service"] = service_pattern.value
1195-
else:
1196-
event_filters["service"] = service_pattern.value
1197-
1198-
if connector_pattern.has_wildcards:
1199-
event_filters_path_patterns["connector"] = connector_pattern.value
1200-
else:
1201-
event_filters["connector"] = connector_pattern.value
1202-
1203-
if operation_pattern.has_wildcards:
1204-
event_filters_path_patterns["operation"] = operation_pattern.value
1205-
else:
1206-
event_filters["operation"] = operation_pattern.value
1190+
if self.service:
1191+
if service_pattern.has_wildcards:
1192+
event_filters_path_patterns["service"] = service_pattern.value
1193+
else:
1194+
event_filters["service"] = service_pattern.value
1195+
1196+
if self.connector:
1197+
if connector_pattern.has_wildcards:
1198+
event_filters_path_patterns["connector"] = connector_pattern.value
1199+
else:
1200+
event_filters["connector"] = connector_pattern.value
1201+
1202+
if self.operation:
1203+
if operation_pattern.has_wildcards:
1204+
event_filters_path_patterns["operation"] = operation_pattern.value
1205+
else:
1206+
event_filters["operation"] = operation_pattern.value
12071207

12081208
event_trigger = _manifest.EventTrigger(
12091209
eventType=kwargs["event_type"],

tests/test_dataconnect_fn.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ def test_on_mutation_executed_decorator(self):
3939
self.assertEqual(endpoint.eventTrigger["eventFilters"]["connector"], "connector-id")
4040
self.assertEqual(endpoint.eventTrigger["eventFilters"]["operation"], "mutation-name")
4141

42+
def test_on_mutation_executed_decorator_optional_filters(self):
43+
"""
44+
Tests on_mutation_executed decorator functionality by checking that the
45+
__firebase_endpoint__ attribute is set properly.
46+
"""
47+
func = mock.Mock(__name__="example_func")
48+
decorated_func = dataconnect_fn.on_mutation_executed()(func)
49+
endpoint = decorated_func.__firebase_endpoint__
50+
self.assertIsNotNone(endpoint)
51+
self.assertIsNotNone(endpoint.eventTrigger)
52+
self.assertEqual(
53+
endpoint.eventTrigger["eventType"],
54+
"google.firebase.dataconnect.connector.v1.mutationExecuted",
55+
)
56+
self.assertIsNotNone(endpoint.eventTrigger["eventFilters"])
57+
self.assertEqual(endpoint.eventTrigger["eventFilters"], {})
58+
4259
def test_on_mutation_executed_decorator_with_captures(self):
4360
"""
4461
Tests on_mutation_executed decorator functionality by checking that the

0 commit comments

Comments
 (0)