66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
|
|
"""Channel API views"""
|
||
|
|
|
||
|
|
from django.shortcuts import get_object_or_404
|
||
|
|
from rest_framework import status
|
||
|
|
from rest_framework.response import Response
|
||
|
|
from channel.models import Channel
|
||
|
|
from channel.serializers import ChannelSerializer
|
||
|
|
from common.views import ApiBaseView, AdminWriteOnly
|
||
|
|
|
||
|
|
|
||
|
|
class ChannelListView(ApiBaseView):
|
||
|
|
"""Channel list endpoint"""
|
||
|
|
permission_classes = [AdminWriteOnly]
|
||
|
|
|
||
|
|
def get(self, request):
|
||
|
|
"""Get channel list"""
|
||
|
|
channels = Channel.objects.filter(owner=request.user, subscribed=True)
|
||
|
|
serializer = ChannelSerializer(channels, many=True)
|
||
|
|
return Response({'data': serializer.data, 'paginate': True})
|
||
|
|
|
||
|
|
def post(self, request):
|
||
|
|
"""Subscribe to channel - TubeArchivist pattern with Celery task"""
|
||
|
|
from channel.serializers import ChannelSubscribeSerializer
|
||
|
|
|
||
|
|
# Check channel quota
|
||
|
|
if not request.user.can_add_channel:
|
||
|
|
return Response(
|
||
|
|
{'error': f'Channel limit reached. Maximum {request.user.max_channels} channels allowed.'},
|
||
|
|
status=status.HTTP_403_FORBIDDEN
|
||
|
|
)
|
||
|
|
|
||
|
|
# Validate URL
|
||
|
|
url_serializer = ChannelSubscribeSerializer(data=request.data)
|
||
|
|
url_serializer.is_valid(raise_exception=True)
|
||
|
|
channel_url = request.data['url']
|
||
|
|
|
||
|
|
# Trigger async Celery task (TubeArchivist pattern)
|
||
|
|
from task.tasks import subscribe_to_channel
|
||
|
|
task = subscribe_to_channel.delay(request.user.id, channel_url)
|
||
|
|
|
||
|
|
return Response(
|
||
|
|
{
|
||
|
|
'message': 'Channel subscription task started',
|
||
|
|
'task_id': str(task.id)
|
||
|
|
},
|
||
|
|
status=status.HTTP_202_ACCEPTED
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class ChannelDetailView(ApiBaseView):
|
||
|
|
"""Channel detail endpoint"""
|
||
|
|
permission_classes = [AdminWriteOnly]
|
||
|
|
|
||
|
|
def get(self, request, channel_id):
|
||
|
|
"""Get channel details"""
|
||
|
|
channel = get_object_or_404(Channel, channel_id=channel_id, owner=request.user)
|
||
|
|
serializer = ChannelSerializer(channel)
|
||
|
|
return Response(serializer.data)
|
||
|
|
|
||
|
|
def delete(self, request, channel_id):
|
||
|
|
"""Unsubscribe from channel"""
|
||
|
|
channel = get_object_or_404(Channel, channel_id=channel_id, owner=request.user)
|
||
|
|
channel.subscribed = False
|
||
|
|
channel.save()
|
||
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|