бэк несколько медиа
This commit is contained in:
@@ -22,36 +22,28 @@ async def create_creative(
|
||||
log.warning('User %s attempted to create creative for unavailable project %s', user_id, project_id)
|
||||
raise domain.ProjectNotFound(project_id)
|
||||
|
||||
domain.validate_media_size(input.media_data)
|
||||
|
||||
creative_text = domain.replace_invite_link_with_tag(input.text)
|
||||
|
||||
media_s3_key: str | None = None
|
||||
if input.media_data:
|
||||
file_id = uuid.uuid4()
|
||||
media_s3_key = f'creatives/{workspace_id}/{file_id}'
|
||||
content_type = _get_content_type(input.media_type)
|
||||
await self.s3.upload(media_s3_key, input.media_data, content_type)
|
||||
log.info('Uploaded creative media to S3: %s', media_s3_key)
|
||||
media_items = input.media_items or []
|
||||
domain.validate_media_items([item.media_type for item in media_items])
|
||||
for item in media_items:
|
||||
domain.validate_media_size(item.media_data)
|
||||
|
||||
creative = domain.Creative(
|
||||
name=input.name,
|
||||
text=creative_text,
|
||||
media_type=input.media_type,
|
||||
media_file_id=input.media_file_id,
|
||||
media_s3_key=media_s3_key,
|
||||
buttons=[button.model_dump() for button in input.buttons],
|
||||
status=domain.CreativeStatus.ACTIVE,
|
||||
project_id=project.id,
|
||||
)
|
||||
await self.database.create_creative(creative)
|
||||
|
||||
created_media = await _replace_media_items(self, creative.id, workspace_id, media_items)
|
||||
|
||||
return dto.CreativeOutput(
|
||||
id=creative.id,
|
||||
name=creative.name,
|
||||
text=creative.text,
|
||||
media_type=creative.media_type,
|
||||
media_file_id=creative.media_file_id,
|
||||
media_items=created_media,
|
||||
buttons=creative.buttons,
|
||||
project_id=project.id,
|
||||
project_channel_title=project.channel.title,
|
||||
@@ -72,3 +64,35 @@ def _get_content_type(media_type: str | None) -> str:
|
||||
'animation': 'image/gif',
|
||||
}
|
||||
return mapping.get(media_type, 'application/octet-stream')
|
||||
|
||||
|
||||
async def _replace_media_items(
|
||||
self: 'Usecase',
|
||||
creative_id: uuid.UUID,
|
||||
workspace_id: uuid.UUID,
|
||||
media_items: list[dto.CreativeMediaInput],
|
||||
) -> list[dto.CreativeMediaItem]:
|
||||
created: list[dto.CreativeMediaItem] = []
|
||||
for position, item in enumerate(media_items):
|
||||
media_s3_key: str | None = None
|
||||
if item.media_data:
|
||||
file_id = uuid.uuid4()
|
||||
media_s3_key = f'creatives/{workspace_id}/{file_id}'
|
||||
content_type = _get_content_type(item.media_type)
|
||||
await self.s3.upload(media_s3_key, item.media_data, content_type)
|
||||
log.info('Uploaded creative media to S3: %s', media_s3_key)
|
||||
media = await domain.CreativeMedia.create(
|
||||
creative_id=creative_id,
|
||||
media_type=item.media_type,
|
||||
media_file_id=item.media_file_id,
|
||||
media_s3_key=media_s3_key,
|
||||
position=position,
|
||||
)
|
||||
created.append(
|
||||
dto.CreativeMediaItem(
|
||||
media_type=media.media_type,
|
||||
media_file_id=media.media_file_id,
|
||||
position=media.position,
|
||||
)
|
||||
)
|
||||
return created
|
||||
|
||||
Reference in New Issue
Block a user