Exemplo n.º 1
0
        public ActionResult EditAchievement(int id, EditAchievementViewModel model)
        {
            //Add the Logged In User(Creator) ID to the Model
            model.EditorID = WebSecurity.CurrentUserId;
            ViewBag.ModelStateBeforeCode = ModelState.IsValid;
            //Create a new Unit of Work
            UnitOfWork work = new UnitOfWork();

            JPPConstants.AchievementQuestStates currentAchievementState = (JPPConstants.AchievementQuestStates)work.AchievementRepository.GetAchievementState(id);
            JPPConstants.AchievementQuestStates modelAchievementState = (JPPConstants.AchievementQuestStates)model.State;

            if (!currentAchievementState.Equals(JPPConstants.AchievementQuestStates.Draft) && modelAchievementState.Equals(JPPConstants.AchievementQuestStates.Draft))
                ModelState.AddModelError(String.Empty, "This Achievement was already moved out of draft mode, it cannot be moved back");

            #region Modify Model based on achievement type

            //Only scans get caretakers| Only thresholds have a threshold number and parent
            //Only user submissions have content types | Only system achievements have system trigger types
            //Only scans are repeatable | Only repeatable achievements have a delay, which must be at least 1

            JPPConstants.AchievementTypes achievementType = (JPPConstants.AchievementTypes)model.Type;
            model.IsRepeatable = !achievementType.Equals(JPPConstants.AchievementTypes.Scan) ? false : model.IsRepeatable;
            model.SelectedCaretakersList = achievementType.Equals(JPPConstants.AchievementTypes.Scan) ? model.SelectedCaretakersList : null;
            model.Threshold = achievementType.Equals(JPPConstants.AchievementTypes.Threshold) ? model.Threshold : null;
            model.ParentID = achievementType.Equals(JPPConstants.AchievementTypes.Threshold) ? model.ParentID : null;
            model.ContentType = achievementType.Equals(JPPConstants.AchievementTypes.UserSubmission) ? model.ContentType : null;
            model.SystemTriggerType = achievementType.Equals(JPPConstants.AchievementTypes.System) ? model.SystemTriggerType : null;
            model.RepeatDelayDays = model.RepeatDelayDays >= 1 ? model.RepeatDelayDays : 1;
            model.RepeatDelayDays = model.IsRepeatable ? model.RepeatDelayDays : null;

            #endregion

            if (model.Type == (int)JPPConstants.AchievementTypes.System && work.AchievementRepository.SystemAchievementExists((int)model.SystemTriggerType) && id != work.AchievementRepository.GetSystemAchievementID((int)model.SystemTriggerType))
                ModelState.AddModelError(String.Empty, "There is already a system achievement of that type");
            if (model.Icon == null && model.UploadedIcon == null)
                ModelState.AddModelError(String.Empty, "An icon must be selected for this achievement");
            if (model.Title != null)
                if (work.AchievementRepository.AchievementTitleExists(model.Title, id))
                    ModelState.AddModelError("", "An achievement with that title already exists");
            //Check to make sure the model is valid
            if (ModelState.IsValid)
            {

                try
                {

                    if (model.UploadedIcon != null)
                    {
                        String filePath = Utilities.JPPDirectory.CreateFilePath(JPPDirectory.ImageTypes.NewIconUpload);
                        model.Icon = filePath.Replace("~/Content/Images/Icons/", "");
                        model.Icon = model.Icon.Replace(".png", "");
                        JPPImage.Save(Server, filePath, model.UploadedIcon.InputStream, 400, 400, true);
                    }

                    Utilities.JPPDirectory.CheckAndCreateAchievementAndQuestDirectory(Server);
                    achievement_template template = work.EntityContext.achievement_template.Find(id);
                    model.IconFilePath = template == null ?
                        Utilities.JPPDirectory.CreateFilePath(JPPDirectory.ImageTypes.AchievementIcon) :
                        template.icon;
                    if (model.IconFilePath.Contains(".jpg"))
                        model.IconFilePath = model.IconFilePath.Replace(".jpg", "");
                    if (!model.IconFilePath.Contains(".png"))
                        model.IconFilePath += ".png";
                   if(JPPImage.SaveAchievementIcons(model.IconFilePath, model.Icon, model.PointsCreate, model.PointsExplore, model.PointsLearn, model.PointsSocialize))
                    {
                        //Add the Achievement to the Database
                        work.AchievementRepository.AdminEditAchievement(id, model);

                        //Return to the Admin index page
                        TempData["Message"] = "The changes to " + model.Title + " were successfully saved.";
                        return RedirectToAction("EditAchievementList");
                    }
                }
                catch(Exception e)
                {
                    ModelState.AddModelError("", "Achievement Editing Failed: " + e.Message);
                }
            }

            //Modelstate was not valid, refresh the ViewModel
            AddAchievementViewModel refreshModel = AddAchievementViewModel.Populate();
            model.PotentialCaretakersList = refreshModel.PotentialCaretakersList;
            model.ParentAchievements = refreshModel.ParentAchievements;
            model.IconList = refreshModel.IconList;
            //Return the user to the EditAchievement view with the current model
            return View(model);
        }
        public void AdminEditAchievement(int id, EditAchievementViewModel model)
        {
            achievement_template currentAchievement = _dbContext.achievement_template.Find(id);
            List<LoggerModel> logChanges = new List<LoggerModel>();
            //Create all the requirements for the achievement to be added to the database
            List<achievement_requirement> requirementsList = new List<achievement_requirement>();
            if (!String.IsNullOrWhiteSpace(model.Requirement1))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement1 });
            if (!String.IsNullOrWhiteSpace(model.Requirement2))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement2 });
            if (!String.IsNullOrWhiteSpace(model.Requirement3))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement3 });
            if (!String.IsNullOrWhiteSpace(model.Requirement4))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement4 });
            if (!String.IsNullOrWhiteSpace(model.Requirement5))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement5 });
            if (!String.IsNullOrWhiteSpace(model.Requirement6))
                requirementsList.Add(new achievement_requirement { achievement_id = currentAchievement.id, description = model.Requirement6 });

            //Get the old list of requirements and remove them from the database to prevent duplicate entries
            List<achievement_requirement> oldRequirements = _dbContext.achievement_requirement.Where(ar => ar.achievement_id == currentAchievement.id).ToList();
            foreach (achievement_requirement requirement in oldRequirements)
                _dbContext.achievement_requirement.Remove(requirement);

            //Create all the caretakers for the achievement to be added to the database
            List<achievement_caretaker> caretakersList = new List<achievement_caretaker>();
            if (model.SelectedCaretakersList != null)
                for (int j = 0; j < model.SelectedCaretakersList.Count; j++)
                    caretakersList.Add(new achievement_caretaker() { achievement_id = currentAchievement.id, caretaker_id = model.SelectedCaretakersList[j] });

            //Get the old list of caretakers and remove them from the database to prevent duplicate entries
            List<achievement_caretaker> oldCaretakers = _dbContext.achievement_caretaker.Where(ac => ac.achievement_id == currentAchievement.id).ToList();
            foreach (achievement_caretaker caretaker in oldCaretakers)
                _dbContext.achievement_caretaker.Remove(caretaker);

            //Compare the current achievement values in the DB to the model, if they are different, set the current achievement values equal to the model values
            #region//ContentType
            if (model.ContentType != currentAchievement.content_type)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.ContentType.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.content_type.ToString(),
                    Value2 = model.ContentType.ToString()
                });
                currentAchievement.content_type = model.ContentType;
            }
            #endregion

            #region//Description
            if (!String.IsNullOrWhiteSpace(model.Description) && !String.Equals(currentAchievement.description, model.Description))
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Description.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.description,
                    Value2 = model.Description
                });
                currentAchievement.description = model.Description;
            }
            #endregion

            #region//Hidden
            if (currentAchievement.hidden != model.Hidden)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Hidden.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.hidden.ToString(),
                    Value2 = model.Hidden.ToString()
                });
                currentAchievement.hidden = model.Hidden;
            }
            #endregion

            #region//Base Icon
            if (!String.IsNullOrWhiteSpace(model.Icon) && !String.Equals(currentAchievement.icon_file_name, model.Icon))
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Icon.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.icon_file_name.ToString(),
                    Value2 = model.Icon.ToString()
                });
                currentAchievement.icon = model.IconFilePath;
                currentAchievement.icon_file_name = model.Icon;
            }
            #endregion

            #region//Icon File Path
            if (!String.IsNullOrWhiteSpace(model.IconFilePath) && !String.Equals(currentAchievement.icon, model.IconFilePath))
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Icon.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.icon.ToString(),
                    Value2 = model.IconFilePath.ToString()
                });
                currentAchievement.icon = model.IconFilePath;
                currentAchievement.icon_file_name = model.Icon;
            }
            #endregion

            #region//IsRepeatable
            if (currentAchievement.is_repeatable != model.IsRepeatable)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.IsRepeatable.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.is_repeatable.ToString(),
                    Value2 = model.IsRepeatable.ToString()
                });
                currentAchievement.is_repeatable = model.IsRepeatable;
            }
            #endregion

            #region//Last Modified By (userID and DateTime)
            currentAchievement.last_modified_by_id = model.EditorID;
            currentAchievement.modified_date = DateTime.Now;
            #endregion

            #region//Parent Achievement ID
            if (currentAchievement.parent_id != model.ParentID)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.ParentID.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.parent_id.ToString(),
                    Value2 = model.ParentID.ToString()
                });
                currentAchievement.parent_id = model.ParentID;
            }
            #endregion

            #region//Points Create
            if (currentAchievement.points_create != model.PointsCreate)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.PointsCreate.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.points_create.ToString(),
                    Value2 = model.PointsCreate.ToString()
                });
                currentAchievement.points_create = model.PointsCreate;
            }
            #endregion

            #region//Points Explore
            if (currentAchievement.points_explore != model.PointsExplore)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.PointsExplore.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.points_explore.ToString(),
                    Value2 = model.PointsExplore.ToString()
                });
                currentAchievement.points_explore = model.PointsExplore;
            }
            #endregion

            #region//Points Learn
            if (currentAchievement.points_learn != model.PointsLearn)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.PointsLearn.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.points_learn.ToString(),
                    Value2 = model.PointsLearn.ToString()
                });
                currentAchievement.points_learn = model.PointsLearn;
            }
            #endregion

            #region//Points Socialize
            if (currentAchievement.points_socialize != model.PointsSocialize)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.PointsSocialize.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.points_socialize.ToString(),
                    Value2 = model.PointsSocialize.ToString()
                });
                currentAchievement.points_socialize = model.PointsSocialize;
            }
            #endregion

            #region//Posted Date
            if (currentAchievement.state != model.State && model.State == (int)JPPConstants.AchievementQuestStates.Active && currentAchievement.posted_date == null)
                currentAchievement.posted_date = DateTime.Now;
            #endregion

            #region//Repeat Delay Days
            if (currentAchievement.repeat_delay_days != model.RepeatDelayDays)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.RepeatDelayDays.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.repeat_delay_days.ToString(),
                    Value2 = model.RepeatDelayDays.ToString()
                });
                currentAchievement.repeat_delay_days = model.RepeatDelayDays;
            }
            #endregion

            #region//Retire Date
            if (currentAchievement.state != model.State && model.State == (int)JPPConstants.AchievementQuestStates.Retired && currentAchievement.retire_date == null)
                currentAchievement.retire_date = DateTime.Now;
            if (currentAchievement.state != model.State && currentAchievement.state == (int)JPPConstants.AchievementQuestStates.Retired)
                currentAchievement.retire_date = null;
            #endregion

            #region//Achievement State
            if (currentAchievement.state != model.State)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.State.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.state.ToString(),
                    Value2 = model.State.ToString()
                });
                currentAchievement.state = model.State;
            }
            #endregion

            #region//Featured
            if (currentAchievement.state != (int)JPPConstants.AchievementQuestStates.Active)
                currentAchievement.featured = false;
            #endregion

            #region//System Trigger Type
            if (currentAchievement.system_trigger_type != model.SystemTriggerType)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.SystemTriggerType.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.system_trigger_type.ToString(),
                    Value2 = model.SystemTriggerType.ToString()
                });
                currentAchievement.system_trigger_type = model.SystemTriggerType;
            }
            #endregion

            #region//Threshold
            if (currentAchievement.threshold != model.Threshold)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Threshold.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.threshold.ToString(),
                    Value2 = model.Threshold.ToString()
                });
                currentAchievement.threshold = model.Threshold;
            }
            #endregion

            #region//Title
            if (!String.IsNullOrWhiteSpace(model.Title) && !String.Equals(currentAchievement.title, model.Title))
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Title.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.title.ToString(),
                    Value2 = model.Title.ToString()
                });
                currentAchievement.title = model.Title;
            }
            #endregion

            #region//Type
            if (currentAchievement.type != model.Type)
            {
                logChanges.Add(new LoggerModel()
                {
                    Action = "Edit Achievement: " + Logger.EditAchievementLogType.Type.ToString(),
                    UserID = model.EditorID,
                    IPAddress = HttpContext.Current.Request.UserHostAddress,
                    TimeStamp = DateTime.Now,
                    IDType1 = Logger.LogIDType.AchievementTemplate.ToString(),
                    ID1 = id,
                    Value1 = currentAchievement.type.ToString(),
                    Value2 = model.Type.ToString()
                });
                currentAchievement.type = model.Type;
            }
            #endregion

            if (logChanges.Count > 0)
                Logger.LogMultipleEntries(logChanges, _dbContext);

            AddRequirementsToDatabase(requirementsList);
            AddCaretakersToDatabase(caretakersList);

            Save();
        }