コード例 #1
0
        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
            });
        }