Example #1
0
        public async Task <HouseInfo> GetHouseInfoByIdAvailableForUserAsync(
            BsonObjectId houseId,
            decimal userId,
            CancellationToken cancellationToken = default)
        {
            var houseFilter = Builders <HouseInfo> .Filter.Eq(hi => hi.Id, houseId);

            var userFilter = BuilderFactory.CreateHouseOwnerOrMembershipFilter(userId);

            var pipeline = new EmptyPipelineDefinition <HouseInfo>()
                           .Match(houseFilter)
                           .Match(userFilter);

            try
            {
                var houseInfo = await _houseRepository.FindOneAsync(pipeline, cancellationToken);

                return(houseInfo);
            }
            catch (InvalidOperationException e)
            {
                if (e.Message.Equals("Sequence contains no elements", StringComparison.Ordinal))
                {
                    throw new HouseNotFoundException();
                }

                throw;
            }
        }
Example #2
0
        public async Task <List <string> > GetUsedTagsByHouseIdAsync(
            BsonObjectId houseId,
            decimal userId,
            CancellationToken cancellationToken = default)
        {
            var houseFilter = Builders <HouseInfo> .Filter.Eq(hi => hi.Id, houseId);

            var userFilter = BuilderFactory.CreateHouseOwnerOrMembershipFilter(userId);

            var project = Builders <HouseInfo> .Projection.Expression(hi => hi.Transactions.SelectMany(t => t.Tags).Distinct().ToList());

            var pipeline = new EmptyPipelineDefinition <HouseInfo>()
                           .Match(houseFilter)
                           .Match(userFilter)
                           .Project(project);

            try
            {
                var tags = await _houseRepository.FindOneAsync(pipeline, cancellationToken);

                return(tags);
            }
            catch (InvalidOperationException e)
            {
                if (e.Message.Equals("Sequence contains no elements", StringComparison.Ordinal))
                {
                    throw new HouseNotFoundException();
                }

                throw;
            }
        }
Example #3
0
        public async Task DeleteTransactionAsync(
            BsonObjectId houseId,
            BsonObjectId transactionId,
            decimal userId,
            CancellationToken cancellationToken = default)
        {
            var houseFilter = Builders <HouseInfo> .Filter.Eq(hi => hi.Id, houseId);

            var userFilter = BuilderFactory.CreateHouseOwnerOrMembershipFilter(userId);
            var filter     = Builders <HouseInfo> .Filter.And(houseFilter, userFilter);

            var update = Builders <HouseInfo> .Update.PullFilter(
                hi => hi.Transactions,
                Builders <TransactionInfo> .Filter.Eq(t => t.Id, transactionId));

            await _houseRepository.UpdateOneAsync(
                filter,
                update,
                cancellationToken);
        }
Example #4
0
        public async Task <TransactionInfo> CreateTransactionAsync(
            TransactionCreationRequest transactionCreationRequest,
            decimal userId,
            CancellationToken cancellationToken = default)
        {
            var transaction = _mapper.Map <TransactionInfo>(transactionCreationRequest);

            transaction.Id           = ObjectId.GenerateNewId();
            transaction.CreationDate = DateTime.UtcNow;

            var houseFilter = Builders <HouseInfo> .Filter.Eq(hi => hi.Id, transactionCreationRequest.HouseId);

            var userFilter = BuilderFactory.CreateHouseOwnerOrMembershipFilter(userId);
            var filter     = Builders <HouseInfo> .Filter.And(houseFilter, userFilter);

            var update = Builders <HouseInfo> .Update.Push(hi => hi.Transactions, transaction);

            await _houseRepository.UpdateOneAsync(
                filter,
                update,
                cancellationToken);

            return(transaction);
        }