Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
refactor: TT-180 add methods find_all_with_id_in_list and get_all_wit…
…h_id_in_list in ActivityCosmosDB
  • Loading branch information
kellycastrof committed Mar 13, 2021
commit c56d070107456e4aa1c2a6e29b36eb2ef7646ad1
88 changes: 79 additions & 9 deletions time_tracker_api/activities/activities_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,14 @@

from azure.cosmos import PartitionKey

from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
from commons.data_access_layer.cosmos_db import (
CosmosDBModel,
CosmosDBDao,
CosmosDBRepository,
)
from time_tracker_api.database import CRUDDao, APICosmosDBDao
from typing import List, Callable
from commons.data_access_layer.database import EventContext


class ActivityDao(CRUDDao):
Expand All @@ -17,7 +23,7 @@ class ActivityDao(CRUDDao):
'uniqueKeys': [
{'paths': ['/name', '/deleted']},
]
}
},
}


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


def create_dao() -> ActivityDao:
repository = CosmosDBRepository.from_definition(container_definition,
mapper=ActivityCosmosDBModel)
class ActivityCosmosDBRepository(CosmosDBRepository):
def __init__(self):
CosmosDBRepository.__init__(
self,
container_id=container_definition['id'],
partition_key_attribute='tenant_id',
mapper=ActivityCosmosDBModel,
)

def create_sql_in_condition(self, id_list):
id_values = self.convert_list_to_tuple_or_string(id_list)

return "c.id IN {value_condition}".format(value_condition=id_values)

def convert_list_to_tuple_or_string(self, id_list):
self.validate_list(id_list)
id_value = (
'("%s")' % id_list[0] if len(id_list) == 1 else tuple(id_list)
)

return id_value

def validate_list(self, id_list):
assert isinstance(id_list, list)
assert len(id_list) > 0

def find_all_with_id_in_list(
self,
event_context: EventContext,
id_list: List[str],
visible_only=True,
mapper: Callable = None,
):
visibility = self.create_sql_condition_for_visibility(visible_only)
query_str = """
SELECT * FROM c
WHERE {condition}
{visibility_condition}
""".format(
condition=self.create_sql_in_condition(id_list),
visibility_condition=visibility,
)

class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
def __init__(self):
CosmosDBDao.__init__(self, repository)
tenant_id_value = self.find_partition_key_value(event_context)
result = self.container.query_items(
query=query_str,
partition_key=tenant_id_value,
)

function_mapper = self.get_mapper_or_dict(mapper)
return list(map(function_mapper, result))


class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
def __init__(self, repository):
CosmosDBDao.__init__(self, repository)

def get_all_with_id_in_list(
self,
id_list,
):
event_ctx = self.create_event_context("read-many")
activities_list = self.repository.find_all_with_id_in_list(
event_ctx,
id_list,
)
return activities_list


def create_dao() -> ActivityDao:
repository = ActivityCosmosDBRepository()

return ActivityCosmosDBDao()
return ActivityCosmosDBDao(repository)