Example #1
0
        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);
        }
Example #2
0
        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);
        }