22
33from 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+ )
610from time_tracker_api .database import CRUDDao , APICosmosDBDao
11+ from typing import List , Callable
12+ from commons .data_access_layer .database import EventContext
713
814
915class 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