public async Task <ActionResult> EditUserLink(LinkVM linkVM)
        {
            using (ChekitDB chekitDB = new ChekitDB())
            {
                LinkDTO linkDTO = await chekitDB.Links.FirstOrDefaultAsync(x => x.LinkID == linkVM.LinkID);

                linkDTO.LinkName = linkVM.LinkName;

                if (linkVM.PublicStatus == false)
                {
                    linkDTO.PublicStatus = false;
                }
                else
                {
                    linkDTO.PublicStatus = linkVM.PublicStatus;
                }
                linkDTO.LinkDescription = linkVM.LinkDescription;

                await chekitDB.SaveChangesAsync();

                TempData["OK"] = "Закладка отредактирована";

                return(RedirectToAction("LinkInfo", new { id = linkVM.LinkID }));
            }
        }
        public async Task <ActionResult> EditPassword(ProfileVM profileVM, string oldPass)
        {
            using (var profile = new ChekitDB())
            {
                var modelDTO = new ProfileDTO()
                {
                    UsersProfileDTO = await profile.Users.FirstOrDefaultAsync(x => x.UserId == profileVM.UserInfo.UserId)
                };

                if (oldPass != modelDTO.UsersProfileDTO.Password)
                {
                    ModelState.AddModelError("oldPassError", "Старый пароль указан не верно");

                    return(View(profileVM));
                }

                modelDTO.UsersProfileDTO.Password = profileVM.UserInfo.Password;

                await profile.SaveChangesAsync();

                TempData["OK"] = "Пароль успешно изменен";

                return(RedirectToAction("Index"));
            }
        }
        //добавление ключевого слова
        public async Task <ActionResult> AddBlackListSite(string banWord)
        {
            ProfileVM profileVM = new ProfileVM();

            using (var profile = new ChekitDB())
            {
                BannedSiteDTO bannedSiteDTO = new BannedSiteDTO()
                {
                    SiteLink = banWord
                };

                profile.BannedSiteDTO.Add(bannedSiteDTO);

                await profile.SaveChangesAsync();

                var modelDTO = new ProfileDTO()
                {
                    BannedSiteListDTO = await profile.BannedSiteDTO.ToListAsync()
                };

                TempData["OK"] = "Имя ресурса добавлено";

                profileVM.BannedSiteVM = modelDTO.BannedSiteListDTO.OrderBy(x => x.SiteId).Select(x => new BannedSiteVM(x)).ToList();

                return(RedirectToAction("SiteBlackList"));
            }
        }
        //переименовываем выбранную категорию
        public async Task <ActionResult> RenameCategory(ProfileVM profileVM, int catId, string catName)
        {
            using (var profile = new ChekitDB())
            {
                var modelDTO = new ProfileDTO()
                {
                    UserCategoryDTO        = await profile.Categories.FirstOrDefaultAsync(x => x.CategoryId == catId),
                    LinkListUserProfileDTO = await profile.Links.ToListAsync()
                };

                //и вместе с ней переименовываем закладки в этой категории
                foreach (var item in modelDTO.LinkListUserProfileDTO.Where(x => x.LinkCategoryId == catId).ToList())
                {
                    item.LinkCategory = catName;
                }

                modelDTO.UserCategoryDTO.CategoryName = catName;

                await profile.SaveChangesAsync();
            }

            TempData["OK"] = "Имя категории успешно изменено";

            return(RedirectToAction("EditUserCategory", new { id = profileVM.UserInfo.UserId }));
        }
        //админ может удалить любую закладку
        public async Task <ActionResult> DeleteLink(int id)
        {
            using (ChekitDB chekitDB = new ChekitDB())
            {
                LinkDTO linkDTO = await chekitDB.Links.FindAsync(id);

                chekitDB.Links.Remove(linkDTO);

                await chekitDB.SaveChangesAsync();
            }

            TempData["OK"] = "Закладка удалена";

            return(RedirectToAction("Index"));
        }
        //удаление категории
        public async Task <ActionResult> DeleteCategory(ProfileVM profileVM, int deleteCatId)
        {
            using (var profile = new ChekitDB())
            {
                var modelDTO = new ProfileDTO()
                {
                    UsersProfileDTO        = await profile.Users.FirstOrDefaultAsync(x => x.UserId == profileVM.UserInfo.UserId),
                    UserCategoryDTO        = await profile.Categories.FirstOrDefaultAsync(x => x.CategoryId == deleteCatId),
                    LinkListUserProfileDTO = await profile.Links.ToListAsync()
                };

                if (modelDTO.LinkListUserProfileDTO.Where(x => x.LinkCategoryId == deleteCatId).Any())
                {
                    foreach (var item in modelDTO.LinkListUserProfileDTO.Where(x => x.LinkCategoryId == deleteCatId).ToList())
                    {
                        profile.Links.Remove(item);

                        //уменьшаем кол-во ссылок юзера
                        modelDTO.UsersProfileDTO.LinksCount -= 1;

                        string linkAvatar = Request.MapPath("~/Screenshots/Uploads/LinkAvatars/" + $"{item.LinkID.ToString()}/" + item.LinkPicture);

                        string linkDirectory = Request.MapPath("~/Screenshots/Uploads/LinkAvatars/" + item.LinkID.ToString());

                        if (System.IO.File.Exists(linkAvatar))
                        {
                            System.IO.File.Delete(linkAvatar); //удаляем скриншот
                            Directory.Delete(linkDirectory);   //удаляем папку
                        }
                        else//если скриншота нет, то удаляем только директорию
                        {
                            Directory.Delete(linkDirectory);
                        }
                    }
                }

                profile.Categories.Remove(modelDTO.UserCategoryDTO);

                await profile.SaveChangesAsync();
            }

            TempData["OK"] = "Категория и её ссылки удалены";

            return(RedirectToAction("EditUserCategory", new { id = profileVM.UserInfo.UserId }));
        }
        public async Task <ActionResult> EditUser(UserProfileVM userVM, HttpPostedFileBase file)
        {
            int userId = userVM.UserId;

            if (!ModelState.IsValid)
            {
                return(View("Error"));
            }

            using (ChekitDB chekitDB = new ChekitDB())
            {
                if (await chekitDB.Users.Where(x => x.UserId != userVM.UserId).AnyAsync(x => x.Login == userVM.Login))
                {
                    ModelState.AddModelError("loginmatch", $"Логин {userVM.Login} занят");

                    return(View(userVM));
                }
                else if (await chekitDB.Users.Where(x => x.UserId != userVM.UserId).AnyAsync(x => x.Email == userVM.Email))
                {
                    ModelState.AddModelError("emailmatch", $"Email {userVM.Email} занят");

                    return(View(userVM));
                }
            }

            using (ChekitDB chekitDB = new ChekitDB())
            {
                UsersDTO usersDTO = await chekitDB.Users.FindAsync(userId);

                usersDTO.Login      = userVM.Login;
                usersDTO.Email      = userVM.Email;
                usersDTO.Password   = usersDTO.Password;
                usersDTO.AvatarName = userVM.AvatarName;

                await chekitDB.SaveChangesAsync();
            }

            TempData["OK"] = "Профиль отредактирован";

            #region Image Upload

            if (file != null && file.ContentLength > 0)
            {
                string extension = file.ContentType.ToLower();

                string[] extensions = { "image/jpg", "image/jpeg", "image/gif", "image/png" };
                int      counter    = 0;

                //Проверяем расширение файла
                foreach (var item in extensions)
                {
                    if (extension != item)
                    {
                        counter++;

                        if (counter == extensions.Length)
                        {
                            using (ChekitDB chekitDB = new ChekitDB())
                            {
                                ModelState.AddModelError("", "Изображение не было загружено - неправильный формат изображения");

                                return(View(userVM));
                            }
                        }
                    }
                }

                var originalDirectory = new DirectoryInfo(string.Format($"{Server.MapPath(@"\")}Avatars\\Uploads"));

                var pathString1 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + userId.ToString());
                var pathString2 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + userId.ToString() + "\\Thumbs");

                DirectoryInfo directoryInfo1 = new DirectoryInfo(pathString1);
                DirectoryInfo directoryInfo2 = new DirectoryInfo(pathString2);

                foreach (var item in directoryInfo1.GetFiles())
                {
                    item.Delete();
                }

                foreach (var item in directoryInfo2.GetFiles())
                {
                    item.Delete();
                }

                string avatarName = file.FileName;

                using (ChekitDB chekitDB = new ChekitDB())
                {
                    UsersDTO usersDTO = await chekitDB.Users.FindAsync(userId);

                    usersDTO.AvatarName = avatarName;

                    await chekitDB.SaveChangesAsync();
                }

                var pathOriginalAvatar = string.Format($"{pathString1}\\{avatarName}");
                var pathLittleAvatar   = string.Format($"{pathString2}\\{avatarName}");

                file.SaveAs(pathOriginalAvatar);

                WebImage littleAvatar = new WebImage(file.InputStream);
                littleAvatar.Resize(150, 150);
                littleAvatar.Save(pathLittleAvatar);
            }

            #endregion

            return(RedirectToAction("Index"));
        }
        public async Task <ActionResult> CreateAdminUser(UserVM userVM, HttpPostedFileBase file)
        {
            if (!ModelState.IsValid)
            {
                return(View(userVM));
            }

            int idForAvatar = 0;

            using (ChekitDB chekitDB = new ChekitDB())
            {
                if (await chekitDB.Users.AnyAsync(x => x.Login == userVM.Login))
                {
                    ModelState.AddModelError("loginmatch", $"Логин {userVM.Login} занят");

                    return(View(userVM));
                }
                else if (await chekitDB.Users.AnyAsync(x => x.Email == userVM.Email))
                {
                    ModelState.AddModelError("emailmatch", $"Email {userVM.Email} занят");

                    return(View(userVM));
                }

                UsersDTO usersDTO = new UsersDTO();

                usersDTO.Login      = userVM.Login;
                usersDTO.Email      = userVM.Email;
                usersDTO.Password   = userVM.Password;
                usersDTO.BanStatus  = false;
                usersDTO.LinksCount = 0;
                usersDTO.Role       = "Админ";

                chekitDB.Users.Add(usersDTO);
                await chekitDB.SaveChangesAsync();

                int id     = usersDTO.UserId;
                int roleId = 1;

                UserRoleDTO userRole = new UserRoleDTO()
                {
                    UserId = id,
                    RoleId = roleId
                };

                chekitDB.UserRoles.Add(userRole);
                await chekitDB.SaveChangesAsync();

                idForAvatar = usersDTO.UserId;
            }

            TempData["OK"] = "Админ создан";

            #region UploadAvatar

            var originalDirectory = new DirectoryInfo(string.Format($"{Server.MapPath(@"\")}Avatars\\Uploads"));

            var pathString1 = Path.Combine(originalDirectory.ToString(), "UserAvatars");
            var pathString2 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + idForAvatar.ToString());
            var pathString3 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + idForAvatar.ToString() + "\\Thumbs");
            var pathString4 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + idForAvatar.ToString() + "\\Gallery");
            var pathString5 = Path.Combine(originalDirectory.ToString(), "UserAvatars\\" + idForAvatar.ToString() + "\\Gallery\\Thumbs");

            if (!Directory.Exists(pathString1))
            {
                Directory.CreateDirectory(pathString1);
            }

            if (!Directory.Exists(pathString2))
            {
                Directory.CreateDirectory(pathString2);
            }

            if (!Directory.Exists(pathString3))
            {
                Directory.CreateDirectory(pathString3);
            }

            if (!Directory.Exists(pathString4))
            {
                Directory.CreateDirectory(pathString4);
            }

            if (!Directory.Exists(pathString5))
            {
                Directory.CreateDirectory(pathString5);
            }

            string[] extensions = { "image/jpg", "image/jpeg", "image/gif", "image/png" };

            if (file != null && file.ContentLength > 0)
            {
                string extension = file.ContentType.ToLower();
                int    counter   = 0;

                foreach (var item in extensions)
                {
                    if (extension != item)
                    {
                        counter++;

                        if (counter == extensions.Length)
                        {
                            ModelState.AddModelError("errorFormat", "Неправильный формат файла");

                            return(View(userVM));
                        }
                    }
                }

                string avatarName = file.FileName;

                using (ChekitDB chekitDB = new ChekitDB())
                {
                    UsersDTO usersDTO = await chekitDB.Users.FindAsync(idForAvatar);

                    usersDTO.AvatarName = avatarName;

                    await chekitDB.SaveChangesAsync();
                }

                var pathOriginalAvatar = string.Format($"{pathString2}\\{avatarName}");
                var pathLittleAvatar   = string.Format($"{pathString3}\\{avatarName}");

                file.SaveAs(pathOriginalAvatar);

                WebImage littleAvatar = new WebImage(file.InputStream);
                littleAvatar.Resize(150, 150);
                littleAvatar.Save(pathLittleAvatar);
            }

            #endregion

            return(RedirectToAction("Index"));
        }
        //удаление юзера
        public async Task <ActionResult> DeleteUser(int id)
        {
            using (ChekitDB chekitDB = new ChekitDB())
            {
                //находим юзера
                UsersDTO usersDTO = await chekitDB.Users.FirstOrDefaultAsync(x => x.UserId == id);

                //готовим список закладок
                List <LinkDTO> linkDTO = await chekitDB.Links.ToListAsync();

                //кнопка удалить у админа имеет статус disabled. Если вручную в браузере убрать этот статус, то программа удалит админа
                //а это дополнительная защита, так сказать, от дурака
                if (usersDTO.Role == "Админ")
                {
                    TempData["Error"] = "Администратора нельзя удалить";

                    return(RedirectToAction("Index"));
                }

                //удаляю папку и аватар юзера
                string avatarUserDirectory = Request.MapPath("~/Avatars/Uploads/UserAvatars/" + $"{ id.ToString()}");

                string avatarUserImg = Request.MapPath("~/Avatars/Uploads/UserAvatars/" + $"{id.ToString()}/" + usersDTO.AvatarName);

                if (System.IO.File.Exists(avatarUserImg))
                {
                    System.IO.File.Delete(avatarUserImg);

                    Directory.Delete(avatarUserDirectory);
                }
                else//если аватар не был загружен, удаляем директорию
                {
                    Directory.Delete(avatarUserDirectory);
                }

                //подготавливаем список закладок юзера для удаления
                List <LinkVM> userLinks = linkDTO.Where(x => x.UserAuthorId == usersDTO.UserId).Select(x => new LinkVM(x)).ToList();

                foreach (var item in userLinks)
                {
                    //находим директорию скриншота закладки
                    string directoryImg = Request.MapPath("~/Screenshots/Uploads/LinkAvatars/" + $"{item.LinkPicture.Substring(0, item.LinkPicture.IndexOf('.'))}");

                    //аналогично с самим скриншотом
                    string pathImg = Request.MapPath("~/Screenshots/Uploads/LinkAvatars/" + $"{item.LinkPicture.Substring(0, item.LinkPicture.IndexOf('.'))}/" + item.LinkPicture);

                    if (System.IO.File.Exists(pathImg)) //проверяем есть ли скриншот
                    {
                        System.IO.File.Delete(pathImg); //удаляем скриншот
                        Directory.Delete(directoryImg); //удаляем папку
                    }

                    //удаляем закладки
                    chekitDB.Links.Remove(linkDTO.FirstOrDefault(x => x.LinkID == item.LinkID));
                }

                //удаляем юзера
                chekitDB.Users.Remove(usersDTO);

                //сохраняем изменения
                await chekitDB.SaveChangesAsync();
            }

            TempData["OK"] = "Пользователь удален";

            return(RedirectToAction("Index"));
        }