s3_url added

This commit is contained in:
Artem Tsyrulnikov
2026-02-02 21:03:59 +03:00
parent be2d38eaf2
commit 3f2c4c8974
9 changed files with 19 additions and 9 deletions

View File

@@ -5,6 +5,8 @@ from typing import Any
from aiogram.types import (
InlineKeyboardButton,
InlineKeyboardMarkup,
InputMediaAudio,
InputMediaDocument,
InputMediaPhoto,
InputMediaVideo,
)
@@ -122,7 +124,7 @@ class TelegramBot(TelegramBase, TelegramBotWriter):
if not media_items:
raise ValueError('No media items to send')
group: list[InputMediaPhoto | InputMediaVideo] = []
group: list[InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo] = []
for index, item in enumerate(media_items):
item_caption = caption if index == 0 else None
if item.media_type == 'photo':
@@ -132,10 +134,9 @@ class TelegramBot(TelegramBase, TelegramBotWriter):
else:
raise ValueError(f'Unsupported media type for group: {item.media_type}')
# Type ignore: aiogram expects Union type but we only use Photo/Video
messages = await self.bot.send_media_group(
chat_id=chat_id, media=group, reply_to_message_id=reply_to_message_id
) # type: ignore[arg-type]
)
# Return message_id of first message (with caption)
return messages[0].message_id

View File

@@ -1,4 +1,5 @@
import json
import typing
from pydantic import BaseModel, field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
@@ -24,7 +25,7 @@ class AppConfig(BaseModel):
if isinstance(v, list):
return v
if isinstance(v, str):
return json.loads(v)
return typing.cast(list[str], json.loads(v))
raise ValueError('ORIGINS must be a JSON array string')

View File

@@ -15,6 +15,7 @@ class CreativeMediaItem(pydantic.BaseModel):
media_type: str
media_file_id: str
position: int
s3_url: str | None = None
class CreativeMediaInput(pydantic.BaseModel):

View File

@@ -96,6 +96,7 @@ async def _replace_media_items(
media_type=media.media_type,
media_file_id=media.media_file_id,
position=media.position,
s3_url=self.s3.public_url(media.media_s3_key) if media.media_s3_key else None,
)
)
return created

View File

@@ -36,6 +36,7 @@ async def get_creative(self: 'Usecase', input: dto.GetCreativeInput) -> dto.Crea
media_type=item.media_type,
media_file_id=item.media_file_id,
position=item.position,
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
)
for item in media_items
],

View File

@@ -44,6 +44,7 @@ async def get_creatives(self: 'Usecase', input: dto.GetCreativesInput) -> list[d
media_type=item.media_type,
media_file_id=item.media_file_id,
position=item.position,
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
)
for item in media_items
],

View File

@@ -7,6 +7,7 @@ from src import domain, dto
if TYPE_CHECKING:
from .. import Usecase
from .. import S3Storage
log = logging.getLogger(__name__)
@@ -50,7 +51,7 @@ async def update_creative(
await _replace_media_items(self, creative.id, workspace_id, media_items)
placements_count = await self.database.count_placement_posts_by_creative(creative.id)
creative_media = await _get_media_items(creative)
creative_media = await _get_media_items(creative, self.s3)
return dto.CreativeOutput(
id=creative.id,
@@ -119,7 +120,7 @@ async def _replace_media_items(
)
async def _get_media_items(creative: domain.Creative) -> list[dto.CreativeMediaItem]:
async def _get_media_items(creative: domain.Creative, s3_storage: S3Storage) -> list[dto.CreativeMediaItem]:
media_rel = creative.media_items
if hasattr(media_rel, 'all'):
items = await media_rel.all().order_by('position')
@@ -130,6 +131,7 @@ async def _get_media_items(creative: domain.Creative) -> list[dto.CreativeMediaI
media_type=item.media_type,
media_file_id=item.media_file_id,
position=item.position,
s3_url=s3_storage.public_url(item.media_s3_key) if item.media_s3_key else None,
)
for item in items
]

View File

@@ -185,6 +185,7 @@ async def build_placement_creative(
media_type=item.media_type,
media_file_id=item.media_file_id,
position=item.position,
s3_url=self.s3.public_url(item.media_s3_key) if item.media_s3_key else None,
)
for item in media_items
],

View File

@@ -391,6 +391,7 @@ type CreativeMediaItem struct {
MediaType string `json:"media_type"`
MediaFileID string `json:"media_file_id"`
Position int `json:"position"`
S3URL *string `json:"s3_url,omitempty"`
}
type CreativeMediaInput struct {