feat: add delete avatar
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user