Skip to content
Open
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
2 changes: 2 additions & 0 deletions libzapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from libzapi.application import CustomData
from libzapi.application import AgentAvailability
from libzapi.application import AssetManagement
from libzapi.application import Conversations
from libzapi.application import ZendeskStatus

__all__ = [
Expand All @@ -11,5 +12,6 @@
"CustomData",
"AgentAvailability",
"AssetManagement",
"Conversations",
"ZendeskStatus",
]
2 changes: 2 additions & 0 deletions libzapi/application/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from libzapi.application.services.custom_data import CustomData
from libzapi.application.services.agent_availability import AgentAvailability
from libzapi.application.services.asset_management import AssetManagement
from libzapi.application.services.conversations import Conversations
from libzapi.application.services.status import ZendeskStatus

__all__ = [
Expand All @@ -11,5 +12,6 @@
"CustomData",
"AgentAvailability",
"AssetManagement",
"Conversations",
"ZendeskStatus",
]
Empty file.
17 changes: 17 additions & 0 deletions libzapi/application/commands/conversations/app_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import annotations

from dataclasses import dataclass, field


@dataclass(frozen=True, slots=True)
class CreateAppCmd:
displayName: str

Check warning on line 8 in libzapi/application/commands/conversations/app_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "displayName" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswscNfnishN1uBDV&open=AZ0YswscNfnishN1uBDV&pullRequest=65
metadata: dict = field(default_factory=dict)
settings: dict | None = None


@dataclass(frozen=True, slots=True)
class UpdateAppCmd:
displayName: str | None = None
metadata: dict | None = None
settings: dict | None = None
21 changes: 21 additions & 0 deletions libzapi/application/commands/conversations/conversation_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from __future__ import annotations

from dataclasses import dataclass, field


@dataclass(frozen=True, slots=True)
class CreateConversationCmd:
type: str = "personal"
displayName: str = ""
description: str = ""
iconUrl: str = ""
metadata: dict = field(default_factory=dict)
participants: list[dict] = field(default_factory=list)


@dataclass(frozen=True, slots=True)
class UpdateConversationCmd:
displayName: str | None = None
description: str | None = None
iconUrl: str | None = None

Check warning on line 20 in libzapi/application/commands/conversations/conversation_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "iconUrl" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr_NfnishN1uBDM&open=AZ0Yswr_NfnishN1uBDM&pullRequest=65
metadata: dict | None = None
16 changes: 16 additions & 0 deletions libzapi/application/commands/conversations/integration_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations

from dataclasses import dataclass, field


@dataclass(frozen=True, slots=True)
class CreateIntegrationCmd:
type: str
displayName: str = ""

Check warning on line 9 in libzapi/application/commands/conversations/integration_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "displayName" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswsGNfnishN1uBDO&open=AZ0YswsGNfnishN1uBDO&pullRequest=65
extra: dict = field(default_factory=dict)


@dataclass(frozen=True, slots=True)
class UpdateIntegrationCmd:
displayName: str | None = None

Check warning on line 15 in libzapi/application/commands/conversations/integration_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "displayName" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswsGNfnishN1uBDP&open=AZ0YswsGNfnishN1uBDP&pullRequest=65
extra: dict | None = None
10 changes: 10 additions & 0 deletions libzapi/application/commands/conversations/message_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class PostMessageCmd:
author: dict
content: dict
metadata: dict | None = None
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class PassControlCmd:
switchboardIntegration: str
metadata: dict | None = None


@dataclass(frozen=True, slots=True)
class OfferControlCmd:
switchboardIntegration: str
metadata: dict | None = None
30 changes: 30 additions & 0 deletions libzapi/application/commands/conversations/switchboard_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class CreateSwitchboardCmd:
enabled: bool = True


@dataclass(frozen=True, slots=True)
class UpdateSwitchboardCmd:
enabled: bool | None = None
defaultSwitchboardIntegrationId: str | None = None

Check warning on line 14 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "defaultSwitchboardIntegrationId" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDD&open=AZ0Yswr5NfnishN1uBDD&pullRequest=65


@dataclass(frozen=True, slots=True)
class CreateSwitchboardIntegrationCmd:
name: str
integrationId: str
integrationType: str = ""

Check warning on line 21 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "integrationType" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDF&open=AZ0Yswr5NfnishN1uBDF&pullRequest=65
deliverStandbyEvents: bool = False

Check warning on line 22 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "deliverStandbyEvents" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDG&open=AZ0Yswr5NfnishN1uBDG&pullRequest=65


@dataclass(frozen=True, slots=True)
class UpdateSwitchboardIntegrationCmd:
name: str | None = None
deliverStandbyEvents: bool | None = None

Check warning on line 28 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "deliverStandbyEvents" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDH&open=AZ0Yswr5NfnishN1uBDH&pullRequest=65
nextSwitchboardIntegrationId: str | None = None

Check warning on line 29 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "nextSwitchboardIntegrationId" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDI&open=AZ0Yswr5NfnishN1uBDI&pullRequest=65
messageHistoryCount: int | None = None

Check warning on line 30 in libzapi/application/commands/conversations/switchboard_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "messageHistoryCount" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0Yswr5NfnishN1uBDJ&open=AZ0Yswr5NfnishN1uBDJ&pullRequest=65
16 changes: 16 additions & 0 deletions libzapi/application/commands/conversations/user_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class CreateUserCmd:
externalId: str

Check warning on line 8 in libzapi/application/commands/conversations/user_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "externalId" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswsNNfnishN1uBDQ&open=AZ0YswsNNfnishN1uBDQ&pullRequest=65
profile: dict | None = None
metadata: dict | None = None


@dataclass(frozen=True, slots=True)
class UpdateUserCmd:
profile: dict | None = None
metadata: dict | None = None
19 changes: 19 additions & 0 deletions libzapi/application/commands/conversations/webhook_cmds.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class CreateWebhookCmd:
target: str
triggers: list[str]
includeFullUser: bool = False

Check warning on line 10 in libzapi/application/commands/conversations/webhook_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "includeFullUser" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswsVNfnishN1uBDR&open=AZ0YswsVNfnishN1uBDR&pullRequest=65
includeFullSource: bool = False


@dataclass(frozen=True, slots=True)
class UpdateWebhookCmd:
target: str | None = None
triggers: list[str] | None = None
includeFullUser: bool | None = None
includeFullSource: bool | None = None

Check warning on line 19 in libzapi/application/commands/conversations/webhook_cmds.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this field "includeFullSource" to match the regular expression ^[_a-z][_a-z0-9]*$.

See more on https://sonarcloud.io/project/issues?id=BCR-CX_libzapi&issues=AZ0YswsVNfnishN1uBDU&open=AZ0YswsVNfnishN1uBDU&pullRequest=65
47 changes: 47 additions & 0 deletions libzapi/application/services/conversations/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from __future__ import annotations

import libzapi.infrastructure.api_clients.conversations as api
from libzapi.application.services.conversations.activities_service import ActivitiesService
from libzapi.application.services.conversations.app_keys_service import AppKeysService
from libzapi.application.services.conversations.apps_service import AppsService
from libzapi.application.services.conversations.attachments_service import AttachmentsService
from libzapi.application.services.conversations.clients_service import ClientsService
from libzapi.application.services.conversations.conversations_service import ConversationsService
from libzapi.application.services.conversations.devices_service import DevicesService
from libzapi.application.services.conversations.integration_api_keys_service import IntegrationApiKeysService
from libzapi.application.services.conversations.integrations_service import IntegrationsService
from libzapi.application.services.conversations.messages_service import MessagesService
from libzapi.application.services.conversations.participants_service import ParticipantsService
from libzapi.application.services.conversations.switchboard_actions_service import SwitchboardActionsService
from libzapi.application.services.conversations.switchboard_integrations_service import SwitchboardIntegrationsService
from libzapi.application.services.conversations.switchboards_service import SwitchboardsService
from libzapi.application.services.conversations.users_service import UsersService
from libzapi.application.services.conversations.webhooks_service import WebhooksService
from libzapi.infrastructure.http.auth import basic_key_headers
from libzapi.infrastructure.http.client import HttpClient


class Conversations:
def __init__(self, base_url: str, key_id: str, key_secret: str, app_id: str):
headers = basic_key_headers(key_id, key_secret)
http = HttpClient(f"{base_url.rstrip('/')}/sc", headers=headers)
self.app_id = app_id

self.apps = AppsService(api.AppApiClient(http))
self.app_keys = AppKeysService(api.AppKeyApiClient(http), app_id)
self.conversations_ = ConversationsService(api.ConversationApiClient(http), app_id)
self.messages = MessagesService(api.MessageApiClient(http), app_id)
self.participants = ParticipantsService(api.ParticipantApiClient(http), app_id)
self.activities = ActivitiesService(api.ActivityApiClient(http), app_id)
self.switchboard_actions = SwitchboardActionsService(api.SwitchboardActionApiClient(http), app_id)
self.integrations = IntegrationsService(api.IntegrationApiClient(http), app_id)
self.integration_api_keys = IntegrationApiKeysService(api.IntegrationApiKeyApiClient(http), app_id)
self.webhooks = WebhooksService(api.WebhookApiClient(http), app_id)
self.switchboards = SwitchboardsService(api.SwitchboardApiClient(http), app_id)
self.switchboard_integrations = SwitchboardIntegrationsService(
api.SwitchboardIntegrationApiClient(http), app_id
)
self.users = UsersService(api.UserApiClient(http), app_id)
self.clients = ClientsService(api.ClientApiClient(http), app_id)
self.devices = DevicesService(api.DeviceApiClient(http), app_id)
self.attachments = AttachmentsService(api.AttachmentApiClient(http), app_id)
14 changes: 14 additions & 0 deletions libzapi/application/services/conversations/activities_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from __future__ import annotations

from libzapi.infrastructure.api_clients.conversations.activity_api_client import ActivityApiClient


class ActivitiesService:
"""High-level service for Sunshine Conversations Activities."""

def __init__(self, client: ActivityApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def post(self, conversation_id: str, author: dict, type: str):
return self._client.post(self._app_id, conversation_id, author=author, type=type)
23 changes: 23 additions & 0 deletions libzapi/application/services/conversations/app_keys_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from __future__ import annotations

from libzapi.infrastructure.api_clients.conversations.app_key_api_client import AppKeyApiClient


class AppKeysService:
"""High-level service for Sunshine Conversations App Keys."""

def __init__(self, client: AppKeyApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def list_all(self):
return self._client.list_all(self._app_id)

def get(self, key_id: str):
return self._client.get(self._app_id, key_id)

def create(self, display_name: str):
return self._client.create(self._app_id, display_name=display_name)

def delete(self, key_id: str) -> None:
self._client.delete(self._app_id, key_id)
28 changes: 28 additions & 0 deletions libzapi/application/services/conversations/apps_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from __future__ import annotations

from libzapi.application.commands.conversations.app_cmds import CreateAppCmd, UpdateAppCmd
from libzapi.infrastructure.api_clients.conversations.app_api_client import AppApiClient


class AppsService:
"""High-level service for Sunshine Conversations Apps."""

def __init__(self, client: AppApiClient) -> None:
self._client = client

def list_all(self):
return self._client.list_all()

def get(self, app_id: str):
return self._client.get(app_id)

def create(self, display_name: str, **kwargs):
cmd = CreateAppCmd(displayName=display_name, **kwargs)
return self._client.create(cmd)

def update(self, app_id: str, **kwargs):
cmd = UpdateAppCmd(**kwargs)
return self._client.update(app_id, cmd)

def delete(self, app_id: str) -> None:
self._client.delete(app_id)
17 changes: 17 additions & 0 deletions libzapi/application/services/conversations/attachments_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import annotations

from libzapi.infrastructure.api_clients.conversations.attachment_api_client import AttachmentApiClient


class AttachmentsService:
"""High-level service for Sunshine Conversations Attachments."""

def __init__(self, client: AttachmentApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def upload(self, file):
return self._client.upload(self._app_id, file)

def delete(self, media_url: str) -> None:
self._client.delete(self._app_id, media_url)
20 changes: 20 additions & 0 deletions libzapi/application/services/conversations/clients_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from __future__ import annotations

from libzapi.infrastructure.api_clients.conversations.client_api_client import ClientApiClient


class ClientsService:
"""High-level service for Sunshine Conversations Clients."""

def __init__(self, client: ClientApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def list_all(self, user_id: str):
return self._client.list_all(self._app_id, user_id)

def create(self, user_id: str, payload: dict):
return self._client.create(self._app_id, user_id, payload=payload)

def remove(self, user_id: str, client_id: str) -> None:
self._client.remove(self._app_id, user_id, client_id)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from __future__ import annotations

from libzapi.application.commands.conversations.conversation_cmds import CreateConversationCmd, UpdateConversationCmd
from libzapi.infrastructure.api_clients.conversations.conversation_api_client import ConversationApiClient


class ConversationsService:
"""High-level service for Sunshine Conversations Conversations."""

def __init__(self, client: ConversationApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def list_by_user(self, user_id: str):
return self._client.list_by_user(self._app_id, user_id)

def get(self, conversation_id: str):
return self._client.get(self._app_id, conversation_id)

def create(self, type: str = "personal", **kwargs):
cmd = CreateConversationCmd(type=type, **kwargs)
return self._client.create(self._app_id, cmd)

def update(self, conversation_id: str, **kwargs):
cmd = UpdateConversationCmd(**kwargs)
return self._client.update(self._app_id, conversation_id, cmd)

def delete(self, conversation_id: str) -> None:
self._client.delete(self._app_id, conversation_id)
17 changes: 17 additions & 0 deletions libzapi/application/services/conversations/devices_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from __future__ import annotations

from libzapi.infrastructure.api_clients.conversations.device_api_client import DeviceApiClient


class DevicesService:
"""High-level service for Sunshine Conversations Devices."""

def __init__(self, client: DeviceApiClient, app_id: str) -> None:
self._client = client
self._app_id = app_id

def list_all(self, user_id: str):
return self._client.list_all(self._app_id, user_id)

def get(self, user_id: str, device_id: str):
return self._client.get(self._app_id, user_id, device_id)
Loading
Loading