Skip to content

Commit 0fbfe4c

Browse files
author
EliuX
committed
fix: Refactor codebase related to EventContext #101
1 parent 253ba3d commit 0fbfe4c

File tree

11 files changed

+115
-48
lines changed

11 files changed

+115
-48
lines changed

.DS_Store

0 Bytes
Binary file not shown.

commons/data_access_layer/cosmos_db.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,8 @@ def delete(self, id):
265265
event_ctx = self.create_event_context("delete")
266266
self.repository.delete(id, event_ctx)
267267

268-
@property
269-
def find_partition_key_value(self, event_context: EventContext):
270-
return event_context.tenant_id
271-
272-
# Replace by decorator and put it in the repository
273268
def create_event_context(self, action: str = None, description: str = None):
274-
return EventContext(self.repository.container.id,
275-
action,
269+
return EventContext(self.repository.container.id, action,
276270
description=description)
277271

278272

commons/data_access_layer/database.py

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@
77
"""
88
import abc
99

10-
from flask import Flask
11-
12-
from time_tracker_api.security import current_user_id, current_user_tenant_id
13-
1410
COMMENTS_MAX_LENGTH = 500
1511
ID_MAX_LENGTH = 64
1612

@@ -37,42 +33,36 @@ def delete(self, id):
3733
raise NotImplementedError # pragma: no cover
3834

3935

40-
class EventContext:
36+
class EventContext():
4137
def __init__(self, container_id: str, action: str, description: str = None,
4238
user_id: str = None, tenant_id: str = None, session_id: str = None):
43-
self.container_id = container_id
44-
self.action = action
45-
self.description = description
39+
self._container_id = container_id
40+
self._action = action
41+
self._description = description
4642
self._user_id = user_id
4743
self._tenant_id = tenant_id
4844
self._session_id = session_id
4945

5046
@property
51-
def user_id(self) -> str:
52-
if self._user_id is None:
53-
self._user_id = current_user_id()
54-
return self._user_id
47+
def container_id(self):
48+
return self._container_id
5549

5650
@property
57-
def tenant_id(self) -> str:
58-
if self._tenant_id is None:
59-
self._tenant_id = current_user_tenant_id()
60-
return self._tenant_id
51+
def action(self):
52+
return self._action
6153

6254
@property
63-
def session_id(self) -> str:
64-
return self._session_id
65-
66-
67-
def init_app(app: Flask) -> None:
68-
init_cosmos_db(app)
55+
def description(self):
56+
return self._description
6957

58+
@property
59+
def user_id(self):
60+
return self._user_id
7061

71-
def init_sql(app: Flask) -> None:
72-
from commons.data_access_layer.sql import init_app
73-
init_app(app)
74-
62+
@property
63+
def tenant_id(self):
64+
return self._tenant_id
7565

76-
def init_cosmos_db(app: Flask) -> None:
77-
from commons.data_access_layer.cosmos_db import init_app
78-
init_app(app)
66+
@property
67+
def session_id(self):
68+
return self._session_id

tests/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from flask.testing import FlaskClient
88

99
from commons.data_access_layer.cosmos_db import CosmosDBRepository, CosmosDBDao
10-
from commons.data_access_layer.database import init_sql, EventContext
10+
from time_tracker_api.database import init_sql
11+
from commons.data_access_layer.database import EventContext
1112
from time_tracker_api import create_app
1213
from time_tracker_api.security import get_or_generate_dev_secret_key
1314
from time_tracker_api.time_entries.time_entries_model import TimeEntryCosmosDBRepository

time_tracker_api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def init_app_config(app: Flask, config_path: str, config_data: dict = None):
3535

3636

3737
def init_app(app: Flask):
38-
from commons.data_access_layer.database import init_app as init_database
38+
from time_tracker_api.database import init_app as init_database
3939
init_database(app)
4040

4141
from time_tracker_api.api import init_app

time_tracker_api/activities/activities_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from azure.cosmos import PartitionKey
44

55
from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
6-
from commons.data_access_layer.database import CRUDDao
6+
from time_tracker_api.database import CRUDDao, APICosmosDBDao
77

88

99
class ActivityDao(CRUDDao):
@@ -43,7 +43,7 @@ def create_dao() -> ActivityDao:
4343
repository = CosmosDBRepository.from_definition(container_definition,
4444
mapper=ActivityCosmosDBModel)
4545

46-
class ActivityCosmosDBDao(CosmosDBDao, ActivityDao):
46+
class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
4747
def __init__(self):
4848
CosmosDBDao.__init__(self, repository)
4949

time_tracker_api/customers/customers_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from azure.cosmos import PartitionKey
44

55
from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBRepository, CosmosDBDao
6-
from commons.data_access_layer.database import CRUDDao
6+
from time_tracker_api.database import CRUDDao, APICosmosDBDao
77

88

99
class CustomerDao(CRUDDao):
@@ -43,7 +43,7 @@ def create_dao() -> CustomerDao:
4343
repository = CosmosDBRepository.from_definition(container_definition,
4444
mapper=CustomerCosmosDBModel)
4545

46-
class CustomerCosmosDBDao(CosmosDBDao, CustomerDao):
46+
class CustomerCosmosDBDao(APICosmosDBDao, CustomerDao):
4747
def __init__(self):
4848
CosmosDBDao.__init__(self, repository)
4949

time_tracker_api/database.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
"""
2+
Agnostic database assets
3+
4+
Put here your utils and class independent of
5+
the database solution.
6+
To know more about protocols and subtyping check out PEP-0544
7+
"""
8+
import abc
9+
10+
from flask import Flask
11+
12+
from commons.data_access_layer.cosmos_db import CosmosDBDao
13+
from commons.data_access_layer.database import EventContext
14+
from time_tracker_api.security import current_user_id, current_user_tenant_id
15+
16+
17+
class CRUDDao(abc.ABC):
18+
@abc.abstractmethod
19+
def get_all(self, conditions: dict):
20+
raise NotImplementedError # pragma: no cover
21+
22+
@abc.abstractmethod
23+
def get(self, id):
24+
raise NotImplementedError # pragma: no cover
25+
26+
@abc.abstractmethod
27+
def create(self, project):
28+
raise NotImplementedError # pragma: no cover
29+
30+
@abc.abstractmethod
31+
def update(self, id, data):
32+
raise NotImplementedError # pragma: no cover
33+
34+
@abc.abstractmethod
35+
def delete(self, id):
36+
raise NotImplementedError # pragma: no cover
37+
38+
39+
class ApiEventContext(EventContext):
40+
def __init__(self, container_id: str, action: str, description: str = None,
41+
user_id: str = None, tenant_id: str = None, session_id: str = None):
42+
super(ApiEventContext, self).__init__(container_id, action, description)
43+
self._user_id = user_id
44+
self._tenant_id = tenant_id
45+
self._session_id = session_id
46+
47+
@property
48+
def user_id(self) -> str:
49+
if self._user_id is None:
50+
self._user_id = current_user_id()
51+
return self._user_id
52+
53+
@property
54+
def tenant_id(self) -> str:
55+
if self._tenant_id is None:
56+
self._tenant_id = current_user_tenant_id()
57+
return self._tenant_id
58+
59+
@property
60+
def session_id(self) -> str:
61+
return self._session_id
62+
63+
64+
class APICosmosDBDao(CosmosDBDao):
65+
def create_event_context(self, action: str = None, description: str = None):
66+
return ApiEventContext(self.repository.container.id, action,
67+
description=description)
68+
69+
70+
def init_app(app: Flask) -> None:
71+
init_cosmos_db(app)
72+
73+
74+
def init_sql(app: Flask) -> None:
75+
from commons.data_access_layer.sql import init_app
76+
init_app(app)
77+
78+
79+
def init_cosmos_db(app: Flask) -> None:
80+
from commons.data_access_layer.cosmos_db import init_app
81+
init_app(app)

time_tracker_api/project_types/project_types_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from azure.cosmos import PartitionKey
44

55
from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
6-
from commons.data_access_layer.database import CRUDDao
6+
from time_tracker_api.database import CRUDDao, APICosmosDBDao
77

88

99
class ProjectTypeDao(CRUDDao):
@@ -45,7 +45,7 @@ def create_dao() -> ProjectTypeDao:
4545
repository = CosmosDBRepository.from_definition(container_definition,
4646
mapper=ProjectTypeCosmosDBModel)
4747

48-
class ProjectTypeCosmosDBDao(CosmosDBDao, ProjectTypeDao):
48+
class ProjectTypeCosmosDBDao(APICosmosDBDao, ProjectTypeDao):
4949
def __init__(self):
5050
CosmosDBDao.__init__(self, repository)
5151

time_tracker_api/projects/projects_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from azure.cosmos import PartitionKey
44

55
from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
6-
from commons.data_access_layer.database import CRUDDao
6+
from time_tracker_api.database import CRUDDao, APICosmosDBDao
77

88

99
class ProjectDao(CRUDDao):
@@ -45,7 +45,7 @@ def create_dao() -> ProjectDao:
4545
repository = CosmosDBRepository.from_definition(container_definition,
4646
mapper=ProjectCosmosDBModel)
4747

48-
class ProjectCosmosDBDao(CosmosDBDao, ProjectDao):
48+
class ProjectCosmosDBDao(APICosmosDBDao, ProjectDao):
4949
def __init__(self):
5050
CosmosDBDao.__init__(self, repository)
5151

0 commit comments

Comments
 (0)