feat: add delete avatar

This commit is contained in:
2026-05-17 14:54:28 +03:00
parent 6f6d10567e
commit d3b5e0c107
10 changed files with 180 additions and 6 deletions

View File

@@ -6,6 +6,7 @@ from PIL import UnidentifiedImageError
from ulid import ULID
from botocore.exceptions import ClientError
from src.application.abstractions import IUnitOfWork
from src.application.contracts import ICache, ILogger, IS3
from src.application.domain.entities import UserEntity
@@ -23,6 +24,8 @@ class SetAvatarCommand:
self._s3 = s3
async def __call__(self, user_id: str, image_bytes: bytes) -> tuple[UserEntity, int]:
prior = await self._unit_of_work.user_repository.get_user_by_id(user_id)
old_link = prior.avatar_link
try:
webp_bytes = image_bytes_to_webp(image_bytes)
except UnidentifiedImageError as exc:
@@ -46,6 +49,17 @@ class SetAvatarCommand:
user = await self._save_avatar_link(user_id, url)
await self._cache.set_user(user_id, user)
if old_link:
old_key = self._s3.object_key_from_public_url(old_link)
if old_key and old_key != object_key:
try:
await self._s3.delete_object(key=old_key)
except ClientError as exc:
code = exc.response.get('Error', {}).get('Code', '')
if code not in ('NoSuchKey', '404'):
self._logger.warning(f'S3 delete old avatar failed user_id={user_id} code={code}: {exc}')
self._logger.info(f'Avatar set for user_id={user_id} key={object_key}')
return user, len(webp_bytes)