Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
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
13 changes: 9 additions & 4 deletions app/container.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from app.services.entity.supplier_ignored_directory_service import SupplierIgnoredDirectoryService
from app.services.entity.supplier_info_service import SupplierInfoService
from app.services.fhir.fhir_service import FhirService
from app.services.supplier_provider.factory import SupplierProviderFactory
from app.services.supplier_provider.supplier_provider import SupplierProvider
from app.services.update.mass_update_consumer_service import MassUpdateConsumerService
Expand All @@ -9,6 +10,7 @@
from app.config import get_config
from app.services.entity.resource_map_service import ResourceMapService
from app.services.api.authenticators.factory import AuthenticatorFactory
from app.services.update.new_service import DataPreparationService
from app.services.update.update_consumer_service import UpdateConsumerService
from typing import cast

Expand All @@ -31,7 +33,9 @@ def container_config(binder: inject.Binder) -> None:
supplier_provider_factory = SupplierProviderFactory(config=config, database=db, auth=auth)
supplier_provider = supplier_provider_factory.create()
binder.bind(SupplierProvider, supplier_provider)


new_service = DataPreparationService(fhir_service=FhirService(config.mcsd.strict_validation))

update_service = UpdateConsumerService(
consumer_url=config.mcsd.consumer_url,
strict_validation=config.mcsd.strict_validation,
Expand All @@ -40,14 +44,15 @@ def container_config(binder: inject.Binder) -> None:
request_count=config.mcsd.request_count,
resource_map_service=resource_map_service,
auth=auth,
new_service=new_service
)
binder.bind(UpdateConsumerService, update_service)

supplier_ignored_directory_service = SupplierIgnoredDirectoryService(db)
binder.bind(SupplierIgnoredDirectoryService, supplier_ignored_directory_service)

supplier_info_service = SupplierInfoService(
db,
db,
supplier_stale_timeout_seconds=config.scheduler.supplier_stale_timeout_in_sec, # type: ignore
)
binder.bind(SupplierInfoService, supplier_info_service)
Expand All @@ -61,7 +66,7 @@ def container_config(binder: inject.Binder) -> None:
cleanup_client_directory_after_success_timeout_seconds=config.scheduler.cleanup_client_directory_after_success_timeout_in_sec, # type: ignore
stats=get_stats(),
)


update_scheduler = Scheduler(
function=update_all_service.update_all,
Expand Down
54 changes: 0 additions & 54 deletions app/cron.py

This file was deleted.

4 changes: 2 additions & 2 deletions app/models/adjacency/adjacency_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def get_group(self, node: Node) -> List[Node]:

while queue:
current = queue.popleft()
for ref in current.supplier_data.references:
for ref in current.references:
sibling = self.data[ref.id]
if sibling.visited is False:
sibling.visited = True
Expand All @@ -43,7 +43,7 @@ def get_group(self, node: Node) -> List[Node]:
def get_missing_refs(self) -> List[NodeReference]:
refs = list(
chain.from_iterable(
[node.supplier_data.references for node in self.data.values()]
[node.references for node in self.data.values()]
)
)
return list(filter(self._ref_in_ajd_map, refs))
Expand Down
176 changes: 6 additions & 170 deletions app/models/adjacency/node.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import copy
from typing import List, Literal
from fhir.resources.R4B.domainresource import DomainResource
from pydantic import BaseModel, computed_field
from fhir.resources.R4B.bundle import BundleEntry, BundleEntryRequest
from typing import List
from pydantic import BaseModel
from fhir.resources.R4B.bundle import BundleEntry

from app.models.fhir.types import HttpValidVerbs
from app.models.resource_map.dto import ResourceMapDto, ResourceMapUpdateDto
from app.services.fhir.references.reference_namespacer import (
namespace_resource_reference,
)


class NodeReference(BaseModel):
Expand All @@ -20,41 +14,6 @@ def namespace_id(self, namespace: str) -> None:
self.id = new_id


class SupplierNodeData(BaseModel):
supplier_id: str
references: List[NodeReference]
method: HttpValidVerbs
entry: BundleEntry

@computed_field # type: ignore
@property
def hash_value(self) -> int | None:
if self.entry.resource is None:
return None

resource = copy.deepcopy(self.entry.resource)
namespace_resource_reference(resource, self.supplier_id)
resource.meta = None
resource.id = None

return hash(resource.model_dump().__repr__())


class ConsumerNodeData(BaseModel):
resource: DomainResource | None

@computed_field # type: ignore
@property
def hash_value(self) -> int | None:
if self.resource is None:
return None

res = copy.deepcopy(self.resource)
res.meta = None
res.id = None
return hash(res.model_dump().__repr__())


class NodeUpdateData(BaseModel):
bundle_entry: BundleEntry | None = None
resource_map_dto: ResourceMapDto | ResourceMapUpdateDto | None = None
Expand All @@ -65,131 +24,8 @@ class Node(BaseModel):
resource_type: str
visited: bool = False
updated: bool = False
supplier_data: SupplierNodeData
consumer_data: ConsumerNodeData
resource_map: ResourceMapDto | ResourceMapUpdateDto | None = None

@computed_field # type: ignore
@property
def update_status(
self,
) -> Literal["ignore", "equal", "delete", "update", "new"]:

if (
self.supplier_data.method == "DELETE"
and self.consumer_data.resource is None
):
return "ignore"

if (
self.supplier_data.method != "DELETE"
and self.supplier_data.hash_value
and self.consumer_data.hash_value
and self.supplier_data.hash_value == self.consumer_data.hash_value
):
return "equal"

if (
self.supplier_data.method == "DELETE"
and self.consumer_data.resource is not None
):
return "delete"

if (
self.supplier_data.method != "DELETE"
and self.supplier_data.hash_value is not None
and self.consumer_data.hash_value is None
and self.resource_map is None
):
return "new"

return "update"

@computed_field # type: ignore
@property
def update_data(self) -> NodeUpdateData | None:
consumer_resource_id = f"{self.supplier_data.supplier_id}-{self.resource_id}"
url = f"{self.resource_type}/{consumer_resource_id}"
dto: ResourceMapDto | ResourceMapUpdateDto | None = None
match self.update_status:
case "ignore":
return None

case "equal":
return None

case "delete":
entry = BundleEntry.model_construct()
entry_request = BundleEntryRequest.model_construct(
method="DELETE", url=url
)
entry.request = entry_request

if self.resource_map is None:
raise Exception(
f"Resource map for {self.resource_id} {self.resource_type} cannot be None and marked as delete "
)

dto = ResourceMapUpdateDto(
history_size=self.resource_map.history_size + 1,
supplier_id=self.supplier_data.supplier_id,
resource_type=self.resource_type,
supplier_resource_id=self.resource_id,
)

return NodeUpdateData(bundle_entry=entry, resource_map_dto=dto)

case "new":
entry = BundleEntry.model_construct()
entry_request = BundleEntryRequest.model_construct(
method="PUT", url=url
)
resource = copy.deepcopy(self.supplier_data.entry.resource)
if resource is None:
raise Exception(
f"Resource {self.resource_id} {self.resource_type} cannot be None when a node is marked `new`"
)
namespace_resource_reference(resource, self.supplier_data.supplier_id)
resource.id = consumer_resource_id
entry.resource = resource
entry.request = entry_request

dto = ResourceMapDto(
supplier_id=self.supplier_data.supplier_id,
supplier_resource_id=self.resource_id,
consumer_resource_id=consumer_resource_id,
resource_type=self.resource_type,
history_size=1,
)

return NodeUpdateData(bundle_entry=entry, resource_map_dto=dto)

case "update":
entry = BundleEntry.model_construct()
entry_request = BundleEntryRequest.model_construct(
method="PUT", url=url
)
resource = copy.deepcopy(self.supplier_data.entry.resource)
if resource is None:
raise Exception(
f"Resource {self.resource_id} {self.resource_type} cannot be None and node marked as `update`"
)

namespace_resource_reference(resource, self.supplier_data.supplier_id)
resource.id = consumer_resource_id
entry.request = entry_request
entry.resource = resource

if self.resource_map is None:
raise Exception(
f"Resource map for {self.resource_id} {self.resource_type} cannot be None and marked as `update`"
)

dto = ResourceMapUpdateDto(
supplier_id=self.supplier_data.supplier_id,
supplier_resource_id=self.resource_id,
resource_type=self.resource_type,
history_size=self.resource_map.history_size + 1,
)
references: List[NodeReference]

return NodeUpdateData(bundle_entry=entry, resource_map_dto=dto)
existing_resource_map: ResourceMapDto | ResourceMapUpdateDto | None = None
supplier_bundle_entry: BundleEntry
Loading
Loading