From 9fb7b5dd5648ed2808645796a9aa25cdf74597ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Mill=C3=A1n?= Date: Fri, 16 Feb 2024 14:29:23 -0400 Subject: [PATCH] :star: Upload Avatar --- .gitignore | 4 ++ apps/planner/backend/users/controllers.py | 14 ++++- apps/planner/backend/users/urls.py | 9 +++- files/.gitkeep | 0 requirements/base.txt | 3 ++ .../shared/domain/value_objects/file.py | 36 +++++++++++++ .../infrastructure/bus/command/hardcoded.py | 3 ++ .../application/update_avatar/__init__.py | 0 .../update_avatar/avatar_updater.py | 30 +++++++++++ .../application/update_avatar/command.py | 10 ++++ .../update_avatar/command_handler.py | 26 ++++++++++ src/planner/users/domain/entity.py | 13 +++++ src/planner/users/domain/mime_guesser.py | 7 +++ src/planner/users/domain/repository.py | 2 +- src/planner/users/domain/storage.py | 13 +++++ .../users/domain/value_objects/__init__.py | 1 + .../users/domain/value_objects/avatar.py | 6 +++ .../infrastructure/mime_guessers/__init__.py | 0 .../infrastructure/mime_guessers/magic.py | 10 ++++ .../infrastructure/repositories/sqlalchemy.py | 3 +- .../users/infrastructure/storages/__init__.py | 0 .../users/infrastructure/storages/local.py | 21 ++++++++ .../infrastructure/dependency_injector.py | 2 + .../test_controllers/test_update_avatar.py | 48 ++++++++++++++++++ tests/fixtures/files/sample.jpg | Bin 0 -> 40746 bytes 25 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 files/.gitkeep create mode 100644 src/planner/shared/domain/value_objects/file.py create mode 100644 src/planner/users/application/update_avatar/__init__.py create mode 100644 src/planner/users/application/update_avatar/avatar_updater.py create mode 100644 src/planner/users/application/update_avatar/command.py create mode 100644 src/planner/users/application/update_avatar/command_handler.py create mode 100644 src/planner/users/domain/mime_guesser.py create mode 100644 src/planner/users/domain/storage.py create mode 100644 src/planner/users/domain/value_objects/avatar.py create mode 100644 src/planner/users/infrastructure/mime_guessers/__init__.py create mode 100644 src/planner/users/infrastructure/mime_guessers/magic.py create mode 100644 src/planner/users/infrastructure/storages/__init__.py create mode 100644 src/planner/users/infrastructure/storages/local.py create mode 100644 tests/apps/planner/users/test_controllers/test_update_avatar.py create mode 100644 tests/fixtures/files/sample.jpg diff --git a/.gitignore b/.gitignore index c4d1f9b..1576ab1 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,7 @@ cython_debug/ # Visual Studio Code .vscode/ + +# Storage +files/* +!files/.gitkeep \ No newline at end of file diff --git a/apps/planner/backend/users/controllers.py b/apps/planner/backend/users/controllers.py index 2da51bd..ad34dca 100644 --- a/apps/planner/backend/users/controllers.py +++ b/apps/planner/backend/users/controllers.py @@ -1,6 +1,6 @@ from typing import Annotated -from fastapi import Depends +from fastapi import Depends, File from kink import di from apps.planner.backend.shared.auth import oauth2_scheme @@ -10,6 +10,7 @@ from src.planner.users.application.find.query import FindUserQuery from src.planner.users.application.find.responses import UserResponse from src.planner.users.application.register.command import RegisterUserCommand +from src.planner.users.application.update_avatar.command import UpdateUserAvatarCommand async def sign_up( @@ -31,3 +32,14 @@ async def find( auth_token = await query_bus.ask(FindAuthTokenQuery(access_token=access_token)) find_user_query = FindUserQuery(id=id, user_id=auth_token.user_id) # type: ignore[union-attr] return await query_bus.ask(find_user_query) # type: ignore[return-value] + +async def update_avatar( + id: str, + avatar: Annotated[bytes | None, File()], + access_token: Annotated[str, Depends(oauth2_scheme)], + command_bus: Annotated[CommandBus, Depends(lambda: di[CommandBus])], + query_bus: Annotated[QueryBus, Depends(lambda: di[QueryBus])] +): + auth_token = await query_bus.ask(FindAuthTokenQuery(access_token=access_token)) + command = UpdateUserAvatarCommand(id=id, avatar=avatar, user_id=auth_token.user_id) + await command_bus.dispatch(command) diff --git a/apps/planner/backend/users/urls.py b/apps/planner/backend/users/urls.py index 51006de..6aae1c6 100644 --- a/apps/planner/backend/users/urls.py +++ b/apps/planner/backend/users/urls.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, status -from apps.planner.backend.users.controllers import find, sign_up +from apps.planner.backend.users.controllers import find, sign_up, update_avatar from src.planner.users.application.find.responses import UserResponse router = APIRouter() @@ -20,3 +20,10 @@ endpoint=find, status_code=status.HTTP_200_OK, ) + +router.add_api_route( + "/v1/users/{id}/avatar", + methods=["PUT"], + endpoint=update_avatar, + status_code=status.HTTP_200_OK, +) \ No newline at end of file diff --git a/files/.gitkeep b/files/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/requirements/base.txt b/requirements/base.txt index bc9bada..cb00d53 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -21,3 +21,6 @@ pydantic==2.5.3 # Dependecy Injector kink==0.7.0 + +# Content-Types +python-magic~=0.4.27 diff --git a/src/planner/shared/domain/value_objects/file.py b/src/planner/shared/domain/value_objects/file.py new file mode 100644 index 0000000..4e645ea --- /dev/null +++ b/src/planner/shared/domain/value_objects/file.py @@ -0,0 +1,36 @@ +from src.planner.shared.domain.value_objects.base import ValueObject +from typing import Any, Self + +from uuid import uuid4 +from src.planner.users.domain.storage import UserFileStorage +from src.planner.users.domain.mime_guesser import MimeGuesser +from kink import inject + +@inject +class FileValueObject(ValueObject): + + BASE_TYPE = bytes + SUBPATH = str + + def __init__(self, value: Any, filename: str, storage: UserFileStorage) -> None: + """ + Args: + value (str): Filename + content (bytes, optional): FileContent + """ + self._filename = filename + self._storage = storage + super().__init__(value) + + @property + def filename(self)-> str: + return self._filename + + @classmethod + @inject + def make(cls, file, mime_guesser: MimeGuesser) -> Self: + filename = f"{uuid4()}{mime_guesser.extension(file)}" + return cls(file, filename) + + async def push(self) -> None: + await self._storage.push(self.value, self.SUBPATH + self.filename) diff --git a/src/planner/shared/infrastructure/bus/command/hardcoded.py b/src/planner/shared/infrastructure/bus/command/hardcoded.py index 1323c93..947514c 100644 --- a/src/planner/shared/infrastructure/bus/command/hardcoded.py +++ b/src/planner/shared/infrastructure/bus/command/hardcoded.py @@ -28,6 +28,8 @@ from src.planner.users.application.register.command_handler import ( RegisterUserCommandHandler, ) +from src.planner.users.application.update_avatar.command import UpdateUserAvatarCommand +from src.planner.users.application.update_avatar.command_handler import UpdateUserAvatarCommandHandler @inject(alias=CommandBus) @@ -39,6 +41,7 @@ class HardcodedCommandBus: AddExpenseMovementCommand: AddExpenseMovementCommandHandler, AddIncomeMovementCommand: AddIncomeMovementCommandHandler, AddTransferMovementCommand: AddTransferMovementCommandHandler, + UpdateUserAvatarCommand: UpdateUserAvatarCommandHandler, } async def dispatch(self, command: Command) -> None: diff --git a/src/planner/users/application/update_avatar/__init__.py b/src/planner/users/application/update_avatar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/planner/users/application/update_avatar/avatar_updater.py b/src/planner/users/application/update_avatar/avatar_updater.py new file mode 100644 index 0000000..15f5bef --- /dev/null +++ b/src/planner/users/application/update_avatar/avatar_updater.py @@ -0,0 +1,30 @@ +from kink import inject + +from src.planner.shared.domain.users import UserId +from src.planner.users.domain.repository import UserRepository +from src.planner.users.domain.value_objects import UserAvatar +from src.shared.domain.bus.event.event_bus import EventBus +from src.planner.users.application.find.finder import UserFinder + + +@inject(use_factory=True) +class UserAvatarUpdater: + def __init__(self, + repository: UserRepository, + event_bus: EventBus, + user_finder: UserFinder + ): + self._repository = repository + self._event_bus = event_bus + self._user_finder = user_finder + + async def __call__( + self, + id: UserId, + current_user_id: UserId, + avatar: UserAvatar, + ) -> None: + user = await self._user_finder(id, current_user_id) + await user.update_avatar(avatar) + await self._repository.save(user) + await self._event_bus.publish(*user.pull_domain_events()) diff --git a/src/planner/users/application/update_avatar/command.py b/src/planner/users/application/update_avatar/command.py new file mode 100644 index 0000000..f0c083c --- /dev/null +++ b/src/planner/users/application/update_avatar/command.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + +from src.planner.shared.domain.bus.command import Command + + +@dataclass(frozen=True) +class UpdateUserAvatarCommand(Command): + id: str + avatar: bytes + user_id: str diff --git a/src/planner/users/application/update_avatar/command_handler.py b/src/planner/users/application/update_avatar/command_handler.py new file mode 100644 index 0000000..b882245 --- /dev/null +++ b/src/planner/users/application/update_avatar/command_handler.py @@ -0,0 +1,26 @@ +from kink import inject + +from src.planner.shared.domain.users import UserId +from src.planner.users.domain.value_objects import ( + UserAvatar, + UserLastName, + UserName, + UserPassword, + UserPronoun, +) + +from .command import UpdateUserAvatarCommand +from .avatar_updater import UserAvatarUpdater + + +@inject +class UpdateUserAvatarCommandHandler: + def __init__(self, use_case: UserAvatarUpdater) -> None: + self.use_case = use_case + + async def __call__(self, command: UpdateUserAvatarCommand) -> None: + await self.use_case( + id=UserId(command.id), + avatar=UserAvatar.make(command.avatar), + current_user_id=UserId(command.user_id) + ) diff --git a/src/planner/users/domain/entity.py b/src/planner/users/domain/entity.py index 24992a1..9c6ed8b 100644 --- a/src/planner/users/domain/entity.py +++ b/src/planner/users/domain/entity.py @@ -11,6 +11,7 @@ UserName, UserPassword, UserPronoun, + UserAvatar ) @@ -59,3 +60,15 @@ def register( ) ) return user + + async def update_avatar(self, avatar: UserAvatar) -> None: + # TODO: Add UserAvatarUpdated + # self._record_event( + # UserAvatarUpdated.make( + # self.id.primitive, + # new_avatar=avatar.url, + # old_avatar=self.avatar.url + # ) + # ) + self.avatar = avatar + await self.avatar.push() diff --git a/src/planner/users/domain/mime_guesser.py b/src/planner/users/domain/mime_guesser.py new file mode 100644 index 0000000..7253615 --- /dev/null +++ b/src/planner/users/domain/mime_guesser.py @@ -0,0 +1,7 @@ +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class MimeGuesser(Protocol): + def extension(self, file: bytes) -> str: + ... diff --git a/src/planner/users/domain/repository.py b/src/planner/users/domain/repository.py index 195e192..a42d21a 100644 --- a/src/planner/users/domain/repository.py +++ b/src/planner/users/domain/repository.py @@ -7,7 +7,7 @@ @runtime_checkable class UserRepository(Protocol): - async def create(self, user: User) -> None: + async def save(self, user: User) -> None: ... async def search(self, user_id: UserId) -> Optional[User]: diff --git a/src/planner/users/domain/storage.py b/src/planner/users/domain/storage.py new file mode 100644 index 0000000..3973d2d --- /dev/null +++ b/src/planner/users/domain/storage.py @@ -0,0 +1,13 @@ +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class UserFileStorage(Protocol): + async def push(self, file: bytes, path: str) -> None: + ... + + async def pull(self, path: str) -> None: + ... + + def url(self, path: str) -> str: + ... diff --git a/src/planner/users/domain/value_objects/__init__.py b/src/planner/users/domain/value_objects/__init__.py index b42b6c7..b67723e 100644 --- a/src/planner/users/domain/value_objects/__init__.py +++ b/src/planner/users/domain/value_objects/__init__.py @@ -6,3 +6,4 @@ from .password import UserPassword # noqa: F401 from .pronoun import UserPronoun # noqa: F401 from .updated_at import UserUpdatedAt # noqa: F401 +from .avatar import UserAvatar # noqa: F401 diff --git a/src/planner/users/domain/value_objects/avatar.py b/src/planner/users/domain/value_objects/avatar.py new file mode 100644 index 0000000..96e07ca --- /dev/null +++ b/src/planner/users/domain/value_objects/avatar.py @@ -0,0 +1,6 @@ +from src.planner.shared.domain.value_objects.file import FileValueObject + + +class UserAvatar(FileValueObject): + NAME = "avatar" + SUBPATH = "users/avatars/" diff --git a/src/planner/users/infrastructure/mime_guessers/__init__.py b/src/planner/users/infrastructure/mime_guessers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/planner/users/infrastructure/mime_guessers/magic.py b/src/planner/users/infrastructure/mime_guessers/magic.py new file mode 100644 index 0000000..9b142d8 --- /dev/null +++ b/src/planner/users/infrastructure/mime_guessers/magic.py @@ -0,0 +1,10 @@ +from magic import from_buffer +from mimetypes import guess_extension +from src.planner.users.domain.mime_guesser import MimeGuesser +from kink import inject + +@inject(use_factory=True, alias=MimeGuesser) +class MagicMimeGuesser: + def extension(self, file: bytes) -> str: + content_type = from_buffer(file, mime=True) + return guess_extension(content_type) diff --git a/src/planner/users/infrastructure/repositories/sqlalchemy.py b/src/planner/users/infrastructure/repositories/sqlalchemy.py index c83ff15..d21c258 100644 --- a/src/planner/users/infrastructure/repositories/sqlalchemy.py +++ b/src/planner/users/infrastructure/repositories/sqlalchemy.py @@ -9,6 +9,7 @@ SqlAlchemyCreateMixin, SqlAlchemyFindMixin, SqlAlchemyRepository, + SqlAlchemySaveMixin ) from src.planner.users.domain.entity import User from src.planner.users.domain.repository import UserRepository @@ -36,7 +37,7 @@ class SqlAlchemyUser(Base): @inject(alias=UserRepository, use_factory=True) class SqlAlchemyUserRepository( - SqlAlchemyRepository, SqlAlchemyCreateMixin, SqlAlchemyFindMixin + SqlAlchemyRepository, SqlAlchemyCreateMixin, SqlAlchemyFindMixin, SqlAlchemySaveMixin ): model_class = SqlAlchemyUser entity_class = User diff --git a/src/planner/users/infrastructure/storages/__init__.py b/src/planner/users/infrastructure/storages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/planner/users/infrastructure/storages/local.py b/src/planner/users/infrastructure/storages/local.py new file mode 100644 index 0000000..00cbb69 --- /dev/null +++ b/src/planner/users/infrastructure/storages/local.py @@ -0,0 +1,21 @@ +from src.planner.shared.domain.value_objects.file import FileValueObject +from kink import inject +from src.planner.users.domain.storage import UserFileStorage +from pathlib import Path + +@inject(use_factory=True, alias=UserFileStorage) +class LocalUserFileStorage: + + def __init__(self, basedir: str = 'files') -> None: + self._basedir = basedir + + + async def push(self, file: bytes, path: str) -> None: + Path(f"{self._basedir}/{path}").parent.mkdir(parents=True, exist_ok=True) + with open(f"{self._basedir}/{path}", "wb") as f: + f.write(file) + + async def pull(self, path: str) -> bytes: + with open(f"{self._basedir}/{path}", "rb") as f: + response = f.read() + return response diff --git a/src/shared/infrastructure/dependency_injector.py b/src/shared/infrastructure/dependency_injector.py index c8c424d..07791a2 100644 --- a/src/shared/infrastructure/dependency_injector.py +++ b/src/shared/infrastructure/dependency_injector.py @@ -49,6 +49,8 @@ from src.shared.infrastructure.bus.event.in_memory.event_bus import ( # noqa: F401 InMemoryEventBus, ) +from src.planner.users.infrastructure.storages.local import LocalUserFileStorage # noqa: F401 +from src.planner.users.infrastructure.mime_guessers.magic import MagicMimeGuesser # noqa: F401 def search_subscribers() -> Set[type[DomainEventSubscriber]]: diff --git a/tests/apps/planner/users/test_controllers/test_update_avatar.py b/tests/apps/planner/users/test_controllers/test_update_avatar.py new file mode 100644 index 0000000..426bbf6 --- /dev/null +++ b/tests/apps/planner/users/test_controllers/test_update_avatar.py @@ -0,0 +1,48 @@ +import pytest +from faker import Faker +from fastapi import status +from httpx import AsyncClient +from kink import di +from sqlalchemy.ext.asyncio import AsyncSession + +from apps.planner.backend.config import settings +from src.planner.users.domain.repository import UserRepository +from tests.apps.planner.shared.auth import AuthAsUser +from tests.src.planner.users.factories import UserFactory + +fake = Faker() + +pytestmark = pytest.mark.anyio + + +class TestUpdateUserAvatarController: + def setup_method(self): + self._user = UserFactory.build() + self._url = f"{settings.API_PREFIX}/v1/users/{self._user.id}/avatar" + + async def test_success( + self, client: AsyncClient, sqlalchemy_sessionmaker: type[AsyncSession] + ) -> None: + await di[UserRepository].create(self._user) # type: ignore[type-abstract] + + response = await client.put( + self._url, + auth=AuthAsUser(self._user.id), + files={"avatar": ("sample.jpg", open('tests/fixtures/files/sample.jpg', "rb"), "image/jpeg")} + ) + + assert response.status_code == status.HTTP_200_OK, response.text + assert response.json() == None + + async def test_should_return_unauthorized_missing_token( + self, client: AsyncClient, sqlalchemy_sessionmaker: type[AsyncSession] + ) -> None: + response = await client.put(self._url) + + assert response.status_code == status.HTTP_401_UNAUTHORIZED, response.text + + json_response = response.json() + assert len(json_response["detail"]) == 1 + error_response = json_response["detail"][0] + assert error_response["msg"] == "Is required" + assert error_response["source"] == "access_token" diff --git a/tests/fixtures/files/sample.jpg b/tests/fixtures/files/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..529be46ad2d0bf57fe2cb0be3240852f92a359c4 GIT binary patch literal 40746 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 SE)UIOZI*PKDbo2j|Nj7oC@E?H literal 0 HcmV?d00001