public CreateNewCampaignResponse CreateCampaign(CreateNewCampaignRequest request) { var fromBuilding = _context.Building.FirstOrDefault(b => b.IdBuilding == request.FromIdBuilding); var toBuilding = _context.Building.FirstOrDefault(b => b.IdBuilding == request.ToIdBuilding); var client = _context.Client.SingleOrDefault(p => p.IdClient == request.IdClient); if (client == null) { throw new UserDoesntExistExcetion($"User with id = {request.IdClient} doesn't exist"); } if (fromBuilding == null) { throw new BuildingDoesntExistException($"Building with id {request.FromIdBuilding} doesn't exist!"); } if (toBuilding == null) { throw new BuildingDoesntExistException($"Building with id {request.ToIdBuilding} doesn't exist!"); } if (request.StartDate > request.EndDate) { throw new WrongDateException($"Start date={request.StartDate} can't be grater than {request.EndDate}"); } if (!fromBuilding.Street.Equals(toBuilding.Street) || !fromBuilding.City.Equals(toBuilding.City)) { throw new BuildingsOnDifferentStreetsException("Buldings are on different streets!"); } var newCampaign = new Campaign() { IdClient = request.IdClient, StartDate = request.StartDate, EndDate = request.EndDate, PricePerSquareMeter = request.PricePerSquareMeter, FromIdBuilding = request.FromIdBuilding, ToIdBuilding = request.ToIdBuilding }; var bannerBuildings = _context.Building .Where(b => b.StreetNumber >= fromBuilding.StreetNumber && b.StreetNumber <= toBuilding.StreetNumber) .OrderByDescending(b => b.Height) .ToList(); var banerAreas = _calculatorService.CalculateMinBanerArea(bannerBuildings, fromBuilding, toBuilding); var newBanner1 = new Banner() { Name = 1, Price = banerAreas[0] * request.PricePerSquareMeter, Campaign = newCampaign, Area = banerAreas[0] }; var newBanner2 = new Banner() { Name = 2, Price = banerAreas[1] * request.PricePerSquareMeter, Campaign = newCampaign, Area = banerAreas[1] }; _context.Campaign.Add(newCampaign); _context.Banner.AddRange(newBanner1, newBanner2); _context.SaveChanges(); return(new CreateNewCampaignResponse() { IdClient = request.IdClient, StartDate = request.StartDate, EndDate = request.EndDate, PricePerSquareMeter = request.PricePerSquareMeter, FromIdBuilding = request.FromIdBuilding, ToIdBuilding = request.ToIdBuilding, Banners = new List <Banner>() { newBanner1, newBanner2 }, Price = (newBanner1.Area + newBanner2.Area) * request.PricePerSquareMeter }); }