diff --git a/src/Modules/TeamManagement/TeamUp.TeamManagement.Application/Invitations/CreateInvitationRequestCreatedEventHandler.cs b/src/Modules/TeamManagement/TeamUp.TeamManagement.Application/Invitations/CreateInvitationRequestCreatedEventHandler.cs index 4e71b29..b2238ef 100644 --- a/src/Modules/TeamManagement/TeamUp.TeamManagement.Application/Invitations/CreateInvitationRequestCreatedEventHandler.cs +++ b/src/Modules/TeamManagement/TeamUp.TeamManagement.Application/Invitations/CreateInvitationRequestCreatedEventHandler.cs @@ -34,10 +34,10 @@ public CreateInvitationRequestCreatedEventHandler(IUserRepository userRepository public async Task Handle(CreateInvitationRequestCreatedIntegrationEvent integrationEvent, CancellationToken ct) { - var user = await _userRepository.GetUserByIdAsync(integrationEvent.UserId, ct); + var user = await _userRepository.GetUserByEmailAsync(integrationEvent.Email, ct); if (user is null) { - _logger.LogWarning("User {userId} is not yet created for inviting to team {teamId}.", integrationEvent.UserId, integrationEvent.TeamId); + _logger.LogWarning("User {userEmail} is not yet created for inviting to team {teamId}.", integrationEvent.Email, integrationEvent.TeamId); return new EventualConsistencyError("TeamManagement.Users.NotFound", "User not found when inviting."); } @@ -60,7 +60,7 @@ public async Task Handle(CreateInvitationRequestCreatedIntegrationEvent { if (result.Error is ConflictError error) { - _logger.LogWarning("Invitation of user {userId} to team {teamId} probably already exist. {error}", integrationEvent.UserId, integrationEvent.TeamId, error); + _logger.LogWarning("Invitation of user {userEmail} to team {teamId} probably already exist. {error}", integrationEvent.Email, integrationEvent.TeamId, error); return Result.Success; } } diff --git a/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/IntegrationEvents/CreateInvitationRequestCreatedIntegrationEvent.cs b/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/IntegrationEvents/CreateInvitationRequestCreatedIntegrationEvent.cs index 350cbdf..52a0df1 100644 --- a/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/IntegrationEvents/CreateInvitationRequestCreatedIntegrationEvent.cs +++ b/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/IntegrationEvents/CreateInvitationRequestCreatedIntegrationEvent.cs @@ -1,11 +1,10 @@ using TeamUp.Common.Contracts; using TeamUp.TeamManagement.Contracts.Teams; -using TeamUp.UserAccess.Contracts; namespace TeamUp.TeamManagement.Domain.Aggregates.Invitations.IntegrationEvents; public sealed record CreateInvitationRequestCreatedIntegrationEvent : IIntegrationEvent { - public required UserId UserId { get; init; } + public required string Email { get; init; } public required TeamId TeamId { get; init; } } diff --git a/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/InvitationDomainService.cs b/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/InvitationDomainService.cs index 9b7c04e..1595490 100644 --- a/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/InvitationDomainService.cs +++ b/src/Modules/TeamManagement/TeamUp.TeamManagement.Domain/Aggregates/Invitations/InvitationDomainService.cs @@ -22,7 +22,6 @@ internal sealed class InvitationDomainService : IInvitationDomainService private readonly ITeamRepository _teamRepository; private readonly IInvitationRepository _invitationRepository; private readonly IIntegrationEventPublisher _publisher; - private readonly IRequestClient _client; private readonly IDateTimeProvider _dateTimeProvider; public InvitationDomainService( @@ -30,14 +29,12 @@ public InvitationDomainService( ITeamRepository teamRepository, IInvitationRepository invitationRepository, IIntegrationEventPublisher publisher, - IRequestClient client, IDateTimeProvider dateTimeProvider) { _userRepository = userRepository; _teamRepository = teamRepository; _invitationRepository = invitationRepository; _publisher = publisher; - _client = client; _dateTimeProvider = dateTimeProvider; } @@ -65,6 +62,7 @@ public async Task AcceptInvitationAsync(UserId initiatorId, InvitationId .ToResultAsync(); } + public async Task InviteUserAsync(UserId initiatorId, TeamId teamId, string email, CancellationToken ct = default) { var team = await _teamRepository.GetTeamByIdAsync(teamId, ct); @@ -76,30 +74,36 @@ public async Task InviteUserAsync(UserId initiatorId, TeamId teamId, str .Then((team, _) => team) .AndAsync(team => _userRepository.GetUserByEmailAsync(email, ct)) .Ensure(TeamRules.InvitedUserIsNotTeamMember) - .ThenAsync(async (team, user) => + .ThenAsync(async (team, user) => { //generate user if user doesn't exist if (user is null) { - return await GenerateUserAsync(email, ct) - .Then(userId => (team, userId)); + var message = new GenerateUserRequestCreatedIntegrationEvent + { + Email = email, + Name = email + }; + + _publisher.Publish(message); + return (team, email); } - //check for whether user is already invited to the same team + //check whether user is already invited to the same team var conflictingInvitationExists = await _invitationRepository.ExistsInvitationForUserToTeamAsync(user.Id, teamId, ct); if (conflictingInvitationExists) { return InvitationErrors.UserIsAlreadyInvited; } - return (team, user.Id); + return (team, user.Email); }) - .Tap((team, userId) => + .Tap((team, email) => { var message = new CreateInvitationRequestCreatedIntegrationEvent { TeamId = team.Id, - UserId = userId + Email = email }; _publisher.Publish(message); @@ -107,18 +111,6 @@ public async Task InviteUserAsync(UserId initiatorId, TeamId teamId, str .ToResultAsync(); } - private async Task> GenerateUserAsync(string email, CancellationToken ct) - { - var message = new GenerateUserCommand - { - Email = email, - Name = email - }; - - var response = await _client.GetResponse>(message, ct); - return response.Message; - } - public async Task RemoveInvitationAsync(UserId initiatorId, InvitationId invitationId, CancellationToken ct = default) { var invitation = await _invitationRepository.GetInvitationByIdAsync(invitationId, ct); diff --git a/src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserCommandHandler.cs b/src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserRequestCreatedEventHandler.cs similarity index 61% rename from src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserCommandHandler.cs rename to src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserRequestCreatedEventHandler.cs index 1b10d4d..8bc6ebf 100644 --- a/src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserCommandHandler.cs +++ b/src/Modules/UserAccess/TeamUp.UserAccess.Application/GenerateUserRequestCreatedEventHandler.cs @@ -5,12 +5,12 @@ namespace TeamUp.UserAccess.Application; -internal sealed class GenerateUserCommandHandler : ICommandHandler +internal sealed class GenerateUserRequestCreatedEventHandler : IIntegrationEventHandler { private readonly UserFactory _userFactory; private readonly IUnitOfWork _unitOfWork; - public GenerateUserCommandHandler( + public GenerateUserRequestCreatedEventHandler( UserFactory userFactory, IUnitOfWork unitOfWork) { @@ -18,11 +18,10 @@ public GenerateUserCommandHandler( _unitOfWork = unitOfWork; } - public async Task> Handle(GenerateUserCommand command, CancellationToken ct) + public async Task Handle(GenerateUserRequestCreatedIntegrationEvent command, CancellationToken ct) { return await _userFactory .GenerateAndAddUserAsync(command.Name, command.Email, ct) - .Then(user => user.Id) - .TapAsync(_ => _unitOfWork.SaveChangesAsync(ct)); + .ThenAsync(_ => _unitOfWork.SaveChangesAsync(ct)); } } diff --git a/src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserCommand.cs b/src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserRequestCreatedIntegrationEvent.cs similarity index 70% rename from src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserCommand.cs rename to src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserRequestCreatedIntegrationEvent.cs index e40d1de..ea3216c 100644 --- a/src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserCommand.cs +++ b/src/Modules/UserAccess/TeamUp.UserAccess.Contracts/CreateUser/GenerateUserRequestCreatedIntegrationEvent.cs @@ -4,12 +4,12 @@ namespace TeamUp.UserAccess.Contracts.CreateUser; -public sealed record GenerateUserCommand : ICommand +public sealed record GenerateUserRequestCreatedIntegrationEvent : IIntegrationEvent { public required string Name { get; init; } public required string Email { get; init; } - public sealed class Validator : AbstractValidator + public sealed class Validator : AbstractValidator { public Validator() {