From 5fb50ec2a6a64b9910d7581030cd4d0c0c956123 Mon Sep 17 00:00:00 2001 From: Vlad V Date: Sun, 17 Nov 2019 04:28:31 +0700 Subject: [PATCH] #664 refactor carousel widget apis --- .../wwwroot/admin/brand/brand-form.js | 5 +- .../CarouselWidgetApiController.cs | 115 +++++++----------- .../Cms/ViewModels/CarouselWidgetForm.cs | 2 +- .../carousel-widget/carousel-widget-form.js | 6 +- 4 files changed, 53 insertions(+), 75 deletions(-) diff --git a/src/Modules/SimplCommerce.Module.Catalog/wwwroot/admin/brand/brand-form.js b/src/Modules/SimplCommerce.Module.Catalog/wwwroot/admin/brand/brand-form.js index 61be43cb76..791c6aac62 100644 --- a/src/Modules/SimplCommerce.Module.Catalog/wwwroot/admin/brand/brand-form.js +++ b/src/Modules/SimplCommerce.Module.Catalog/wwwroot/admin/brand/brand-form.js @@ -31,8 +31,9 @@ var error = response.data; vm.validationErrors = []; if (error && angular.isObject(error)) { - for (var key in error) { - vm.validationErrors.push(error[key][0]); + var errors = error.errors ? error.errors : error; + for (var key in errors) { + vm.validationErrors.push(errors[key][0]); } } else { vm.validationErrors.push('Could not add brand.'); diff --git a/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/Controllers/CarouselWidgetApiController.cs b/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/Controllers/CarouselWidgetApiController.cs index 489bdde4da..9484ed30f6 100644 --- a/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/Controllers/CarouselWidgetApiController.cs +++ b/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/Controllers/CarouselWidgetApiController.cs @@ -19,7 +19,8 @@ namespace SimplCommerce.Module.Cms.Areas.Cms.Controllers [Area("Cms")] [Authorize(Roles = "admin")] [Route("api/carousel-widgets")] - public class CarouselWidgetApiController : Controller + [ApiController] + public class CarouselWidgetApiController : ControllerBase { private readonly IRepository _widgetInstanceRepository; private readonly IMediaService _mediaService; @@ -31,7 +32,7 @@ public CarouselWidgetApiController(IRepository widgetInstanceRep } [HttpGet("{id}")] - public async Task Get(long id) + public async Task> Get(long id) { var totalWidgets = _widgetInstanceRepository.Query().ToList().Count(); var widgetInstance = await _widgetInstanceRepository.Query().FirstOrDefaultAsync(x => x.Id == id); @@ -51,43 +52,45 @@ public async Task Get(long id) item.ImageUrl = _mediaService.GetMediaUrl(item.Image); } - return Json(model); + return model; } [HttpPost] - public async Task Post(IFormCollection formCollection) + public async Task Post([FromForm]CarouselWidgetForm model) { - var model = ToCarouselWidgetFormModel(formCollection); - if (ModelState.IsValid) + ModelBindUploadFiles(model); + + if(model.Items.Any(x => x.UploadImage == null)) { - foreach (var item in model.Items) - { - item.Image = await SaveFile(item.UploadImage); - } + ModelState.AddModelError("Images", "Images is required"); + return BadRequest(ModelState); + } - var widgetInstance = new WidgetInstance - { - Name = model.Name, - WidgetId = "CarouselWidget", - WidgetZoneId = model.WidgetZoneId, - PublishStart = model.PublishStart, - PublishEnd = model.PublishEnd, - DisplayOrder = model.DisplayOrder, - Data = JsonConvert.SerializeObject(model.Items) - }; - - _widgetInstanceRepository.Add(widgetInstance); - await _widgetInstanceRepository.SaveChangesAsync(); - return CreatedAtAction(nameof(Get), new { id = widgetInstance.Id }, null); + foreach (var item in model.Items) + { + item.Image = await SaveFile(item.UploadImage); } - return BadRequest(ModelState); + var widgetInstance = new WidgetInstance + { + Name = model.Name, + WidgetId = "CarouselWidget", + WidgetZoneId = model.WidgetZoneId, + PublishStart = model.PublishStart, + PublishEnd = model.PublishEnd, + DisplayOrder = model.DisplayOrder, + Data = JsonConvert.SerializeObject(model.Items) + }; + + _widgetInstanceRepository.Add(widgetInstance); + await _widgetInstanceRepository.SaveChangesAsync(); + return CreatedAtAction(nameof(Get), new { id = widgetInstance.Id }, null); } [HttpPut("{id}")] - public async Task Put(long id, IFormCollection formCollection) + public async Task Put(long id, [FromForm]CarouselWidgetForm model) { - var model = ToCarouselWidgetFormModel(formCollection); + ModelBindUploadFiles(model); foreach (var item in model.Items) { @@ -101,56 +104,28 @@ public async Task Put(long id, IFormCollection formCollection) } } - if (ModelState.IsValid) + var widgetInstance = await _widgetInstanceRepository.Query().FirstOrDefaultAsync(x => x.Id == id); + if(widgetInstance == null) { - var widgetInstance = await _widgetInstanceRepository.Query().FirstOrDefaultAsync(x => x.Id == id); - if(widgetInstance == null) - { - return NotFound(); - } - - widgetInstance.Name = model.Name; - widgetInstance.PublishStart = model.PublishStart; - widgetInstance.PublishEnd = model.PublishEnd; - widgetInstance.WidgetZoneId = model.WidgetZoneId; - widgetInstance.DisplayOrder = model.DisplayOrder; - widgetInstance.Data = JsonConvert.SerializeObject(model.Items); - - await _widgetInstanceRepository.SaveChangesAsync(); - return Accepted(); + return NotFound(); } - return BadRequest(ModelState); + widgetInstance.Name = model.Name; + widgetInstance.PublishStart = model.PublishStart; + widgetInstance.PublishEnd = model.PublishEnd; + widgetInstance.WidgetZoneId = model.WidgetZoneId; + widgetInstance.DisplayOrder = model.DisplayOrder; + widgetInstance.Data = JsonConvert.SerializeObject(model.Items); + + await _widgetInstanceRepository.SaveChangesAsync(); + return Accepted(); } - private CarouselWidgetForm ToCarouselWidgetFormModel(IFormCollection formCollection) + private CarouselWidgetForm ModelBindUploadFiles(CarouselWidgetForm model) { - var model = new CarouselWidgetForm(); - model.Name = formCollection["name"]; - model.WidgetZoneId = int.Parse(formCollection["widgetZoneId"]); - int.TryParse(formCollection["displayOrder"], out int displayOrder); - model.DisplayOrder = displayOrder; - if (DateTimeOffset.TryParse(formCollection["publishStart"], out DateTimeOffset publishStart)) - { - model.PublishStart = publishStart; - } - - if(DateTimeOffset.TryParse(formCollection["publishEnd"], out DateTimeOffset publishEnd)) - { - model.PublishEnd = publishEnd; - } - - int numberOfItems = int.Parse(formCollection["numberOfItems"]); - for (var i = 0; i < numberOfItems; i++) + for (var i = 0; i < model.Items.Count; i++) { - var item = new CarouselWidgetItemForm(); - item.Caption = formCollection[$"items[{i}][caption]"]; - item.SubCaption = formCollection[$"items[{i}][subCaption]"]; - item.TargetUrl = formCollection[$"items[{i}][targetUrl]"]; - item.LinkText = formCollection[$"items[{i}][linkText]"]; - item.Image = formCollection[$"items[{i}][image]"]; - item.UploadImage = formCollection.Files[$"items[{i}][uploadImage]"]; - model.Items.Add(item); + model.Items[i].UploadImage = Request.Form.Files[$"items[{i}][uploadImage]"]; } return model; diff --git a/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/ViewModels/CarouselWidgetForm.cs b/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/ViewModels/CarouselWidgetForm.cs index 9cee49f752..a28e51b3cf 100644 --- a/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/ViewModels/CarouselWidgetForm.cs +++ b/src/Modules/SimplCommerce.Module.Cms/Areas/Cms/ViewModels/CarouselWidgetForm.cs @@ -5,6 +5,6 @@ namespace SimplCommerce.Module.Cms.Areas.Cms.ViewModels { public class CarouselWidgetForm : WidgetFormBase { - public IList Items = new List(); + public IList Items { get; set; } = new List(); } } diff --git a/src/Modules/SimplCommerce.Module.Cms/wwwroot/admin/carousel-widget/carousel-widget-form.js b/src/Modules/SimplCommerce.Module.Cms/wwwroot/admin/carousel-widget/carousel-widget-form.js index 815c570ba3..e6a608db44 100644 --- a/src/Modules/SimplCommerce.Module.Cms/wwwroot/admin/carousel-widget/carousel-widget-form.js +++ b/src/Modules/SimplCommerce.Module.Cms/wwwroot/admin/carousel-widget/carousel-widget-form.js @@ -33,6 +33,7 @@ var promise; // ng-upload will post null as text + vm.widgetInstance.publishEnd = vm.widgetInstance.publishEnd === null ? '' : vm.widgetInstance.publishEnd; angular.forEach(vm.widgetInstance.items, function (item) { item.caption = item.caption === null ? '' : item.caption; item.subCaption = item.subCaption === null ? '' : item.subCaption; @@ -53,8 +54,9 @@ var error = response.data; vm.validationErrors = []; if (error && angular.isObject(error)) { - for (var key in error) { - vm.validationErrors.push(error[key][0]); + var errors = error.errors ? error.errors : error; + for (var key in errors) { + vm.validationErrors.push(errors[key][0]); } } else { vm.validationErrors.push('Could not carousel widget.');