public ManageSubProjectController(UsersAccessRepository usersAccessRepository,
                                   SubProjectRepository subProjectRepository,
                                   ProjectRepository projectRepository,
                                   KeywordsRepository keywordsRepository) : base(usersAccessRepository)
 {
     _subProjectRepository = subProjectRepository;
     _projectRepository    = projectRepository;
     _keywordsRepository   = keywordsRepository;
 }
 public ManageKeywordsController(KeywordsRepository keywordsRepository, UsersAccessRepository usersAccessRepository)
     : base(usersAccessRepository)
 {
     _keywordsRepository = keywordsRepository;
 }
        /// <summary>
        /// This method is called to add or remove Keyword from article
        /// </summary>
        public void AddRemoveKeywords(string keywords, int infoID)
        {
            UnitOfWork unitOfWork = new UnitOfWork();
            KeywordsRepository keywordsRepository = new KeywordsRepository(unitOfWork);
            InfoRepository infoRepository = new InfoRepository(unitOfWork);

            Info info = infoRepository.GetByID(infoID);

            List<int> KeywordsIDList = new List<int>();
            if (keywords != null)
            {
                string[] keywordsArray = keywords.Split(',');

                foreach (var keywordInput in keywordsArray)
                {
                    string value = keywordInput.Trim();
                    value = Regex.Replace(value, @"\s+", " ");

                    Keyword keyword = keywordsRepository.GetAll(filter: x => x.Value == value).FirstOrDefault();

                    if (keyword == null)
                    {
                        if (value != string.Empty)
                        {
                            keyword = new Keyword();
                            keyword.Value = value;
                            keywordsRepository.Save(keyword);

                            KeywordsIDList.Add(keyword.ID);
                        }
                    }
                    else
                    {
                        KeywordsIDList.Add(keyword.ID);
                    }
                }
            }

            List<int> currentArticleKeywordsID = new List<int>();
            info.Keywords = info.Keywords == null ? info.Keywords = new List<Keyword>() : info.Keywords;

            try
            {
                foreach (var item in info.Keywords)
                {
                    currentArticleKeywordsID.Add(item.ID);
                }

                IEnumerable<int> removedKeywordsID = currentArticleKeywordsID.Except(KeywordsIDList);

                foreach (Keyword keyword in info.Keywords.ToList().Where(x => removedKeywordsID.Any(k => k == x.ID)))
                {
                    keyword.Info.Remove(info);
                    keywordsRepository.Save(keyword);
                }

                IEnumerable<int> addKeywordToArticle = KeywordsIDList.Except(currentArticleKeywordsID);

                foreach (var keyID in addKeywordToArticle)
                {
                    Keyword keyword = keywordsRepository.GetByID(keyID);
                    keyword.Info = keyword.Info == null ? new List<Info>() : keyword.Info;
                    keyword.Info.Add(info);

                    keywordsRepository.Save(keyword);
                }
                unitOfWork.Commit();
            }
            catch (Exception ex)
            {
                unitOfWork.RollBack();
                throw ex;
            }
        }