Commit 3d12574f by Oleksandr Barabash

multitenant support added

parent a2a4236e
...@@ -83,13 +83,13 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler): ...@@ -83,13 +83,13 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler):
# reset parameters # reset parameters
notification.id = uuid.uuid4().__str__() notification.id = uuid.uuid4().__str__()
notification.tenant_id = AppConfig.TENANT_ID notification.tenant_id = notification.tenant_id or AppConfig.TENANT_ID
async def routine(): async def routine():
""" async routine """ """ async routine """
try: try:
reference = await self.cosmos_client.get_conversation( reference = await self.cosmos_client.get_conversation(
notification.destination notification
) )
except ItemNotFound: except ItemNotFound:
future.set_exception(ConversationNotFound("not found")) future.set_exception(ConversationNotFound("not found"))
...@@ -142,12 +142,13 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler): ...@@ -142,12 +142,13 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler):
try: try:
account = turn_context.activity.from_property account = turn_context.activity.from_property
acks = await self.cosmos_client.get_acknowledge_items( acks = await self.cosmos_client.get_acknowledge_items(
mx.notification_id mx.notification_id, mx.tenant_id
) )
if len(acks) > 0: if len(acks) > 0:
return return
await self.cosmos_client.create_acknowledge(mx.notification_id, await self.cosmos_client.create_acknowledge(mx.notification_id,
mx.tenant_id,
account) account)
notification = await self.cosmos_client.get_notification( notification = await self.cosmos_client.get_notification(
mx.notification_id mx.notification_id
...@@ -186,12 +187,12 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler): ...@@ -186,12 +187,12 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler):
return await self.on_mx_task_default(turn_context) return await self.on_mx_task_default(turn_context)
async def on_mx_task_notification_url(self, turn_context: TurnContext, async def on_mx_task_notification_url(self, turn_context: TurnContext,
notification_id: str) \ mx: MedX) -> TaskModuleResponse:
-> TaskModuleResponse:
""" On MX Task fetch Notification URL """ """ On MX Task fetch Notification URL """
try: try:
notification = await self.cosmos_client.get_notification( notification = await self.cosmos_client.get_notification(
notification_id=notification_id notification_id=mx.notification_id,
tenant_id=mx.tenant_id or AppConfig.TENANT_ID
) )
link = notification.url.link link = notification.url.link
if link is not None: if link is not None:
...@@ -238,8 +239,6 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler): ...@@ -238,8 +239,6 @@ class TeamsMessagingExtensionsActionPreviewBot(TeamsActivityHandler):
# 1. save action to DB # 1. save action to DB
# 2. return URL # 2. return URL
initiator = turn_context.activity.from_property.name initiator = turn_context.activity.from_property.name
await self.cosmos_client.create_initiation(initiator, await self.cosmos_client.create_initiation(initiator, mx)
mx.notification_id) return await self.on_mx_task_notification_url(turn_context, mx)
return await self.on_mx_task_notification_url(turn_context,
mx.notification_id)
return await self.on_mx_task_default(turn_context) return await self.on_mx_task_default(turn_context)
...@@ -8,6 +8,7 @@ class AcknowledgeSchema(CamelCaseSchema): ...@@ -8,6 +8,7 @@ class AcknowledgeSchema(CamelCaseSchema):
""" Notification Schema """ """ Notification Schema """
id = fields.String(required=True, allow_none=True) # database message id id = fields.String(required=True, allow_none=True) # database message id
notification_id = fields.String(required=True) notification_id = fields.String(required=True)
tenant_id = fields.String(required=True)
username = fields.String(required=True) username = fields.String(required=True)
user_aad_id = fields.String(required=True) user_aad_id = fields.String(required=True)
timestamp = fields.Integer(required=True) timestamp = fields.Integer(required=True)
...@@ -11,5 +11,6 @@ class Initiation(CamelCaseMixin): ...@@ -11,5 +11,6 @@ class Initiation(CamelCaseMixin):
""" Notification Dataclass """ """ Notification Dataclass """
initiator: str # User name initiator: str # User name
notification_id: str # Notification ID notification_id: str # Notification ID
tenant_id: str # Tenant ID
timestamp: Optional[int] = field(default=None) timestamp: Optional[int] = field(default=None)
id: Optional[str] = field(default=None) # Unique Initiation ID id: Optional[str] = field(default=None) # Unique Initiation ID
...@@ -21,3 +21,4 @@ class MedX(CamelCaseMixin): ...@@ -21,3 +21,4 @@ class MedX(CamelCaseMixin):
""" MedX data """ """ MedX data """
type: str type: str
notification_id: Optional[str] notification_id: Optional[str]
tenant_id: Optional[str]
...@@ -24,6 +24,7 @@ class Notification(CamelCaseMixin): ...@@ -24,6 +24,7 @@ class Notification(CamelCaseMixin):
title: Optional[str] = field(default=None) title: Optional[str] = field(default=None)
url: Optional[NotificationUrl] = field(default_factory=NotificationUrl) url: Optional[NotificationUrl] = field(default_factory=NotificationUrl)
acknowledge: Optional[bool] = field(default=False) acknowledge: Optional[bool] = field(default=False)
tenant_id: Optional[str] = field(default=None)
def to_db(self) -> "NotificationCosmos": def to_db(self) -> "NotificationCosmos":
""" Create NotificationCosmos """ """ Create NotificationCosmos """
...@@ -33,7 +34,8 @@ class Notification(CamelCaseMixin): ...@@ -33,7 +34,8 @@ class Notification(CamelCaseMixin):
message=self.message, message=self.message,
title=self.title, title=self.title,
url=self.url, url=self.url,
acknowledge=self.acknowledge) acknowledge=self.acknowledge,
tenant_id=self.tenant_id)
# noinspection PyDataclass # noinspection PyDataclass
...@@ -42,5 +44,4 @@ class NotificationCosmos(Notification): ...@@ -42,5 +44,4 @@ class NotificationCosmos(Notification):
""" Notification Dataclass """ """ Notification Dataclass """
# We have to add these fields # We have to add these fields
id: Optional[str] = field(default=None) id: Optional[str] = field(default=None)
tenant_id: Optional[str] = field(default=None)
timestamp: Optional[int] = field(default_factory=timestamp_factory) timestamp: Optional[int] = field(default_factory=timestamp_factory)
...@@ -12,11 +12,13 @@ from botbuilder.core import TurnContext ...@@ -12,11 +12,13 @@ from botbuilder.core import TurnContext
from botbuilder.schema import ChannelAccount from botbuilder.schema import ChannelAccount
from marshmallow import EXCLUDE from marshmallow import EXCLUDE
from config import AppConfig
from entities.json.acknowledge import Acknowledge from entities.json.acknowledge import Acknowledge
from entities.json.acknowledge_schema import AcknowledgeSchema from entities.json.acknowledge_schema import AcknowledgeSchema
from entities.json.camel_case_mixin import timestamp_factory from entities.json.camel_case_mixin import timestamp_factory
from entities.json.conversation_reference import ConversationReference from entities.json.conversation_reference import ConversationReference
from entities.json.initiation import Initiation from entities.json.initiation import Initiation
from entities.json.medx import MedX
from entities.json.notification import NotificationCosmos from entities.json.notification import NotificationCosmos
...@@ -114,8 +116,8 @@ class CosmosClient: ...@@ -114,8 +116,8 @@ class CosmosClient:
return await self.execute_blocking(bl) return await self.execute_blocking(bl)
async def get_acknowledge_items(self, notification_id)\ async def get_acknowledge_items(self, notification_id: str,
-> List[Acknowledge]: _tenant_id: str) -> List[Acknowledge]:
""" Get Acknowledge Items """ """ Get Acknowledge Items """
container = await self.get_acknowledges_container() container = await self.get_acknowledges_container()
...@@ -263,12 +265,13 @@ class CosmosClient: ...@@ -263,12 +265,13 @@ class CosmosClient:
CosmosDBConfig.Initiations.PARTITION_KEY CosmosDBConfig.Initiations.PARTITION_KEY
) )
async def create_acknowledge(self, notification_id: str, async def create_acknowledge(self, notification_id: str, tenant_id: str,
account: ChannelAccount) -> Dict[str, Any]: account: ChannelAccount) -> Dict[str, Any]:
""" Add acknowledge to the DB """ """ Add acknowledge to the DB """
container = await self.get_acknowledges_container() container = await self.get_acknowledges_container()
notification = AcknowledgeSchema().dump(dict( notification = AcknowledgeSchema().dump(dict(
notification_id=notification_id, notification_id=notification_id,
tenant_id=tenant_id or AppConfig.TENANT_ID,
username=account.name, username=account.name,
user_aad_id=account.aad_object_id, user_aad_id=account.aad_object_id,
timestamp=timestamp_factory() timestamp=timestamp_factory()
...@@ -280,30 +283,32 @@ class CosmosClient: ...@@ -280,30 +283,32 @@ class CosmosClient:
""" Get Acknowledge object """ """ Get Acknowledge object """
try: try:
container = await self.get_acknowledges_container() container = await self.get_acknowledges_container()
items = await self.query_items(container, notification_id) # items = await self.query_items(container, notification_id)
return Acknowledge.get_schema(unknown=EXCLUDE).load(items) # return Acknowledge.get_schema(unknown=EXCLUDE).load(items)
except ItemNotFound: except ItemNotFound:
return None return None
async def get_conversation(self, conversation_id: str)\ async def get_conversation(self, notification: NotificationCosmos)\
-> ConversationReference: -> ConversationReference:
""" Get Conversation Reference """ """ Get Conversation Reference """
from config import AppConfig from config import AppConfig
container = await self.get_conversations_container() container = await self.get_conversations_container()
item = await self.get_item(container, conversation_id, item = await self.get_item(
AppConfig.TENANT_ID) container, notification.destination,
notification.tenant_id or AppConfig.TENANT_ID
)
return ConversationReference.get_schema(unknown=EXCLUDE)\ return ConversationReference.get_schema(unknown=EXCLUDE)\
.load(item).to_ms_reference() .load(item).to_ms_reference()
async def get_notification(self, notification_id: str)\ async def get_notification(self, notification_id: str, tenant_id: str)\
-> NotificationCosmos: -> NotificationCosmos:
""" Get Notification """ """ Get Notification """
from config import AppConfig from config import AppConfig
container = await self.get_notifications_container() container = await self.get_notifications_container()
item = await self.get_item(container, notification_id, item = await self.get_item(container, notification_id,
AppConfig.TENANT_ID) tenant_id or AppConfig.TENANT_ID)
return NotificationCosmos.get_schema(unknown=EXCLUDE).load(item) return NotificationCosmos.get_schema(unknown=EXCLUDE).load(item)
async def create_conversation_reference(self, turn_context: TurnContext)\ async def create_conversation_reference(self, turn_context: TurnContext)\
...@@ -331,12 +336,13 @@ class CosmosClient: ...@@ -331,12 +336,13 @@ class CosmosClient:
return return
raise SaveItemError(e.http_error_message) raise SaveItemError(e.http_error_message)
async def create_initiation(self, initiator: str, async def create_initiation(self, initiator: str, mx: MedX) -> None:
notification_id: str) -> None:
""" Save initiation """ """ Save initiation """
from config import AppConfig
container = await self.get_initiation_container() container = await self.get_initiation_container()
initiation = Initiation(initiator=initiator, initiation = Initiation(initiator=initiator,
timestamp=timestamp_factory(), timestamp=timestamp_factory(),
notification_id=notification_id) notification_id=mx.notification_id,
tenant_id=mx.tenant_id or AppConfig.TENANT_ID)
data = Initiation.get_schema().dump(initiation) data = Initiation.get_schema().dump(initiation)
await self.create_item(container, body=data) await self.create_item(container, body=data)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment