Skip to content

Commit 81800a6

Browse files
authored
Merge pull request #324 from mapswipe/delete-project
Check if Firebase reference path is a valid one before deletion.
2 parents 55d4868 + e260340 commit 81800a6

File tree

2 files changed

+65
-19
lines changed

2 files changed

+65
-19
lines changed

mapswipe_workers/mapswipe_workers/firebase_to_postgres/archive_project.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
"""
22
Archive a project.
33
"""
4-
4+
import re
55
from typing import Iterable
66

77
from firebase_admin import exceptions
88

99
from mapswipe_workers import auth
10-
from mapswipe_workers.definitions import logger
10+
from mapswipe_workers.definitions import logger, CustomError
1111

1212

1313
def chunks(data: list, size: int = 250) -> Iterable[list]:
1414
"""Yield successive n-sized chunks from list."""
1515
for i in range(0, len(data), size):
16-
yield data[i : i + size]
16+
yield data[i : i + size] # noqa E203
1717

1818

1919
def archive_project(project_ids: list) -> None:
@@ -28,6 +28,11 @@ def archive_project(project_ids: list) -> None:
2828

2929
fb_db = auth.firebaseDB()
3030
ref = fb_db.reference(f"v2/results/{project_id}")
31+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
32+
raise CustomError(
33+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
34+
{ref.path}"""
35+
)
3136
try:
3237
ref.delete()
3338
except exceptions.InvalidArgumentError:
@@ -38,7 +43,12 @@ def archive_project(project_ids: list) -> None:
3843
ref.update({key: None for key in chunk})
3944
ref.delete()
4045

41-
ref = fb_db.reference(f"v2/results/{project_id}")
46+
ref = fb_db.reference(f"v2/tasks/{project_id}")
47+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
48+
raise CustomError(
49+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
50+
{ref.path}"""
51+
)
4252
try:
4353
ref.delete()
4454
except exceptions.InvalidArgumentError:
@@ -49,7 +59,22 @@ def archive_project(project_ids: list) -> None:
4959
ref.update({key: None for key in chunk})
5060
ref.delete()
5161

52-
fb_db.reference(f"v2/groups/{project_id}").delete()
62+
ref = fb_db.reference(f"v2/groups/{project_id}")
63+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
64+
raise CustomError(
65+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
66+
{ref.path}"""
67+
)
68+
ref.delete()
69+
70+
ref = fb_db.reference(f"v2/groups/{project_id}")
71+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
72+
raise CustomError(
73+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
74+
{ref.path}"""
75+
)
76+
ref.delete()
77+
5378
fb_db.reference(f"v2/projects/{project_id}/status").set("archived")
5479

5580
pg_db = auth.postgresDB()
Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
"""
22
Delete projects.
33
"""
4-
4+
import re
55
from typing import Iterable
66

77
from firebase_admin import exceptions
88

99
from mapswipe_workers import auth
10-
from mapswipe_workers.definitions import logger
10+
from mapswipe_workers.definitions import logger, CustomError
1111

1212

1313
def chunks(data: list, size: int = 250) -> Iterable[list]:
1414
"""Yield successive n-sized chunks from list."""
1515
for i in range(0, len(data), size):
16-
yield data[i : i + size]
16+
yield data[i : i + size] # noqa E203
1717

1818

1919
def delete_project(project_ids: list) -> None:
@@ -26,8 +26,12 @@ def delete_project(project_ids: list) -> None:
2626
)
2727

2828
fb_db = auth.firebaseDB()
29-
3029
ref = fb_db.reference(f"v2/results/{project_id}")
30+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
31+
raise CustomError(
32+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
33+
{ref.path}"""
34+
)
3135
try:
3236
ref.delete()
3337
except exceptions.InvalidArgumentError:
@@ -39,6 +43,11 @@ def delete_project(project_ids: list) -> None:
3943
ref.delete()
4044

4145
ref = fb_db.reference(f"v2/tasks/{project_id}")
46+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
47+
raise CustomError(
48+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
49+
{ref.path}"""
50+
)
4251
try:
4352
ref.delete()
4453
except exceptions.InvalidArgumentError:
@@ -49,17 +58,29 @@ def delete_project(project_ids: list) -> None:
4958
ref.update({key: None for key in chunk})
5059
ref.delete()
5160

52-
fb_db.reference(f"v2/groups/{project_id}").delete()
53-
fb_db.reference(f"v2/projects/{project_id}").delete()
61+
ref = fb_db.reference(f"v2/groups/{project_id}")
62+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
63+
raise CustomError(
64+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
65+
{ref.path}"""
66+
)
67+
ref.delete()
68+
ref = fb_db.reference(f"v2/projects/{project_id}")
69+
if not re.match(r"/v2/\w+/[-a-zA-Z0-9]+", ref.path):
70+
raise CustomError(
71+
f"""Given argument resulted in invalid Firebase Realtime Database reference.
72+
{ref.path}"""
73+
)
74+
ref.delete()
5475

5576
pg_db = auth.postgresDB()
56-
sql_query = "DELETE FROM results WHERE project_id = {};".format(project_id)
57-
pg_db.query(sql_query, project_id)
58-
sql_query = "DELETE FROM tasks WHERE project_id = {};".format(project_id)
59-
pg_db.query(sql_query, project_id)
60-
sql_query = "DELETE FROM groups WHERE project_id = {};".format(project_id)
61-
pg_db.query(sql_query, project_id)
62-
sql_query = "DELETE FROM projects WHERE project_id = {};".format(project_id)
63-
pg_db.query(sql_query, project_id)
77+
sql_query = "DELETE FROM results WHERE project_id = %(project_id)s;"
78+
pg_db.query(sql_query, {"project_id": project_id})
79+
sql_query = "DELETE FROM tasks WHERE project_id = %(project_id)s;"
80+
pg_db.query(sql_query, {"project_id": project_id})
81+
sql_query = "DELETE FROM groups WHERE project_id = %(project_id)s;"
82+
pg_db.query(sql_query, {"project_id": project_id})
83+
sql_query = "DELETE FROM projects WHERE project_id = %(project_id)s;"
84+
pg_db.query(sql_query, {"project_id": project_id})
6485

6586
return True

0 commit comments

Comments
 (0)