Skip to content

Commit c56d070

Browse files
committed
refactor: TT-180 add methods find_all_with_id_in_list and get_all_with_id_in_list in ActivityCosmosDB
1 parent 14c82d0 commit c56d070

File tree

1 file changed

+79
-9
lines changed

1 file changed

+79
-9
lines changed

time_tracker_api/activities/activities_model.py

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
from azure.cosmos import PartitionKey
44

5-
from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
5+
from commons.data_access_layer.cosmos_db import (
6+
CosmosDBModel,
7+
CosmosDBDao,
8+
CosmosDBRepository,
9+
)
610
from time_tracker_api.database import CRUDDao, APICosmosDBDao
11+
from typing import List, Callable
12+
from commons.data_access_layer.database import EventContext
713

814

915
class ActivityDao(CRUDDao):
@@ -17,7 +23,7 @@ class ActivityDao(CRUDDao):
1723
'uniqueKeys': [
1824
{'paths': ['/name', '/deleted']},
1925
]
20-
}
26+
},
2127
}
2228

2329

@@ -39,12 +45,76 @@ def __str___(self):
3945
return "the activity \"%s\"" % self.name # pragma: no cover
4046

4147

42-
def create_dao() -> ActivityDao:
43-
repository = CosmosDBRepository.from_definition(container_definition,
44-
mapper=ActivityCosmosDBModel)
48+
class ActivityCosmosDBRepository(CosmosDBRepository):
49+
def __init__(self):
50+
CosmosDBRepository.__init__(
51+
self,
52+
container_id=container_definition['id'],
53+
partition_key_attribute='tenant_id',
54+
mapper=ActivityCosmosDBModel,
55+
)
56+
57+
def create_sql_in_condition(self, id_list):
58+
id_values = self.convert_list_to_tuple_or_string(id_list)
59+
60+
return "c.id IN {value_condition}".format(value_condition=id_values)
61+
62+
def convert_list_to_tuple_or_string(self, id_list):
63+
self.validate_list(id_list)
64+
id_value = (
65+
'("%s")' % id_list[0] if len(id_list) == 1 else tuple(id_list)
66+
)
67+
68+
return id_value
69+
70+
def validate_list(self, id_list):
71+
assert isinstance(id_list, list)
72+
assert len(id_list) > 0
73+
74+
def find_all_with_id_in_list(
75+
self,
76+
event_context: EventContext,
77+
id_list: List[str],
78+
visible_only=True,
79+
mapper: Callable = None,
80+
):
81+
visibility = self.create_sql_condition_for_visibility(visible_only)
82+
query_str = """
83+
SELECT * FROM c
84+
WHERE {condition}
85+
{visibility_condition}
86+
""".format(
87+
condition=self.create_sql_in_condition(id_list),
88+
visibility_condition=visibility,
89+
)
4590

46-
class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
47-
def __init__(self):
48-
CosmosDBDao.__init__(self, repository)
91+
tenant_id_value = self.find_partition_key_value(event_context)
92+
result = self.container.query_items(
93+
query=query_str,
94+
partition_key=tenant_id_value,
95+
)
96+
97+
function_mapper = self.get_mapper_or_dict(mapper)
98+
return list(map(function_mapper, result))
99+
100+
101+
class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
102+
def __init__(self, repository):
103+
CosmosDBDao.__init__(self, repository)
104+
105+
def get_all_with_id_in_list(
106+
self,
107+
id_list,
108+
):
109+
event_ctx = self.create_event_context("read-many")
110+
activities_list = self.repository.find_all_with_id_in_list(
111+
event_ctx,
112+
id_list,
113+
)
114+
return activities_list
115+
116+
117+
def create_dao() -> ActivityDao:
118+
repository = ActivityCosmosDBRepository()
49119

50-
return ActivityCosmosDBDao()
120+
return ActivityCosmosDBDao(repository)

0 commit comments

Comments
 (0)