diff --git a/chats/apps/api/v1/projects/viewsets.py b/chats/apps/api/v1/projects/viewsets.py index 0e284b2d..84df28a2 100644 --- a/chats/apps/api/v1/projects/viewsets.py +++ b/chats/apps/api/v1/projects/viewsets.py @@ -44,6 +44,8 @@ from chats.apps.rooms.views import create_room_feedback_message from chats.apps.sectors.models import Sector +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers + class ProjectViewset( mixins.ListModelMixin, @@ -518,3 +520,19 @@ def update_access(self, request, *args, **kwargs): status.HTTP_401_UNAUTHORIZED, ) return Response(serialized_data.data, status=status.HTTP_200_OK) + + @action(detail=False, methods=["POST"], url_name="integrate_sectors") + def integrate_sectors(self, request, *args, **kwargs): + try: + project = Project.objects.get(uuid=request.query_params["project"]) + integrations = IntegratedTicketers() + + integrations.integrate_ticketer(project) + integrations.integrate_topic(project) + except Exception as error: + return Response( + {"error integrating ticketers": f"{type(error)}: {error}"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + return Response("ticketers and topics integrated", status=status.HTTP_200_OK) diff --git a/chats/apps/api/v1/queues/viewsets.py b/chats/apps/api/v1/queues/viewsets.py index cb665ee6..be35330f 100644 --- a/chats/apps/api/v1/queues/viewsets.py +++ b/chats/apps/api/v1/queues/viewsets.py @@ -21,6 +21,10 @@ from .serializers import QueueAgentsSerializer + +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers + + User = get_user_model() @@ -60,6 +64,9 @@ def get_serializer_class(self): def perform_create(self, serializer): instance = serializer.save() + + project = Project.objects.get(uuid=instance.sector.project.uuid) + content = { "uuid": str(instance.uuid), "name": instance.name, @@ -74,6 +81,11 @@ def perform_create(self, serializer): raise exceptions.APIException( detail=f"[{response.status_code}] Error posting the queue on flows. Exception: {response.content}" ) + + if project.config.get("its_principal"): + integrate_use_case = IntegratedTicketers() + integrate_use_case.integrate_topic(project) + return instance def perform_update(self, serializer): diff --git a/chats/apps/api/v1/sectors/viewsets.py b/chats/apps/api/v1/sectors/viewsets.py index 823254a2..88cb8e22 100644 --- a/chats/apps/api/v1/sectors/viewsets.py +++ b/chats/apps/api/v1/sectors/viewsets.py @@ -23,6 +23,7 @@ ) from chats.apps.projects.models import Project from chats.apps.sectors.models import Sector, SectorAuthorization, SectorTag +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers class SectorViewset(viewsets.ModelViewSet): @@ -66,6 +67,9 @@ def perform_create(self, serializer): raise exceptions.APIException( detail=f"Error when saving the sector. Exception: {str(e)}" # NOQA ) + + project = Project.objects.get(uuid=instance.project.uuid) + content = { "project_uuid": str(instance.project.uuid), "name": instance.name, @@ -87,6 +91,9 @@ def perform_create(self, serializer): raise exceptions.APIException( detail=f"[{response.status_code}] Error posting the sector/ticketer on flows. Exception: {response.content}" # NOQA ) + if project.config.get("its_main"): + integrate_use_case = IntegratedTicketers() + integrate_use_case.integrate_ticketer(project) def update(self, request, *args, **kwargs): sector = self.get_object() diff --git a/chats/apps/projects/usecases/integrate_ticketers.py b/chats/apps/projects/usecases/integrate_ticketers.py new file mode 100644 index 00000000..f354cd9e --- /dev/null +++ b/chats/apps/projects/usecases/integrate_ticketers.py @@ -0,0 +1,66 @@ +from chats.apps.projects.models import Project +from chats.apps.sectors.models import Sector +from chats.apps.queues.models import Queue + +from chats.apps.api.v1.internal.rest_clients.connect_rest_client import ( + ConnectRESTClient, +) +from rest_framework import exceptions, status +from chats.apps.api.v1.internal.rest_clients.flows_rest_client import FlowRESTClient + + +class IntegratedTicketers: + def integrate_ticketer(self, project): + projects = Project.objects.filter(org=project.org).exclude( + config__its_main=True + ) + + for secundary_project in projects: + sectors = Sector.objects.filter( + project=project, config__integration_token=secundary_project.uuid + ) + + for sector in sectors: + content = { + "project_uuid": str(secundary_project.uuid), + "name": sector.name, + "config": { + "project_auth": str(sector.external_token.pk), + "sector_uuid": str(sector.uuid), + }, + } + connect = ConnectRESTClient() + response = connect.create_ticketer(**content) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the sector/ticketer on flows. Exception: {response.content}" + ) + + def integrate_topic(self, project): + projects = Project.objects.filter(org=project.org).exclude( + config__its_main=True + ) + for secundary_project in projects: + queues = Queue.objects.filter( + sector__project=project, + sector__project__config__integration_token=secundary_project.uuid, + ) + + for queue in queues: + content = { + "uuid": str(queue.uuid), + "name": queue.name, + "sector_uuid": str(queue.sector.uuid), + "project_uuid": str(secundary_project.uuid), + } + response = FlowRESTClient().create_queue(**content) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the queue on flows. Exception: {response.content}" + )