public IActionResult Announce(AnnounceViewModel model)
        {
            var date = DateTime.Now;

            if (ModelState.IsValid)
            {
                string uniqueFileName = null;
                if (model.ImageFile != null)
                {
                    uniqueFileName = Utils.FileProcess.UploadFile(model.ImageFile, hostingEnvironment);
                }

                var article = new Article
                {
                    Name           = model.Name,
                    Category       = model.getCategory(),
                    Price          = model.Price,
                    Description    = model.Description,
                    SellerUserName = User.Identity.Name,
                    ImageFilePath  = uniqueFileName,
                };
                context.Articles.Add(article);
                context.SaveChanges();
                var announcement = new Announcement
                {
                    Title     = model.Title,
                    Date      = date,
                    ArticleId = article.Id,
                };
                context.Announcements.Add(announcement);
                context.SaveChanges();
                return(RedirectToAction("Announcements"));
            }
            return(View(model));
        }
        public IActionResult Announcements(double?maxPrice, double?minPrice, string searchText = "", string category = "", int page = 1, string seller = "", string state = "All")
        {
            var announcements = from announcement in context.Announcements
                                join article in context.Articles on announcement.ArticleId equals article.Id
                                select new AnnounceViewModel
            {
                Id             = announcement.Id,
                ArticleId      = article.Id,
                Title          = announcement.Title,
                SellerUserName = article.SellerUserName,
                Date           = announcement.Date,
                Name           = article.Name,
                Category       = article.Category.ToString(),
                Price          = article.Price,
                Description    = article.Description,
                Sold           = article.Sold,
                Owner          = article.Owner,
            };

            // Filter by category
            if (!string.IsNullOrEmpty(category) && category.ToLower() != "all")
            {
                announcements = announcements.Where(e => e.getCategory() == AnnounceViewModel.getCategory(category));
            }
            // Filter by price
            if (minPrice != null)
            {
                announcements = announcements.Where(e => e.Price >= minPrice);
            }
            if (maxPrice != null)
            {
                announcements = announcements.Where(e => e.Price <= maxPrice);
            }
            // Filter by text
            if (!string.IsNullOrEmpty(searchText))
            {
                announcements = announcements.Where(e =>
                                                    e.Description.Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                                    e.Title.Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                                    e.SellerUserName.Contains(searchText, StringComparison.CurrentCultureIgnoreCase)
                                                    );
            }
            if (!string.IsNullOrEmpty(seller))
            {
                announcements = announcements.Where(e => e.SellerUserName.Equals(seller));
            }
            if (!User.IsInRole("Admin"))
            {
                announcements = announcements.Where(e => !e.Sold);
            }
            else
            {
                if (state.ToLower() == "free")
                {
                    announcements = announcements.Where(e => !e.Sold);
                }
                else if (state.ToLower() == "sold")
                {
                    announcements = announcements.Where(e => e.Sold);
                }
            }

            int amount = announcements.Count();

            announcements = announcements.OrderByDescending(e => e.Date).Skip(4 * (page - 1)).Take(4);

            return(View(new AnnouncementsViewModel
            {
                Announcements = announcements,
                Page = page,
                SearchText = searchText,
                MinPrice = minPrice,
                MaxPrice = maxPrice,
                Category = category,
                TotalPages = (int)Math.Ceiling((decimal)amount / 4),
                Seller = seller,
                State = state
            }));
        }
        public IActionResult Auctions(double?minPrice, double?maxPrice, string searchText = "", string aCategory = "All", string state = "", int page = 1)
        {
            var auctions = from article in context.Articles
                           join auction in context.Auctions on article.Id equals auction.ArticleId
                           select new
            {
                auction.Id,
                article.Name,
                article.Category,
                auction.Title,
                auction.Details,
                auction.SellerUserName,
                auction.CurrentPrice,
                auction.Begin,
                auction.End,
                auction.ArticleId
            };

            if (minPrice != null)
            {
                auctions = auctions.Where(e => minPrice <= e.CurrentPrice);
            }
            if (maxPrice != null)
            {
                auctions = auctions.Where(e => e.CurrentPrice <= maxPrice);
            }
            if (!string.IsNullOrEmpty(searchText))
            {
                auctions = auctions
                           .Where(e => e.Title.Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                  e.Details.Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                  e.Name.Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                  e.Category.ToString().Contains(searchText, StringComparison.CurrentCultureIgnoreCase) ||
                                  e.SellerUserName.ToString().Contains(searchText, StringComparison.CurrentCultureIgnoreCase)
                                  );
            }
            if (!string.IsNullOrEmpty(aCategory) && aCategory.ToLower() != "all")
            {
                auctions = auctions.Where(e => AnnounceViewModel.getCategory(aCategory) == e.Category);
            }
            if (!string.IsNullOrEmpty(state) && state.ToLower() != "all")
            {
                DateTime now = DateTime.Now;

                if (state.ToLower() == "closed")
                {
                    auctions = auctions.Where(e => e.End.CompareTo(now) == -1);
                }
                if (state.ToLower() == "coming")
                {
                    auctions = auctions.Where(e => e.Begin.CompareTo(now) == 1);
                }
                if (state.ToLower() == "running")
                {
                    auctions = auctions.Where(e => e.Begin.CompareTo(now) <= 0 && e.End.CompareTo(now) >= 0);
                }
            }

            int amount = auctions.Count();

            auctions = auctions.OrderByDescending(e => e.Begin).Skip(4 * (page - 1)).Take(4);

            List <Auction> listAuctions = new List <Auction>();

            foreach (var auction in auctions)
            {
                listAuctions.Add(new Auction
                {
                    Id             = auction.Id,
                    ArticleId      = auction.ArticleId,
                    Title          = auction.Title,
                    Details        = auction.Details,
                    SellerUserName = auction.SellerUserName,
                    CurrentPrice   = auction.CurrentPrice,
                    Begin          = auction.Begin,
                    End            = auction.End
                });
            }

            return(View(new AuctionsViewModel
            {
                Auctions = listAuctions,
                Page = page,
                SearchText = searchText,
                MinPrice = minPrice,
                MaxPrice = maxPrice,
                ACategory = aCategory,
                State = state,
                TotalPages = (int)Math.Ceiling((decimal)amount / 4)
            }));
        }