83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
import uuid
|
|
from typing import Annotated
|
|
|
|
from fastapi import Depends
|
|
from fastapi.routing import APIRouter
|
|
|
|
from src import dependencies, dto
|
|
from src.adapter.jwt import JWTPayload
|
|
|
|
external_channels_router = APIRouter(prefix='/external_channels', tags=['external_channels'])
|
|
|
|
|
|
@external_channels_router.get('/target/{target_channel_id}')
|
|
async def get_external_channels(
|
|
target_channel_id: uuid.UUID,
|
|
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
) -> dto.GetExternalChannelsOutput:
|
|
"""Get all external channels for a specific target channel."""
|
|
input = dto.GetExternalChannelsInput(
|
|
target_channel_id=target_channel_id,
|
|
user_id=current_user.user_id,
|
|
)
|
|
|
|
return await dependencies.get_usecase().get_external_channels(input=input)
|
|
|
|
|
|
@external_channels_router.post('')
|
|
async def create_external_channel(
|
|
request: dto.CreateExternalChannelInput,
|
|
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
) -> dto.ExternalChannelOutput:
|
|
"""Create a new external channel and link it to target channels."""
|
|
return await dependencies.get_usecase().create_external_channel(
|
|
input=request,
|
|
user_id=current_user.user_id,
|
|
)
|
|
|
|
|
|
@external_channels_router.patch('/{channel_id}')
|
|
async def update_external_channel(
|
|
channel_id: uuid.UUID,
|
|
request: dto.UpdateExternalChannelInput,
|
|
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
) -> dto.ExternalChannelOutput:
|
|
"""Update external channel fields (title, username, description, subscribers_count)."""
|
|
return await dependencies.get_usecase().update_external_channel(
|
|
channel_id=channel_id,
|
|
input=request,
|
|
user_id=current_user.user_id,
|
|
)
|
|
|
|
|
|
@external_channels_router.patch('/{channel_id}/links')
|
|
async def update_external_channel_links(
|
|
channel_id: uuid.UUID,
|
|
request: dto.UpdateExternalChannelLinksInput,
|
|
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
) -> dto.ExternalChannelOutput:
|
|
"""
|
|
Update target channel links for an existing external channel.
|
|
|
|
You can add new target channels, remove existing ones, or both in a single request.
|
|
"""
|
|
return await dependencies.get_usecase().update_external_channel_links(
|
|
channel_id=channel_id,
|
|
input=request,
|
|
user_id=current_user.user_id,
|
|
)
|
|
|
|
|
|
@external_channels_router.delete('/{channel_id}')
|
|
async def delete_external_channel(
|
|
channel_id: uuid.UUID,
|
|
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
) -> None:
|
|
"""Delete an external channel."""
|
|
input = dto.DeleteExternalChannelInput(
|
|
channel_id=channel_id,
|
|
user_id=current_user.user_id,
|
|
)
|
|
|
|
await dependencies.get_usecase().delete_external_channel(input=input)
|