public async Task<BeerDto> AddAsync(BeerDto beerDto)
        {
            var beer = Mapper.Map<BeerDto, Beer>(beerDto);
            if (beerDto.Recipe != null)
            {
                BeerCalculations(beer);
            }
            beer.BeerStyle = null;
            beer.CreatedDate = DateTime.Now;
            beer.UpdatedDate = DateTime.Now;

            await _beerRepository.AddAsync(beer);
            var result = await _beerRepository.GetSingleAsync(beer.BeerId, _include);
            var mappedResult = Mapper.Map<Beer, BeerDto>(result);
            await _beerElasticsearch.UpdateAsync(mappedResult);
            // elasticsearch relation managing
            if (mappedResult.ForkOfId != null)
                await ReIndexSingleElasticSearchAsync((int)mappedResult.ForkOfId);
            if (mappedResult.Brewers.Any())
                await _userService.ReIndexBeerRelationElasticSearch(beerDto);
            if (mappedResult.Breweries.Any())
                await _breweryService.ReIndexBeerRelationElasticSearch(beerDto);
            return mappedResult;

        }
        public async void AddBeer_Gets_Added()
        {
            var beer = new BeerDto
            {
                Name = "Test Beer",
                BeerStyle = new BeerStyleSimpleDto {Id = 1, Name = "American-Style Wheat Beer"},
                Brewers = new List<DTOUser> { new DTOUser { Username = "******"} },
            };

            var recipe = new RecipeDto
            {
                MashSteps = new List<MashStepDto>{new MashStepDto{StepNumber = 1}},
                //SpargeStep = new List<SpargeStepDto>{new SpargeStepDto{StepNumber = 2,Amount = 1, Temperature = 80}},
                SpargeStep = new SpargeStepDto{StepNumber = 2,Amount = 1, Temperature = 80},
                BoilSteps = new List<BoilStepDto> {new BoilStepDto {StepNumber = 3}},
                FermentationSteps = new List<FermentationStepDto> {new FermentationStepDto{StepNumber = 4}},
                Volume = 20,
                Efficiency = 75,
            };

            beer.Recipe = recipe;
            var beerDto = await _beerService.AddAsync(beer);
            Assert.NotNull(beerDto);
        }
 public async Task<IIndexResponse> UpdateAsync(BeerDto beerDto)
 {
     // Adds an analayzer to the name property in FermentableDto object.
     await _client.MapAsync<BeerDto>(d => d.Properties(p => p.String(s => s.Name(n => n.Name).Analyzer("autocomplete"))));
     return await _client.IndexAsync<BeerDto>(beerDto);
 }
        public async Task<IHttpActionResult> PutBeer(int id, BeerDto beerDto)
        {
            var isAllowed = ClaimsAuthorization.CheckAccess("Put", "BeerId", id.ToString());
            if (!isAllowed)
            {
                return StatusCode(HttpStatusCode.Unauthorized);
            }
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != beerDto.Id)
            {
                return BadRequest();
            }
            Log.Debug(JsonConvert.SerializeObject(beerDto));
            await _beerService.UpdateAsync(beerDto);
            return StatusCode(HttpStatusCode.NoContent);
        }
 public async Task<IHttpActionResult> PostBeer(BeerDto beerDto)
 {
     if (beerDto == null) return BadRequest("Missing data");
     if (!ModelState.IsValid)
     {
         return BadRequest(ModelState);
     }
     var username = HttpContext.Current.User.Identity.Name;
     if (username == null) return BadRequest("Missing user");
     var beer = await _beerService.AddAsync(beerDto, username);
     if (beer == null) return BadRequest();
     return CreatedAtRoute("DefaultApi", new { controller = "beers" }, beer);
 }
        public async Task UpdateAsync(BeerDto beerDto)
        {
            if (beerDto.Recipe != null) beerDto.Recipe.Id = beerDto.Id;
            var beer = Mapper.Map<BeerDto, Beer>(beerDto);

            if (beer.Recipe != null)
            {
                BeerCalculations(beer);
            }
            //Log.Debug(JsonConvert.SerializeObject(beer));
            await _beerRepository.UpdateAsync(beer);
            var result = await _beerRepository.GetSingleAsync(beerDto.Id, _include);
            var mappedResult = Mapper.Map<Beer, BeerDto>(result);
            await _beerElasticsearch.UpdateAsync(mappedResult);
            // elasticsearch relation managing
            if (mappedResult.Brewers.Any())
                await _userService.ReIndexBeerRelationElasticSearch(beerDto);
            if (mappedResult.Breweries.Any())
                await _breweryService.ReIndexBeerRelationElasticSearch(beerDto);
        }
 public async Task<BeerDto> AddAsync(BeerDto beerDto, string username)
 {
     if (beerDto.Brewers != null && beerDto.Brewers.All(b => b.Username != username))
     {
         if (beerDto.Breweries.Any())
         {
             var breweryMemberships = _breweryService.GetMemberships(username);
             if (beerDto.Breweries.Any(brewery => breweryMemberships.Any(b => b.BreweryId != brewery.Id)))
                 return null;
         }
     }
     else
     {
         if (beerDto.Brewers == null) beerDto.Brewers = new List<DTOUser>();
         if (beerDto.Brewers.Any(b => b.Username != username))
             beerDto.Brewers.Add(new DTOUser { Username = username });
     }
     var returnBeer = await AddAsync(beerDto);
     await _userService.UpdateNotification(username, new NotificationDto { Id = returnBeer.Id, Type = "UserBeer", Value = true });
     return returnBeer;
 }
 public async Task ReIndexBeerRelationElasticSearch(BeerDto beerDto)
 {
     foreach (var dtoUser in beerDto.Brewers)
     {
         var user = dtoUser;
         var result = await _userRepository.GetSingleAsync(user.Username, _userInclude);
         await _userElasticsearch.UpdateAsync(Mapper.Map<User, UserDto>(result));
     }
 }
 public async Task ReIndexBeerRelationElasticSearch(BeerDto beerDto)
 {
     foreach (var dtoBrewery in beerDto.Breweries)
     {
         var brewery = dtoBrewery;
         var result = await _breweryRepository.GetSingleAsync(brewery.Id, "Members.Member", "Origin", "Beers", "Socials", "Beers.Beer.IBU", "Beers.Beer.ABV", "Beers.Beer.SRM", "Beers.Beer.BeerStyle");
         var mappedResult = Mapper.Map<Brewery, BreweryDto>(result);
         await _breweryElasticsearch.UpdateAsync(mappedResult);
     }
 }