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; } }
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; } }
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); }
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); }