Skip to content

Commit

Permalink
publish domain events
Browse files Browse the repository at this point in the history
  • Loading branch information
meln1k committed Dec 7, 2023
1 parent 6629809 commit 27328d5
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 1 deletion.
16 changes: 16 additions & 0 deletions fixbackend/domain_events/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,19 @@ class WorkspaceCreated(Event):
kind: ClassVar[str] = "workspace_created"

workspace_id: WorkspaceId


@frozen
class InvitationAccepted(Event):
kind: ClassVar[str] = "workspace_invitation_accepted"

workspace_id: WorkspaceId
user_email: str


@frozen
class UserJoinedWorkspace(Event):
kind: ClassVar[str] = "user_joined_workspace"

workspace_id: WorkspaceId
user_id: UserId
10 changes: 10 additions & 0 deletions fixbackend/workspaces/invitation_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
from fixbackend.auth.models import User
from fixbackend.auth.user_repository import UserRepository, UserRepositoryDependency
from fixbackend.config import Config, ConfigDependency
from fixbackend.domain_events.dependencies import DomainEventPublisherDependency
from fixbackend.domain_events.events import InvitationAccepted
from fixbackend.domain_events.publisher import DomainEventPublisher
from fixbackend.ids import InvitationId, WorkspaceId
from fixbackend.notification.service import NotificationService, NotificationServiceDependency
from fixbackend.workspaces.invitation_repository import InvitationRepository, InvitationRepositoryDependency
Expand Down Expand Up @@ -75,12 +78,14 @@ def __init__(
invitation_repository: InvitationRepository,
notification_service: NotificationService,
user_repository: UserRepository,
domain_events: DomainEventPublisher,
config: Config,
) -> None:
self.invitation_repository = invitation_repository
self.notification_service = notification_service
self.workspace_repository = workspace_repository
self.user_repository = user_repository
self.domain_events = domain_events
self.config = config

async def invite_user(
Expand Down Expand Up @@ -132,6 +137,9 @@ async def accept_invitation(self, token: str) -> WorkspaceInvitation:
await self.workspace_repository.add_to_workspace(invitation.workspace_id, user.id)
await self.invitation_repository.delete_invitation(invitation_id)

event = InvitationAccepted(invitation.workspace_id, invitation.email)
await self.domain_events.publish(event)

return updated

async def revoke_invitation(self, invitation_id: InvitationId) -> None:
Expand All @@ -143,13 +151,15 @@ def get_invitation_service(
invitation_repository: InvitationRepositoryDependency,
notification_service: NotificationServiceDependency,
user_repository: UserRepositoryDependency,
domain_events: DomainEventPublisherDependency,
config: ConfigDependency,
) -> InvitationService:
return InvitationServiceImpl(
workspace_repository=workspace_repository,
invitation_repository=invitation_repository,
notification_service=notification_service,
user_repository=user_repository,
domain_events=domain_events,
config=config,
)

Expand Down
5 changes: 4 additions & 1 deletion fixbackend/workspaces/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from fixbackend.types import AsyncSessionMaker
from fixbackend.workspaces.models import Workspace, orm
from fixbackend.domain_events.publisher import DomainEventPublisher
from fixbackend.domain_events.events import WorkspaceCreated
from fixbackend.domain_events.events import UserJoinedWorkspace, WorkspaceCreated


class WorkspaceRepository(ABC):
Expand Down Expand Up @@ -161,6 +161,9 @@ async def add_to_workspace(self, workspace_id: WorkspaceId, user_id: UserId) ->
except IntegrityError:
raise ValueError("Can't add user to workspace.")

event = UserJoinedWorkspace(workspace_id, user_id)
await self.domain_event_sender.publish(event)

async def remove_from_workspace(self, workspace_id: WorkspaceId, user_id: UserId) -> None:
async with self.session_maker() as session:
membership = await session.get(orm.OrganizationMembers, (workspace_id, user_id))
Expand Down
8 changes: 8 additions & 0 deletions tests/fixbackend/workspaces/invitation_service_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from typing import Optional, List
from attrs import frozen
import pytest
from fixbackend.domain_events.events import InvitationAccepted, UserJoinedWorkspace
from fixbackend.workspaces.invitation_service import InvitationService, InvitationServiceImpl


Expand All @@ -25,6 +26,7 @@
from fixbackend.auth.user_repository import UserRepository
from fixbackend.config import Config
from fixbackend.auth.models import User
from tests.fixbackend.conftest import InMemoryDomainEventPublisher


@frozen
Expand Down Expand Up @@ -54,13 +56,15 @@ def service(
invitation_repository: InvitationRepository,
notification_service: NotificationService,
user_repository: UserRepository,
domain_event_sender: InMemoryDomainEventPublisher,
default_config: Config,
) -> InvitationService:
return InvitationServiceImpl(
workspace_repository=workspace_repository,
invitation_repository=invitation_repository,
notification_service=notification_service,
user_repository=user_repository,
domain_events=domain_event_sender,
config=default_config,
)

Expand All @@ -72,6 +76,7 @@ async def test_invite_accept_user(
invitation_repository: InvitationRepository,
notification_service: InMemoryNotificationService,
user_repository: UserRepository,
domain_event_sender: InMemoryDomainEventPublisher,
user: User,
) -> None:
workspace = await workspace_repository.create_workspace(
Expand Down Expand Up @@ -113,6 +118,9 @@ async def test_invite_accept_user(
await service.accept_invitation(token)
assert list(map(lambda w: w.id, await workspace_repository.list_workspaces(existing_user.id))) == [workspace.id]
assert await service.list_invitations(workspace.id) == [invite]
assert len(domain_event_sender.events) == 3
assert domain_event_sender.events[1] == UserJoinedWorkspace(workspace.id, existing_user.id)
assert domain_event_sender.events[2] == InvitationAccepted(workspace.id, existing_user.email)

# invite can be revoked
await service.revoke_invitation(invite.id)
Expand Down

0 comments on commit 27328d5

Please sign in to comment.