Skip to content

Commit 39926ed

Browse files
authored
Merge pull request #43 from invertase/db-event-fix
fix(db): event payload incorrect
2 parents adbc71e + d4c9a28 commit 39926ed

File tree

9 files changed

+147
-30
lines changed

9 files changed

+147
-30
lines changed

example/functions/main.py

+1-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Example Firebase Functions written in Python
33
"""
4-
from firebase_functions import db_fn, https_fn, options, params, pubsub_fn
4+
from firebase_functions import https_fn, options, params, pubsub_fn
55
from firebase_admin import initialize_app
66

77
initialize_app()
@@ -13,29 +13,6 @@
1313
)
1414

1515

16-
@db_fn.on_value_written(
17-
reference="hello",
18-
region=options.SupportedRegion.EUROPE_WEST1,
19-
)
20-
def onwriteexample(event: db_fn.Event[db_fn.Change[object]]) -> None:
21-
print("Hello from db write event:", event)
22-
23-
24-
@db_fn.on_value_created(reference="hello/{any_thing_here}/bar")
25-
def oncreatedexample(event: db_fn.Event[object]) -> None:
26-
print("Hello from db create event:", event)
27-
28-
29-
@db_fn.on_value_deleted(reference="hello/{any_thing_here}/bar")
30-
def ondeletedexample(event: db_fn.Event[object]) -> None:
31-
print("Hello from db delete event:", event)
32-
33-
34-
@db_fn.on_value_updated(reference="hello")
35-
def onupdatedexample(event: db_fn.Event[db_fn.Change[object]]) -> None:
36-
print("Hello from db updated event:", event)
37-
38-
3916
@https_fn.on_request()
4017
def onrequestexample(req: https_fn.Request) -> https_fn.Response:
4118
print("on request function data:", req.data)

samples/basic_db/.firebaserc

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"projects": {
3+
"default": "python-functions-testing"
4+
}
5+
}

samples/basic_db/.gitignore

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
firebase-debug.log*
8+
firebase-debug.*.log*
9+
10+
# Firebase cache
11+
.firebase/
12+
13+
# Firebase config
14+
15+
# Uncomment this if you'd like others to create their own Firebase project.
16+
# For a team working on the same Firebase project(s), it is recommended to leave
17+
# it commented so all members can deploy to the same project(s) in .firebaserc.
18+
# .firebaserc
19+
20+
# Runtime data
21+
pids
22+
*.pid
23+
*.seed
24+
*.pid.lock
25+
26+
# Directory for instrumented libs generated by jscoverage/JSCover
27+
lib-cov
28+
29+
# Coverage directory used by tools like istanbul
30+
coverage
31+
32+
# nyc test coverage
33+
.nyc_output
34+
35+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
36+
.grunt
37+
38+
# Bower dependency directory (https://bower.io/)
39+
bower_components
40+
41+
# node-waf configuration
42+
.lock-wscript
43+
44+
# Compiled binary addons (http://nodejs.org/api/addons.html)
45+
build/Release
46+
47+
# Dependency directories
48+
node_modules/
49+
50+
# Optional npm cache directory
51+
.npm
52+
53+
# Optional eslint cache
54+
.eslintcache
55+
56+
# Optional REPL history
57+
.node_repl_history
58+
59+
# Output of 'npm pack'
60+
*.tgz
61+
62+
# Yarn Integrity file
63+
.yarn-integrity
64+
65+
# dotenv environment variables file
66+
.env

samples/basic_db/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Required to avoid a 'duplicate modules' mypy error
2+
# in monorepos that have multiple main.py files.
3+
# https://github.com/python/mypy/issues/4008

samples/basic_db/firebase.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"functions": [
3+
{
4+
"source": "functions",
5+
"codebase": "default",
6+
"ignore": [
7+
"venv"
8+
]
9+
}
10+
]
11+
}

samples/basic_db/functions/.gitignore

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# pyenv
2+
.python-version
3+
4+
# Installer logs
5+
pip-log.txt
6+
pip-delete-this-directory.txt
7+
8+
# Environments
9+
.env
10+
.venv
11+
venv/
12+
venv.bak/
13+
__pycache__

samples/basic_db/functions/main.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
Example Firebase Functions for RTDB written in Python
3+
"""
4+
from firebase_functions import db_fn, options
5+
from firebase_admin import initialize_app
6+
7+
initialize_app()
8+
9+
options.set_global_options(region=options.SupportedRegion.EUROPE_WEST1)
10+
11+
12+
@db_fn.on_value_written(reference="hello/world")
13+
def onwriteexample(event: db_fn.Event[db_fn.Change]) -> None:
14+
print("Hello from db write event:", event)
15+
16+
17+
@db_fn.on_value_created(reference="hello/world")
18+
def oncreatedexample(event: db_fn.Event) -> None:
19+
print("Hello from db create event:", event)
20+
21+
22+
@db_fn.on_value_deleted(reference="hello/world")
23+
def ondeletedexample(event: db_fn.Event) -> None:
24+
print("Hello from db delete event:", event)
25+
26+
27+
@db_fn.on_value_updated(reference="hello/world")
28+
def onupdatedexample(event: db_fn.Event[db_fn.Change]) -> None:
29+
print("Hello from db updated event:", event)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Not published yet,
2+
# firebase-functions-python >= 0.0.1
3+
# so we use a relative path during development:
4+
./../../../
5+
# Or switch to git ref for deployment testing:
6+
# git+https://github.com/firebase/firebase-functions-python.git@main#egg=firebase-functions
7+
8+
firebase-admin >= 6.0.1

src/firebase_functions/db_fn.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,19 @@ class Event(_core.CloudEvent[_core.T]):
9090

9191
def _db_endpoint_handler(
9292
func: _C1 | _C2,
93+
event_type: str,
9394
raw: _ce.CloudEvent,
9495
) -> None:
9596
event_attributes = raw._get_attributes()
9697
event_data: _typing.Any = raw.get_data()
9798
# TODO Params are built locally via path pattern which is currently unimplemented
9899
params: dict[str, str] = {}
99-
database_event_data = event_data["data"]
100-
if "delta" in event_data:
100+
database_event_data = event_data
101+
if event_type == _event_type_deleted:
102+
database_event_data = database_event_data["data"]
103+
if event_type == _event_type_created:
104+
database_event_data = database_event_data["delta"]
105+
if event_type in (_event_type_written, _event_type_updated):
101106
before = event_data["data"]
102107
after = event_data["delta"]
103108
# Merge delta into data to generate an 'after' view of the data.
@@ -153,7 +158,7 @@ def on_value_written_inner_decorator(func: _C1):
153158

154159
@_functools.wraps(func)
155160
def on_value_written_wrapped(raw: _ce.CloudEvent):
156-
return _db_endpoint_handler(func, raw)
161+
return _db_endpoint_handler(func, _event_type_written, raw)
157162

158163
_util.set_func_endpoint_attr(
159164
on_value_written_wrapped,
@@ -191,7 +196,7 @@ def on_value_updated_inner_decorator(func: _C1):
191196

192197
@_functools.wraps(func)
193198
def on_value_updated_wrapped(raw: _ce.CloudEvent):
194-
return _db_endpoint_handler(func, raw)
199+
return _db_endpoint_handler(func, _event_type_updated, raw)
195200

196201
_util.set_func_endpoint_attr(
197202
on_value_updated_wrapped,
@@ -229,7 +234,7 @@ def on_value_created_inner_decorator(func: _C2):
229234

230235
@_functools.wraps(func)
231236
def on_value_created_wrapped(raw: _ce.CloudEvent):
232-
return _db_endpoint_handler(func, raw)
237+
return _db_endpoint_handler(func, _event_type_created, raw)
233238

234239
_util.set_func_endpoint_attr(
235240
on_value_created_wrapped,
@@ -267,7 +272,7 @@ def on_value_deleted_inner_decorator(func: _C2):
267272

268273
@_functools.wraps(func)
269274
def on_value_deleted_wrapped(raw: _ce.CloudEvent):
270-
return _db_endpoint_handler(func, raw)
275+
return _db_endpoint_handler(func, _event_type_deleted, raw)
271276

272277
_util.set_func_endpoint_attr(
273278
on_value_deleted_wrapped,

0 commit comments

Comments
 (0)