//Метод добавляем пользователя в базу public static void RegisterUser(RegisterModel user) { //если данные валидны(логин и email не заняты) if ((RegisterValid(user) & RegisterValidError.AllErrors) == RegisterValidError.Nope) { using (DBContext db = new DBContext()) { //создаём запись о новом пользователе User newUser = new User(); newUser.Login = user.Login; newUser.Email = user.Email; newUser.Password = user.Password; //и добавляем её в базу db.Users.Add(newUser); db.SaveChanges(); return; } } //а иначе ловите исключение else { throw new RegiserFailException(RegisterValid(user).ToString()); } }
//Метод проверяет, не заняты ты ли логин и email //должен вызываться перед RegisterUser, если вернётся что-то кроме Nope //то RegisterUser кинет исключение public static RegisterValidError RegisterValid(RegisterModel user) { //создаём перечисление для регистрации возможных ошибок RegisterValidError result = new RegisterValidError(); //изначально инициируем его "ошибок нет" result = RegisterValidError.Nope; using (DBContext db = new DBContext()) { //если в базе есть запись с таким логином bool LoginBusy = db.Users.Where(u => u.Login == user.Login).Any(); if (LoginBusy) { //то добавляем к возвращаему результату флаг логин занят result = result | RegisterValidError.LoginBusy; } //если в базе есть запись с таким email bool EmailBusy = db.Users.Where(u => u.Email == user.Email).Any(); if (EmailBusy) { //то добавляем к возвращаему результату флаг email занят result = result | RegisterValidError.EmailBusy; } } return result; }
//Метод проверяет логин и пароль, //возвращает true, если в базе есть запись с соответсвующими значениями public static bool AuthorizationDataValid(string login, string password) { using (DBContext db = new DBContext()) { bool userExist = db.Users.Where(u => u.Login == login && u.Password == password).Any(); return userExist?true:false; } }
//Метод достаёт пост из базы по id public static PostView getPost(int id) { Post post; using (DBContext db = new DBContext()) { post = db.Posts.FirstOrDefault(p => p.Id_post == id); return postToPostView(post); } }
//Метод достаёт изображение из базы по id public static Image getImage(int id) { Image image; using (DBContext db = new DBContext()) { image = db.Images.FirstOrDefault(img => img.Id_image == id); } return image; }
// GET: Post public ActionResult Index(int id) { using (DBContext db = new DBContext()) { try { //пробуем получаем пост по id PostView postView = ContentRepository.getPost(id); return View(postView); } //если не получилось, то возвращаем страницу 404 catch { return View("Error404"); } } }
// GET: Image public ActionResult GetImage(int id) { Image image = new Image(); //запрашиваем изображение из базы using(DBContext db = new DBContext()) { image = ContentRepository.getImage(id); } //если такое есть, то возвращаем изображение if (image != null) { return File(image.ImageData, image.ImageMimeType); } //на нет и суда нет else { return Content("Изображение отсутствует"); } }
//удаление поста и связанных с ним данных public static void removePost(int postId, string username) { using (var db = new DBContext()) { //ищим пост предназначенный для удаления //за одно проверяем, принадлежит ли он данному юзеру Post post = db.Posts.FirstOrDefault(p => p.Id_post == postId && p.User.Login == username); //если пост есть и у юзера есть права на его удаление if (post != null) { //ищем и удаляем изображение из поста Image image = post.Image; if (image != null) db.Images.Remove(image); //ищем и удаляем теги, которые больше не используются //это такие теги, с которыми связан только 1 пост var unuseTags = post.Tags.Where(p => p.Posts.Count == 1); db.Tags.RemoveRange(unuseTags); //удаляем сам пост и сохраняем изменения db.Posts.Remove(post); db.SaveChanges(); } else { throw new PostNotExistOrNotAccessException(); } } }
//Метод ассоциирует пост с тегами private static void relatedTagsAndPost(int postId, ICollection<Tag> tagList) { using (var db = new DBContext()) { //берём из базы пост с указанным id Post post = db.Posts.FirstOrDefault(p => p.Id_post == postId); //ищем в базе наши теги и оссоциируем с ними данный пост foreach (var element in tagList) { Tag tag = db.Tags.FirstOrDefault(t => t.name == element.name); post.Tags.Add(tag); } //сохраняем изменения db.SaveChanges(); } }
//Метод добавляет теги в базу private static ICollection<Tag> addTags(string tagsString) { using (var db = new DBContext()) { //разбиваем строку тегов на список строк по ',' //откидываем лишние пробелы по краям тегов IEnumerable<string> listTagString = tagsString.Split(',').Select(s => s.Trim()); //создаём список тегов из listTagString //каждая строка это имя тега ICollection<Tag> tags = listTagString.Select(tag => new Tag() { name = tag }).ToList(); //добавляем теги в базу //если тег там уже есть, то не пытаемся добавить его снова foreach (Tag tag in tags) { if (!db.Tags.Any(t => t.name == tag.name)) { db.Tags.Add(tag); } } //сохраняем изменения db.SaveChanges(); return tags; } }
//добавляем новый пост в базу //postModel - текстовые данные введённый пользователем //image - изображение в том виде, в каком мы получили его от браузера //username - имя пользователя, которому принадлежит пост public static void addPost(CreatePostModel postModel, HttpPostedFileBase image, string username) { using (DBContext db = new DBContext()) { Post post = new Post(); //добавление к записи заголовка и текста post.Header = postModel.Header; post.Text = postModel.Text; //добавляем изображение if (image != null) { post.Image = new Image { ImageMimeType = image.ContentType, ImageData = new byte[image.ContentLength] }; //записываем битарей изображения image.InputStream.Read(post.Image.ImageData, 0, image.ContentLength); } //добавляем пользователя, автора поста post.User = db.Users.FirstOrDefault(u => u.Login == username); Debug.Assert(post.User != null, "пользователь не существует"); //сохранение в базе db.Posts.Add(post); db.SaveChanges(); //добавляем теги в базу var tags = addTags(postModel.Tags); //ассоциируем с ними пост relatedTagsAndPost(post.Id_post, tags); } }