feat: delete /api/v1/external_channels/import/
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import uuid
|
import uuid
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
|
|
||||||
from fastapi import Depends, File, UploadFile
|
from fastapi import Depends
|
||||||
from fastapi.routing import APIRouter
|
from fastapi.routing import APIRouter
|
||||||
|
|
||||||
from src import dependencies, dto
|
from src import dependencies, dto
|
||||||
@@ -80,25 +80,3 @@ async def delete_external_channel(
|
|||||||
)
|
)
|
||||||
|
|
||||||
await dependencies.get_usecase().delete_external_channel(input=input)
|
await dependencies.get_usecase().delete_external_channel(input=input)
|
||||||
|
|
||||||
|
|
||||||
@external_channels_router.post('/import/{target_channel_id}')
|
|
||||||
async def import_external_channels(
|
|
||||||
target_channel_id: uuid.UUID,
|
|
||||||
current_user: Annotated[JWTPayload, Depends(dependencies.get_current_user)],
|
|
||||||
file: UploadFile = File(...),
|
|
||||||
) -> dto.ImportExternalChannelsOutput:
|
|
||||||
"""
|
|
||||||
Import external channels from Excel file (Tgstat export).
|
|
||||||
|
|
||||||
Note: This is a mock endpoint until Excel structure is clarified.
|
|
||||||
"""
|
|
||||||
file_content = await file.read()
|
|
||||||
|
|
||||||
input = dto.ImportExternalChannelsInput(
|
|
||||||
target_channel_id=target_channel_id,
|
|
||||||
user_id=current_user.user_id,
|
|
||||||
file_content=file_content,
|
|
||||||
)
|
|
||||||
|
|
||||||
return await dependencies.get_usecase().import_external_channels_from_excel(input=input)
|
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ __all__ = (
|
|||||||
'DeleteExternalChannelInput',
|
'DeleteExternalChannelInput',
|
||||||
'UpdateExternalChannelInput',
|
'UpdateExternalChannelInput',
|
||||||
'UpdateExternalChannelLinksInput',
|
'UpdateExternalChannelLinksInput',
|
||||||
'ImportExternalChannelsInput',
|
|
||||||
'ImportExternalChannelsOutput',
|
|
||||||
'CreativeOutput',
|
'CreativeOutput',
|
||||||
'GetCreativesInput',
|
'GetCreativesInput',
|
||||||
'GetCreativesOutput',
|
'GetCreativesOutput',
|
||||||
@@ -56,8 +54,6 @@ from .external_channel import (
|
|||||||
ExternalChannelOutput,
|
ExternalChannelOutput,
|
||||||
GetExternalChannelsInput,
|
GetExternalChannelsInput,
|
||||||
GetExternalChannelsOutput,
|
GetExternalChannelsOutput,
|
||||||
ImportExternalChannelsInput,
|
|
||||||
ImportExternalChannelsOutput,
|
|
||||||
UpdateExternalChannelInput,
|
UpdateExternalChannelInput,
|
||||||
UpdateExternalChannelLinksInput,
|
UpdateExternalChannelLinksInput,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -45,15 +45,3 @@ class UpdateExternalChannelInput(pydantic.BaseModel):
|
|||||||
class UpdateExternalChannelLinksInput(pydantic.BaseModel):
|
class UpdateExternalChannelLinksInput(pydantic.BaseModel):
|
||||||
add_target_channel_ids: list[uuid.UUID] = []
|
add_target_channel_ids: list[uuid.UUID] = []
|
||||||
remove_target_channel_ids: list[uuid.UUID] = []
|
remove_target_channel_ids: list[uuid.UUID] = []
|
||||||
|
|
||||||
|
|
||||||
class ImportExternalChannelsInput(pydantic.BaseModel):
|
|
||||||
target_channel_id: uuid.UUID
|
|
||||||
user_id: uuid.UUID
|
|
||||||
file_content: bytes # Excel file content
|
|
||||||
|
|
||||||
|
|
||||||
class ImportExternalChannelsOutput(pydantic.BaseModel):
|
|
||||||
created_count: int
|
|
||||||
skipped_count: int
|
|
||||||
errors: list[str]
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ from .creative.update_creative import update_creative
|
|||||||
from .external_channel.create_external_channel import create_external_channel
|
from .external_channel.create_external_channel import create_external_channel
|
||||||
from .external_channel.delete_external_channel import delete_external_channel
|
from .external_channel.delete_external_channel import delete_external_channel
|
||||||
from .external_channel.get_external_channels import get_external_channels
|
from .external_channel.get_external_channels import get_external_channels
|
||||||
from .external_channel.import_external_channels_from_excel import import_external_channels_from_excel
|
|
||||||
from .external_channel.update_external_channel import update_external_channel
|
from .external_channel.update_external_channel import update_external_channel
|
||||||
from .external_channel.update_external_channel_links import update_external_channel_links
|
from .external_channel.update_external_channel_links import update_external_channel_links
|
||||||
from .purchase.create_purchase import create_purchase
|
from .purchase.create_purchase import create_purchase
|
||||||
@@ -168,7 +167,6 @@ class Usecase:
|
|||||||
delete_external_channel = delete_external_channel
|
delete_external_channel = delete_external_channel
|
||||||
update_external_channel = update_external_channel
|
update_external_channel = update_external_channel
|
||||||
update_external_channel_links = update_external_channel_links
|
update_external_channel_links = update_external_channel_links
|
||||||
import_external_channels_from_excel = import_external_channels_from_excel
|
|
||||||
get_creatives = get_creatives
|
get_creatives = get_creatives
|
||||||
get_creative = get_creative
|
get_creative = get_creative
|
||||||
create_creative = create_creative
|
create_creative = create_creative
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
import logging
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
from src import domain, dto
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from .. import Usecase
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
async def import_external_channels_from_excel(
|
|
||||||
self: 'Usecase', input: dto.ImportExternalChannelsInput
|
|
||||||
) -> dto.ImportExternalChannelsOutput:
|
|
||||||
async with self.database.transaction():
|
|
||||||
target_channel = await self.database.get_target_channel(
|
|
||||||
user_id=input.user_id, channel_id=input.target_channel_id
|
|
||||||
)
|
|
||||||
if not target_channel:
|
|
||||||
log.warning(
|
|
||||||
'User %s attempted to import to unavailable target channel %s', input.user_id, input.target_channel_id
|
|
||||||
)
|
|
||||||
raise domain.TargetChannelNotFound(input.target_channel_id)
|
|
||||||
|
|
||||||
created_count = 0
|
|
||||||
skipped_count = 0
|
|
||||||
errors: list[str] = []
|
|
||||||
|
|
||||||
log.info(
|
|
||||||
'Excel import completed for target %s: %s created, %s skipped, %s errors',
|
|
||||||
input.target_channel_id,
|
|
||||||
created_count,
|
|
||||||
skipped_count,
|
|
||||||
len(errors),
|
|
||||||
)
|
|
||||||
|
|
||||||
return dto.ImportExternalChannelsOutput(
|
|
||||||
created_count=created_count,
|
|
||||||
skipped_count=skipped_count,
|
|
||||||
errors=errors,
|
|
||||||
)
|
|
||||||
Reference in New Issue
Block a user