public AddNewsPage(int?obavijestiID) { InitializeComponent(); ObavijestiID = obavijestiID; BindingContext = model = new AddNewsViewModel(); }
public async Task <NewsViewModel> SaveNewsAsync(AddNewsViewModel viewModel, int id = 0) { if (id == 0) { _context.News.Add(new News { Name = viewModel.Name, Path = viewModel.Path, Tag = viewModel.Tag, ImagePath = viewModel.ImagePath }); _context.SaveChanges(); var n = await _context.News.LastAsync(); string text1 = File.ReadAllText(@"../BeFit/wwwroot" + n.Path); return(new NewsViewModel { Name = n.Name, ImagePath = n.ImagePath, Tag = n.Tag }); } var news = await _context.News.FindAsync(id); if (news == null) { return(null); } news.Name = viewModel.Name; news.Path = viewModel.Path; news.Tag = viewModel.Tag; news.ImagePath = viewModel.ImagePath; string text = File.ReadAllText(@"../BeFit/wwwroot" + news.Path); return(new NewsViewModel { Name = news.Name, ImagePath = news.ImagePath, Tag = news.Tag }); }
public ActionResult Edit(AddNewsViewModel model, HttpPostedFileBase file) { var entity = model.ToNewsResult() .Update(x => { x.LastUpdatedBy = UserName; x.IsDeleted = !model.IsDeleted; if (!string.IsNullOrEmpty(file?.FileName)) { x.UrlImage = file.FileName; } }); var result = NewsRepository.Update(entity); if (result == SaveResult.SUCCESS) { EnsureFolderNews(model.Id); SaveFile(model.Id, file); } else { ViewBag.HasError = true; } var newsCategory = NewsCategoryRepository.GetAll().Select(x => x.ToDataViewModel()); model.NewsCategory = newsCategory; return(View(model)); }
public ActionResult Index(AddNewsViewModel model, HttpPostedFileBase file) { if (ModelState.IsValid) { string imageUrl = Constants.NewsDefaultImage; if (file != null && file.ContentLength <= Constants.ImageMaxSize) { imageUrl = Constants.NewsImagesFolder + file.FileName; file.SaveAs(HttpContext.Server.MapPath(Constants.NewsImagesServerFolder) + file.FileName); } try { var date = this.dateProvider.GetDate(); var news = this.newsFactory.CreateNews(model.Title, model.Content, imageUrl, date); this.newsService.Add(news); this.newsService.Save(); TempData[GlobalMessages.AddNewsSuccessKey] = GlobalMessages.AddNewsSuccessMessage; } catch (Exception ex) { ModelState.AddModelError("", ex.Message); } return(View(model)); } return(View(model)); }
public IActionResult AddNews([FromBody] AddNewsViewModel model) { var claims = User.Claims; var userId = claims.FirstOrDefault().Value; if (!ModelState.IsValid) { return(BadRequest()); } if (!string.IsNullOrEmpty(model.Group)) { _newsRepo.AddGroupNews(new NewsGroupModel() { Content = model.Content, GroupId = int.Parse(model.Group), TeacherId = userId, Topic = model.Topic }); } else { _newsRepo.AddNews(new NewsModel() { Content = model.Content, TeacherId = userId, Topic = model.Topic }); } return(Ok()); }
public IActionResult Add([FromBody] AddNewsViewModel newsItem) { if (newsItem == null) { return(BadRequest("News is null")); } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } newsItem.News.CreatedDate = DateTime.Now; newsItem.News.UpdatedDate = DateTime.Now; if (newsItem.News.Category?.Id != null) { Category c = _categoryRepository.GetById((int)newsItem.News.Category.Id); newsItem.News.Category = c; } // Förhindra att ny kategori skapas om ingen anges if (newsItem.News.Category?.Id == null) { newsItem.News.Category = null; } //creates all tags and the connection between tags and news News thisNews = _newsRepository.Add(newsItem.News); foreach (var tag in newsItem.Tags) { if (tag.Id == 0) { var newTag = _tagRepository.Create(tag); var tagConnection = new NewsTag { News = thisNews, NewsId = thisNews.Id, Tag = newTag, TagId = newTag.Id }; thisNews.NewsTags.Add(tagConnection); } else { var alreadyAddedTag = _tagRepository.GetById(tag.Id); var tagConnection = new NewsTag { News = thisNews, NewsId = thisNews.Id, Tag = alreadyAddedTag }; thisNews.NewsTags.Add(tagConnection); } } //updates the news to add the connection between tags and this news _newsRepository.Update(thisNews); return(Ok()); }
public ActionResult Add() { var newsCategory = NewsCategoryRepository.GetAll().Select(x => x.ToDataViewModel()); var model = new AddNewsViewModel { NewsCategory = newsCategory }; return(View(model)); }
public ActionResult Add(AddNewsViewModel model) { if (ModelState.IsValid) { var userId = this.authenticationProvider.CurrentUserId; var news = this.newsService.CreateNews(userId, model.Title, model.Text, model.CoverPicture, model.Category); return(RedirectToAction("Details", "News", new { newsId = news.NewsId })); } model.Cloudinary = this.cloudinary; return(View(model)); }
public async Task <IActionResult> Edit(int?id, AddNewsViewModel viewModel) { if (id == null) { id = 0; } try { if (ModelState.IsValid) { if (viewModel.ITextFile != null) { var Path = @"../BeFit/wwwroot/Files/" + viewModel.ITextFile.FileName; using (var stream = new FileStream(Path, FileMode.Create, FileAccess.ReadWrite)) { await viewModel.ITextFile.CopyToAsync(stream); viewModel.Path = @"/Files/" + viewModel.ITextFile.FileName; } } if (viewModel.IImageFile != null) { var Path = @"../BeFit/wwwroot/Files/" + viewModel.IImageFile.FileName; using (var stream = new FileStream(Path, FileMode.Create, FileAccess.ReadWrite)) { await viewModel.IImageFile.CopyToAsync(stream); viewModel.ImagePath = @"/Files/" + viewModel.IImageFile.FileName; } } var saving1 = await _newsRepository.SaveNewsAsync(viewModel, (int)id); if (saving1 != null) { return(View("Details", saving1)); } } } catch (DbUpdateException /* ex */) { //Log the error (uncomment ex variable name and write a log. ModelState.AddModelError("", "Unable to save changes. " + "Try again, and if the problem persists " + "see your system administrator."); } return(View(viewModel)); }
public void ReturnViewWithModelErrors_IfAddindNewsFailed() { // Arrange var mockedNewsFactory = new Mock <INewsFactory>(); mockedNewsFactory.Setup(f => f.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>())).Verifiable(); var mockedNewsService = new Mock <INewsService>(); mockedNewsService.Setup(s => s.Add(It.IsAny <News>())).Verifiable(); mockedNewsService.Setup(s => s.Save()).Throws(new Exception("Test")); var mockedDateProvider = new Mock <IDateProvider>(); mockedDateProvider.Setup(d => d.GetDate()).Verifiable(); var mockedHttpContext = new Mock <ControllerContext>(); mockedHttpContext.Setup(c => c.HttpContext.Server.MapPath(It.IsAny <string>())).Returns("Test"); var controller = new NewsController(mockedNewsFactory.Object, mockedNewsService.Object, mockedDateProvider.Object); controller.ControllerContext = mockedHttpContext.Object; var model = new AddNewsViewModel(); var mockedFile = new MockHttpPostedFileBase(); mockedFile.SetContentLength(Constants.ImageMaxSize); // Act var result = controller.Index(model, mockedFile) as ViewResult; // Assert ModelState modelError; result.ViewData.ModelState.TryGetValue("", out modelError); Assert.AreEqual("", result.ViewName); Assert.IsTrue(modelError.Errors.First().ErrorMessage == "Test"); Assert.IsTrue(result.TempData[GlobalMessages.AddNewsSuccessKey] == null); mockedNewsFactory.Verify(f => f.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>()), Times.Once); mockedNewsService.Verify(s => s.Add(It.IsAny <News>()), Times.Once); mockedDateProvider.Verify(d => d.GetDate(), Times.Once); }
public void ReturnViewWithModelErrors_IfModelStateIsNotValid() { // Arrange var mockedNewsFactory = new Mock <INewsFactory>(); mockedNewsFactory.Setup(f => f.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>())).Verifiable(); var mockedNewsService = new Mock <INewsService>(); mockedNewsService.Setup(s => s.Add(It.IsAny <News>())).Verifiable(); mockedNewsService.Setup(s => s.Save()).Verifiable(); var mockedDateProvider = new Mock <IDateProvider>(); mockedDateProvider.Setup(d => d.GetDate()).Verifiable(); var controller = new NewsController(mockedNewsFactory.Object, mockedNewsService.Object, mockedDateProvider.Object); var expextedError = "test error"; var expectedErrorMessage = "Test"; controller.ModelState.AddModelError(expextedError, expectedErrorMessage); var model = new AddNewsViewModel(); var mockedFile = new MockHttpPostedFileBase(); mockedFile.SetContentLength(Constants.ImageMaxSize); // Act var result = controller.Index(model, mockedFile) as ViewResult; // Assert ModelState modelError; result.ViewData.ModelState.TryGetValue(expextedError, out modelError); Assert.AreEqual("", result.ViewName); Assert.IsTrue(modelError.Errors.First().ErrorMessage == expectedErrorMessage); Assert.IsTrue(result.TempData[GlobalMessages.AddNewsSuccessKey] == null); mockedNewsFactory.Verify(f => f.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>()), Times.Never); mockedNewsService.Verify(s => s.Add(It.IsAny <News>()), Times.Never); mockedNewsService.Verify(s => s.Save(), Times.Never); mockedDateProvider.Verify(d => d.GetDate(), Times.Never); }
public static NewsResult ToNewsResult(this AddNewsViewModel model) { return(model == null ? null : new NewsResult { Id = model.Id, CreateDate = model.CreateDate, CreatedBy = model.CreatedBy, IsDeleted = model.IsDeleted, LastUpdated = model.LastUpdated, LastUpdatedBy = model.LastUpdatedBy, Content = model.Content, Summary = model.Summary, NewsCategoryId = model.NewsCategoryId, Title = model.Title, UrlImage = model.UrlImage, }); }
public void _Call_NewsService_CreateNews( string userId, string title, string text, CategoryEnum category, string coverPicUrl) { //Arrange var fakeAcc = new CloudinaryDotNet.Account("fake", "fake", "fake"); var mockedCloudinary = new Mock <Cloudinary>(fakeAcc); var model = new AddNewsViewModel(mockedCloudinary.Object) { Title = title, Text = text, Category = category, CoverPicture = coverPicUrl, }; var news = new Models.News(); var mockedAuthProvider = new Mock <IAuthenticationProvider>(); mockedAuthProvider.Setup(a => a.CurrentUserId).Returns(userId); var mockedNewsService = new Mock <INewsService>(); mockedNewsService.Setup(s => s.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <CategoryEnum>())).Returns(news); var mockedViewModelFactory = new Mock <IViewModelFactory>(); mockedViewModelFactory.Setup(v => v.CreateAddNewsViewModel(It.IsAny <Cloudinary>())).Returns(model); var newsControllerSUT = new NewsController(mockedAuthProvider.Object, mockedNewsService.Object, mockedViewModelFactory.Object, mockedCloudinary.Object); newsControllerSUT.ModelState.Clear(); //Act var res = newsControllerSUT.Add(model) as RedirectToRouteResult; //Assert mockedNewsService.Verify(n => n.CreateNews(userId, title, text, coverPicUrl, category), Times.Once); }
public ActionResult AddNews([FromBody] AddNewsViewModel model) { if (ModelState.IsValid) { var news = new News() { Title = model.Title, Text = model.Text, Image = model.Image, CreateDate = model.CreateDate }; if (_commonBll.AddNews(news)) { return(Ok()); } return(BadRequest()); } return(BadRequest()); }
public void _Return_View_With_Model() { //Arrange var model = new AddNewsViewModel(); var mockedAuthProvider = new Mock <IAuthenticationProvider>(); var mockedNewsService = new Mock <INewsService>(); var mockedViewModelFactory = new Mock <IViewModelFactory>(); mockedViewModelFactory.Setup(v => v.CreateAddNewsViewModel(It.IsAny <Cloudinary>())).Returns(model); var fakeAcc = new CloudinaryDotNet.Account("fake", "fake", "fake"); var mockedCloudinary = new Mock <Cloudinary>(fakeAcc); var newsControllerSUT = new NewsController(mockedAuthProvider.Object, mockedNewsService.Object, mockedViewModelFactory.Object, mockedCloudinary.Object); //Act var res = newsControllerSUT.Add() as ViewResult; //Assert Assert.AreEqual(model, res.Model); }
public void _Return_RedirectToRouteResult_WithFalsePermanent() { //Arrange var fakeAcc = new CloudinaryDotNet.Account("fake", "fake", "fake"); var mockedCloudinary = new Mock <Cloudinary>(fakeAcc); var model = new AddNewsViewModel(mockedCloudinary.Object) { Title = "Some title", Text = "Some text", Category = Models.Enums.CategoryEnum.Abstract, CoverPicture = "SomeUrl", }; var news = new Models.News(); var mockedAuthProvider = new Mock <IAuthenticationProvider>(); mockedAuthProvider.Setup(a => a.CurrentUserId).Returns("userId"); var mockedNewsService = new Mock <INewsService>(); mockedNewsService.Setup(s => s.CreateNews(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <CategoryEnum>())).Returns(news); var mockedViewModelFactory = new Mock <IViewModelFactory>(); mockedViewModelFactory.Setup(v => v.CreateAddNewsViewModel(It.IsAny <Cloudinary>())).Returns(model); var newsControllerSUT = new NewsController(mockedAuthProvider.Object, mockedNewsService.Object, mockedViewModelFactory.Object, mockedCloudinary.Object); newsControllerSUT.ModelState.Clear(); //Act var res = newsControllerSUT.Add(model) as RedirectToRouteResult; //Assert Assert.IsFalse(res.Permanent); }
// GET: Food/Edit/5 public async Task <IActionResult> Edit(int?id) { if (id == null) { return(View(new AddNewsViewModel())); } var news = await _newsRepository.GetNewsAsync((int)id); if (news == null) { return(View(new AddNewsViewModel())); } var viewModel = new AddNewsViewModel() { Name = news.Name, Path = news.Path, ImagePath = news.ImagePath, Tag = news.Tag }; return(View(viewModel)); }
public void _Call_NewsService_GetNewsById(string cloud, string apiKey, string apiSecret, int newsId) { //Arrange var model = new AddNewsViewModel(); var mockedAuthProvider = new Mock <IAuthenticationProvider>(); var mockedNewsService = new Mock <INewsService>(); var mockedViewModelFactory = new Mock <IViewModelFactory>(); mockedViewModelFactory.Setup(v => v.CreateAddNewsViewModel(It.IsAny <Cloudinary>())).Returns(model); var fakeAcc = new CloudinaryDotNet.Account(cloud, apiKey, apiSecret); var mockedCloudinary = new Mock <Cloudinary>(fakeAcc); var newsControllerSUT = new NewsController(mockedAuthProvider.Object, mockedNewsService.Object, mockedViewModelFactory.Object, mockedCloudinary.Object); //Act var res = newsControllerSUT.Details(newsId) as ViewResult; //Assert mockedNewsService.Verify(n => n.GetNewsById(newsId), Times.Once); }
public ActionResult Add(AddNewsViewModel model, HttpPostedFileBase file) { var entity = model.ToNewsResult() .Update(x => { x.CreatedBy = UserName; x.IsDeleted = !model.IsDeleted; x.UrlImage = file.FileName; }); var result = NewsRepository.Add(entity); if (result == SaveResult.SUCCESS) { SaveFile(entity.Id, file); return(RedirectToRoute(UrlLink.NEWS_EDIT, new { id = entity.Id })); } ViewBag.HasError = true; var newsCategory = NewsCategoryRepository.GetAll().Select(x => x.ToDataViewModel()); model.NewsCategory = newsCategory; return(View()); }
public async Task <IActionResult> AddNews(AddNewsViewModel model, IFormFileCollection uploads) { // Проверяем, чтобы размер файлов не превышал заданный объем foreach (var file in uploads) { if (file.Length > 2097152) { ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит 2MB."); break; } } // Если все в порядке, заходим в тело условия if (ModelState.IsValid) { // Создаем экземпляр класса News и присваиваем ему значения News news = new News() { Id = Guid.NewGuid(), NewsTitle = model.NewsTitle, NewsBody = model.NewsBody, NewsDate = DateTime.Now, UserName = "******" // В рабочем варианте будет брать имя из User.Identity }; // Далее начинаем обработку изображений List <NewsImage> newsImages = new List <NewsImage>(); foreach (var uploadedImage in uploads) { // Если размер входного файла больше 0, заходим в тело условия if (uploadedImage.Length > 0) { // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки FileInfo imgFile = new FileInfo(uploadedImage.FileName); // Приводим расширение к нижнему регистру (если оно было в верхнем) string imgExtension = imgFile.Extension.ToLower(); // Генерируем новое имя для файла string newFileName = Guid.NewGuid() + imgExtension; // Пути сохранения файла string pathNormal = "/files/images/normal/" + newFileName; // изображение исходного размера string pathScaled = "/files/images/scaled/" + newFileName; // уменьшенное изображение // В операторе try/catch делаем уменьшенную копию изображения. // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке try { // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение using (Image image = Image.Load(uploadedImage.OpenReadStream())) { // Создаем уменьшенную копию и обрезаем её var clone = image.Clone(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Crop, Size = new Size(300, 200) })); // Сохраняем уменьшенную копию await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = 50 }); // Сохраняем исходное изображение await image.SaveAsync(_appEnvironment.WebRootPath + pathNormal); } } // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке catch { // Создаем сообщение об ошибке для вывода пользователю ModelState.AddModelError("NewsImage", $"Файл {uploadedImage.FileName} имеет неверный формат."); // Удаляем только что созданные файлы (если ошибка возникла не на первом файле) foreach (var image in newsImages) { // Исходные (полноразмерные) изображения FileInfo imageNormal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathNormal); if (imageNormal.Exists) { imageNormal.Delete(); } // И их уменьшенные копии FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled); if (imageScaled.Exists) { imageScaled.Delete(); } } // Возвращаем модель с сообщением об ошибке в представление return(View(model)); } // Создаем объект класса NewsImage со всеми параметрами NewsImage newsImage = new NewsImage() { Id = Guid.NewGuid(), ImageName = newFileName, ImagePathNormal = pathNormal, ImagePathScaled = pathScaled, NewsId = news.Id }; // Добавляем объект newsImage в список newsImages newsImages.Add(newsImage); } } // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД if (newsImages != null && newsImages.Count > 0) { await cmsDB.NewsImages.AddRangeAsync(newsImages); } await cmsDB.News.AddAsync(news); await cmsDB.SaveChangesAsync(); // Редирект на главную страницу return(RedirectToAction("Index", "News")); } // Возврат модели в представление в случае, если запорится валидация return(View(model)); }
public async Task <IActionResult> AddNews(AddNewsViewModel model, IFormFileCollection uploads) { // Проверяем размер каждого изображения foreach (var image in uploads) { if (image.Length > 2097152) { ModelState.AddModelError("Image", "Размер изображения должен быть не более 2МБ."); break; } } if (ModelState.IsValid) { News news = new News() { Id = Guid.NewGuid(), NewsTitle = model.NewsTitle, NewsBody = model.NewsBody, NewsDate = DateTime.Now, UserName = User.Identity.Name }; // Создаем список изображений List <ImageFile> images = new List <ImageFile>(); foreach (var uploadedImage in uploads) { // Присваиваем загружаемому файлу уникальное имя на основе Guid string imageName = Guid.NewGuid() + "_" + uploadedImage.FileName; // Путь сохранения файла string pathNormal = "/files/images/normal/" + imageName; // изображение исходного размера string pathScaled = "/files/images/scaled/" + imageName; // уменьшенное изображение // сохраняем файл в папку files в каталоге wwwroot using (FileStream file = new FileStream(_appEnvironment.WebRootPath + pathNormal, FileMode.Create)) { await uploadedImage.CopyToAsync(file); } // Создаем объект класса Image со всеми параметрами ImageFile image = new ImageFile { Id = Guid.NewGuid(), ImageName = imageName, ImagePathNormal = pathNormal, ImagePathScaled = pathScaled, TargetId = news.Id }; // Добавляем объект класса Image в ранее созданный список images images.Add(image); // Делаем уменьшенную копию изображения var img = Image.FromFile(_appEnvironment.WebRootPath + pathNormal); var scaledImage = ImageResize.Scale(img, 300, 300); scaledImage.SaveAs(_appEnvironment.WebRootPath + pathScaled, 50); } // Сохраняем новые объекты в БД await websiteDB.Images.AddRangeAsync(images); await websiteDB.News.AddAsync(news); await websiteDB.SaveChangesAsync(); return(RedirectToAction("Index", "Home")); } // Редирект на случай невалидности модели return(View(model)); }
public AddNewNewsView() { InitializeComponent(); DataContext = new AddNewsViewModel(); }