public async Task <HouseInviteSimpleInfo> CreateInviteAsync( HouseInviteCreationRequest houseInviteCreationRequest, CancellationToken cancellationToken = default) { var houseInviteInfo = await _houseInviteService.CreateInviteAsync( houseInviteCreationRequest, cancellationToken); var houseInviteSimpleInfo = _mapper.Map <HouseInviteSimpleInfo>(houseInviteInfo); return(houseInviteSimpleInfo); }
public async Task <HouseInviteInfo> CreateInviteAsync( HouseInviteCreationRequest houseInviteCreationRequest, CancellationToken cancellationToken = default) { var houseInvitesInvitedByUserIdFilter = Builders <HouseInviteInfo> .Filter .Eq(hii => hii.InvitedByUserId, houseInviteCreationRequest.InvitedByUserId); var houseInvitesInvitedByUserIdCount = await _houseInviteRepository.CountAsync( houseInvitesInvitedByUserIdFilter, cancellationToken); if (houseInvitesInvitedByUserIdCount >= _houseInviteOptions.Value.MaxInvitesPerUser) { throw new TooManyHouseInvitesException(); } var houseInvitesHouseIdFilter = Builders <HouseInviteInfo> .Filter .Eq(hii => hii.HouseId, houseInviteCreationRequest.HouseId); var houseInvitesUserEmailFilter = Builders <HouseInviteInfo> .Filter .Regex(hii => hii.UserEmail, new BsonRegularExpression($"^{houseInviteCreationRequest.UserEmail}$", "i")); var sameHouseInvitesFilter = Builders <HouseInviteInfo> .Filter .And(houseInvitesHouseIdFilter, houseInvitesUserEmailFilter); var sameHouseInvitesCount = await _houseInviteRepository.CountAsync( sameHouseInvitesFilter, cancellationToken); if (sameHouseInvitesCount != 0) { throw new HouseInviteDuplicateInsertionException(); } var houseIdFilter = Builders <HouseInfo> .Filter .Eq(hi => hi.Id, houseInviteCreationRequest.HouseId); var houseOwnerFilter = Builders <HouseInfo> .Filter .Eq(hi => hi.OwnerId, houseInviteCreationRequest.InvitedByUserId); var houseFilter = Builders <HouseInfo> .Filter .And(houseIdFilter, houseOwnerFilter); var houseCount = await _houseRepository.CountAsync(houseFilter, cancellationToken); if (houseCount != 1) { throw new HouseNotFoundException(); } var houseInvite = _mapper.Map <HouseInviteInfo>(houseInviteCreationRequest); houseInvite.CreatedAt = DateTime.UtcNow; var userFilter = Builders <UserInfo> .Filter .Regex(ui => ui.Email, new BsonRegularExpression($"^{houseInviteCreationRequest.UserEmail}$", "i")); try { var userInfo = await _userRepository.FindOneAsync(userFilter, cancellationToken); var isUserInvitingHimself = userInfo.GoogleId == houseInvite.InvitedByUserId; if (isUserInvitingHimself) { throw new SelfReferencingHouseInviteException(); } houseInvite.UserId = userInfo.GoogleId; houseInvite.UserEmail = userInfo.Email; } catch (InvalidOperationException e) { if (!e.Message.Equals("Sequence contains no elements", StringComparison.Ordinal)) { throw; } } houseInvite = await _houseInviteRepository.InsertAsync(houseInvite, cancellationToken); return(houseInvite); }