public ActionResult NewCollection()
        {
            var model = new EditCollectionModel
            {
                Collection = new Collection
                {
                    Cards        = new List <CollectionCard>(),
                    CreateDate   = DateTime.Now,
                    LastEditDate = DateTime.Now
                }
            };

            return(View("EditCollection", model));
        }
        public ActionResult EditCollection(int id)
        {
            var email = ((ClaimsIdentity)User.Identity).Claims.First(i => i.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress").Value;
            var user  = ApplicationUserEngine.GetApplicationUser(email);

            if (user.Collections.Any(i => i.CollectionId == id))
            {
                var collection = user.Collections.First(i => i.CollectionId == id);
                var model      = new EditCollectionModel
                {
                    Collection = collection,
                    RawList    = CardListParsingEngine.GetCardList(collection.Cards)
                };

                return(View("EditCollection", model));
            }

            TempData["AlertMsg"] = "<br /><div class=\"alert alert-danger alert-dismissible\">" +
                                   "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>" +
                                   "<strong>You are not authorized to edit this collection.</div>";

            return(View("Error"));
        }
        public ActionResult SaveCollection(EditCollectionModel model)
        {
            var email           = ((ClaimsIdentity)User.Identity).Claims.First(i => i.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress").Value;
            var collectionCards = CardListParsingEngine.ParseCardList(model.RawList, out var error);

            if (string.IsNullOrEmpty(model.Collection.Name))
            {
                model.Collection.Name = "Unnamed Collection";
            }
            else
            {
                model.Collection.Name = model.Collection.Name.Trim();
            }

            if (!string.IsNullOrEmpty(error))
            {
                TempData["AlertMsg"] = "<br /><div class=\"alert alert-danger alert-dismissible\">" +
                                       "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>" +
                                       $"<strong>{error}</div>";

                return(View("EditCollection", model));
            }

            if (!CardListParsingEngine.VerifyCardList(collectionCards, out collectionCards, out error))
            {
                TempData["AlertMsg"] = "<br /><div class=\"alert alert-danger alert-dismissible\">" +
                                       "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>" +
                                       $"<strong>{error}</div>";

                return(View("EditCollection", model));
            }

            model.Collection.Cards = collectionCards;

            // only change the date if it's not a new collection in order to keep the dates the same for the first save
            if (model.Collection.CollectionId > 0)
            {
                model.Collection.LastEditDate = DateTime.Now;
            }

            // make a backup of the list, since we have to null the original list in AddOrUpdateUserCollection() in order to save new lists
            var cardList = new List <CollectionCard>(model.Collection.Cards);

            // Save the collection details (this method nulls the collection list)
            ApplicationUserEngine.AddOrUpdateUserCollection(email, model.Collection, out error);

            // Only attempt to save the list if nothing is wrong with saving the collection
            if (string.IsNullOrEmpty(error))
            {
                ApplicationUserEngine.AddOrUpdateUserCollectionCard(model.Collection.CollectionId, cardList, out error);
            }

            // Some error saving the collection; display it
            if (!string.IsNullOrEmpty(error))
            {
                TempData["AlertMsg"] = "<br /><div class=\"alert alert-danger alert-dismissible\">" +
                                       "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>" +
                                       $"<strong>{error}</div>";

                // clean the list up (remove blank lines)
                model.RawList = Regex.Replace(model.RawList, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);

                ModelState.Clear();

                return(View("EditCollection", model));
            }

            ApplicationUserEngine.UpdateUserInCache(email);

            TempData["AlertMsg"] = "<br /><div class=\"alert alert-success alert-dismissible\">" +
                                   "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>" +
                                   "<strong>The Collection was saved successfully.</div>";

            return(RedirectToAction("EditCollection", new { id = model.Collection.CollectionId }));
        }