Phase 6
This commit is contained in:
5
backend/igny8_core/modules/integration/__init__.py
Normal file
5
backend/igny8_core/modules/integration/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""
|
||||
Integration Module
|
||||
Phase 6: Site Integration & Multi-Destination Publishing
|
||||
"""
|
||||
|
||||
12
backend/igny8_core/modules/integration/apps.py
Normal file
12
backend/igny8_core/modules/integration/apps.py
Normal file
@@ -0,0 +1,12 @@
|
||||
"""
|
||||
Integration Module App Configuration
|
||||
"""
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class IntegrationConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'igny8_core.modules.integration'
|
||||
label = 'integration'
|
||||
verbose_name = 'Integration'
|
||||
|
||||
16
backend/igny8_core/modules/integration/urls.py
Normal file
16
backend/igny8_core/modules/integration/urls.py
Normal file
@@ -0,0 +1,16 @@
|
||||
"""
|
||||
Integration URLs
|
||||
Phase 6: Site Integration & Multi-Destination Publishing
|
||||
"""
|
||||
from django.urls import path, include
|
||||
from rest_framework.routers import DefaultRouter
|
||||
|
||||
from igny8_core.modules.integration.views import IntegrationViewSet
|
||||
|
||||
router = DefaultRouter()
|
||||
router.register(r'integrations', IntegrationViewSet, basename='integration')
|
||||
|
||||
urlpatterns = [
|
||||
path('', include(router.urls)),
|
||||
]
|
||||
|
||||
96
backend/igny8_core/modules/integration/views.py
Normal file
96
backend/igny8_core/modules/integration/views.py
Normal file
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user