From 881bb20f22da705c407e1fbb2e398ba7d7e6a07f Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Sun, 3 May 2020 16:21:37 +0200 Subject: [PATCH] saving of space content in lists --- zero.Core/Entities/Spaces/SpaceContent.cs | 5 +++- zero.Web/App/Pages/spaces/views/editor.vue | 11 +++++-- zero.Web/Controllers/SpacesController.cs | 14 ++++++--- zero.Web/Controllers/UserRolesController.cs | 1 - .../Formatters/RawJsonBodyInputFormatter.cs | 30 +++++++++++++++++++ zero.Web/Mapper/SpaceMapperConfig.cs | 26 ++++++++++++++++ zero.Web/Models/EditModel.cs | 5 +++- zero.Web/Startup.cs | 4 +++ 8 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 zero.Web/Formatters/RawJsonBodyInputFormatter.cs create mode 100644 zero.Web/Mapper/SpaceMapperConfig.cs diff --git a/zero.Core/Entities/Spaces/SpaceContent.cs b/zero.Core/Entities/Spaces/SpaceContent.cs index 270fc11e..7bc8f24e 100644 --- a/zero.Core/Entities/Spaces/SpaceContent.cs +++ b/zero.Core/Entities/Spaces/SpaceContent.cs @@ -1,4 +1,7 @@ -namespace zero.Core.Entities +using Newtonsoft.Json; +using System; + +namespace zero.Core.Entities { /// /// A list item can consist of unlimited properties and be rendered as you wish diff --git a/zero.Web/App/Pages/spaces/views/editor.vue b/zero.Web/App/Pages/spaces/views/editor.vue index 946a024b..99eae1e1 100644 --- a/zero.Web/App/Pages/spaces/views/editor.vue +++ b/zero.Web/App/Pages/spaces/views/editor.vue @@ -27,7 +27,8 @@ disabled: false, renderer: {}, actions: [], - model: null + model: null, + fullModel: null }), computed: { @@ -58,13 +59,19 @@ { this.renderer = response.config; this.model = response.model; + this.fullModel = response; }); }, onSubmit(form) { - console.table(JSON.parse(JSON.stringify(this.model))); + this.fullModel.model = this.model; + + form.handle(SpacesApi.save(this.fullModel)).then(response => + { + console.info(response); + }); }, } diff --git a/zero.Web/Controllers/SpacesController.cs b/zero.Web/Controllers/SpacesController.cs index d2e5be94..75dea129 100644 --- a/zero.Web/Controllers/SpacesController.cs +++ b/zero.Web/Controllers/SpacesController.cs @@ -1,4 +1,7 @@ using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using System.IO; +using System.Text; using System.Threading.Tasks; using zero.Core; using zero.Core.Api; @@ -61,22 +64,25 @@ namespace zero.Web.Controllers model = await Api.GetItem(alias, contentId); } + JsonSerializerSettings settings = JsonConvert.DefaultSettings(); + settings.TypeNameHandling = TypeNameHandling.Objects; + return Json(new SpaceContentEditModel() { + Id = model.Id, Alias = alias, Model = model, Config = Api.GetEditorConfig(alias) - }); + }, settings); } /// /// Save content item /// - public async Task Save([FromBody] TeamMember model) + public async Task Save([FromBody] SpaceContentEditModel model) { - TeamMember member = await Mapper.Map(model, await Api.GetItem(model.Id)); - return Json(await Api.Save(model.SpaceAlias, model)); + return Json(await Api.Save(model.Alias, model.Model)); } diff --git a/zero.Web/Controllers/UserRolesController.cs b/zero.Web/Controllers/UserRolesController.cs index 41729309..ce9c05b6 100644 --- a/zero.Web/Controllers/UserRolesController.cs +++ b/zero.Web/Controllers/UserRolesController.cs @@ -59,7 +59,6 @@ namespace zero.Web.Controllers [ZeroAuthorize(Permissions.Settings.Users, PermissionsValue.Write)] public async Task Save([FromBody] UserRoleEditModel model) { - var state = ModelState; UserRole role = await Mapper.Map(model, await Api.GetById(model.Id)); return await As(await Api.Save(role)); } diff --git a/zero.Web/Formatters/RawJsonBodyInputFormatter.cs b/zero.Web/Formatters/RawJsonBodyInputFormatter.cs new file mode 100644 index 00000000..90f7c73e --- /dev/null +++ b/zero.Web/Formatters/RawJsonBodyInputFormatter.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Mvc.Formatters; +using System; +using System.IO; +using System.Threading.Tasks; + +namespace zero.Web.Formatters +{ + public class RawJsonBodyInputFormatter : InputFormatter + { + public RawJsonBodyInputFormatter() + { + this.SupportedMediaTypes.Add("application/json"); + } + + public override async Task ReadRequestBodyAsync(InputFormatterContext context) + { + var request = context.HttpContext.Request; + using (var reader = new StreamReader(request.Body)) + { + var content = await reader.ReadToEndAsync(); + return await InputFormatterResult.SuccessAsync(content); + } + } + + protected override bool CanReadType(Type type) + { + return type == typeof(string); + } + } +} diff --git a/zero.Web/Mapper/SpaceMapperConfig.cs b/zero.Web/Mapper/SpaceMapperConfig.cs new file mode 100644 index 00000000..99005faf --- /dev/null +++ b/zero.Web/Mapper/SpaceMapperConfig.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using zero.Core.Entities; +using zero.Core.Identity; +using zero.Core.Extensions; +using zero.Web.Models; +using Raven.Client.Documents; + +namespace zero.Web.Mapper +{ + public class SpaceMapperConfig : IMapperConfig + { + /// + public void Configure(IMapper config) + { + //config.CreateMap((source, target) => + //{ + // target.Id = source.Id; + // target.Name = source.Name; + // target.IsActive = source.IsActive; + // target.CreatedDate = source.CreatedDate; + // target. + //}); + } + } +} diff --git a/zero.Web/Models/EditModel.cs b/zero.Web/Models/EditModel.cs index 7e0cb6a5..81b32cb1 100644 --- a/zero.Web/Models/EditModel.cs +++ b/zero.Web/Models/EditModel.cs @@ -1,4 +1,7 @@ -namespace zero.Web.Models +using Newtonsoft.Json; +using System; + +namespace zero.Web.Models { public abstract class EditModel { diff --git a/zero.Web/Startup.cs b/zero.Web/Startup.cs index cb41d75b..a7b1a7ce 100644 --- a/zero.Web/Startup.cs +++ b/zero.Web/Startup.cs @@ -18,6 +18,7 @@ using zero.Core.Entities; using zero.Core.Extensions; using zero.TestData; using zero.TestData.Lists; +using zero.Web.Formatters; namespace zero.Web { @@ -122,6 +123,7 @@ namespace zero.Web IMvcBuilder mvc = services.AddMvc(opts => { opts.Filters.Add(); + opts.InputFormatters.Insert(0, new RawJsonBodyInputFormatter()); }) //.ExtendWithCore() .AddNewtonsoftJson(opts => @@ -129,6 +131,8 @@ namespace zero.Web opts.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" }); opts.SerializerSettings.Converters.Add(new StringEnumConverter(new CamelCaseNamingStrategy())); opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + + JsonConvert.DefaultSettings = () => opts.SerializerSettings; }); if (Environment.GetEnvironmentVariable("DOTNET_WATCH") == "1")