""" Integration ViewSet Phase 6: Site Integration & Multi-Destination Publishing """ from rest_framework import status from rest_framework.decorators import action from rest_framework.response import Response from igny8_core.api.base import SiteSectorModelViewSet from igny8_core.api.permissions import IsAuthenticatedAndActive, IsEditorOrAbove from igny8_core.api.response import success_response, error_response from igny8_core.api.throttles import DebugScopedRateThrottle from igny8_core.business.integration.models import SiteIntegration from igny8_core.business.integration.services.integration_service import IntegrationService from igny8_core.business.integration.services.sync_service import SyncService class IntegrationViewSet(SiteSectorModelViewSet): """ ViewSet for SiteIntegration model. """ queryset = SiteIntegration.objects.select_related('site') permission_classes = [IsAuthenticatedAndActive, IsEditorOrAbove] throttle_scope = 'integration' throttle_classes = [DebugScopedRateThrottle] def get_serializer_class(self): from rest_framework import serializers class SiteIntegrationSerializer(serializers.ModelSerializer): class Meta: model = SiteIntegration fields = '__all__' read_only_fields = ['created_at', 'updated_at', 'last_sync_at'] return SiteIntegrationSerializer @action(detail=True, methods=['post']) def test_connection(self, request, pk=None): """ Test connection to integrated platform. POST /api/v1/integration/integrations/{id}/test_connection/ """ integration = self.get_object() service = IntegrationService() result = service.test_connection(integration) if result.get('success'): return success_response(result, request=request) else: return error_response( result.get('message', 'Connection test failed'), status.HTTP_400_BAD_REQUEST, request ) @action(detail=True, methods=['post']) def sync(self, request, pk=None): """ Trigger synchronization with integrated platform. POST /api/v1/integration/integrations/{id}/sync/ Request body: { "direction": "both", # 'both', 'to_external', 'from_external' "content_types": ["blog_post", "page"] # Optional } """ integration = self.get_object() direction = request.data.get('direction', 'both') content_types = request.data.get('content_types') sync_service = SyncService() result = sync_service.sync(integration, direction=direction, content_types=content_types) response_status = status.HTTP_200_OK if result.get('success') else status.HTTP_400_BAD_REQUEST return success_response(result, request=request, status_code=response_status) @action(detail=True, methods=['get']) def sync_status(self, request, pk=None): """ Get sync status for integration. GET /api/v1/integration/integrations/{id}/sync_status/ """ integration = self.get_object() sync_service = SyncService() status_data = sync_service.get_sync_status(integration) return success_response(status_data, request=request)