From 6bf25202cfec2c2d509accb256d285a964c542b4 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Wed, 15 Dec 2021 21:44:06 +0100 Subject: [PATCH] revert some mappings for now --- .../ZeroApiEntityStoreController.cs | 96 ++++++++++++++++++- .../ZeroApiTreeEntityStoreController.cs | 51 +++++++++- .../Countries/CountriesController.cs | 10 +- .../Languages/LanguagesController.cs | 10 +- .../Mails/MailTemplatesController.cs | 2 +- .../Translations/TranslationsController.cs | 10 +- 6 files changed, 161 insertions(+), 18 deletions(-) diff --git a/zero.Api/Abstractions/ZeroApiEntityStoreController.cs b/zero.Api/Abstractions/ZeroApiEntityStoreController.cs index 6f2006f1..9225cd9c 100644 --- a/zero.Api/Abstractions/ZeroApiEntityStoreController.cs +++ b/zero.Api/Abstractions/ZeroApiEntityStoreController.cs @@ -40,6 +40,20 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } + protected async Task> EmptyModel(string flavorAlias = null, Action modify = null) + { + TModel model = await Store.Empty(flavorAlias); + + if (model == null) + { + return NotFound(); + } + + modify?.Invoke(model); + return model; + } + + protected async Task> GetModel(string id, string changeVector = null) where T : DisplayModel { TModel model = await Store.Load(id, changeVector); @@ -55,6 +69,21 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } + protected async Task> GetModel(string id, string changeVector = null) + { + TModel model = await Store.Load(id, changeVector); + + if (model == null) + { + return NotFound(); + } + + HttpContext.Items[ApiConstants.ChangeToken] = Store.GetChangeToken(model); + + return model; + } + + protected async Task> GetModels(ListQuery query) where T : BasicModel { query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); @@ -65,7 +94,16 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } - protected async Task> GetModels(ListQuery query) where T : BasicModel where TIndex : AbstractCommonApiForIndexes, new() + protected async Task> GetModels(ListQuery query) + { + query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); + query.SearchSelector ??= x => x.Name; + Paged result = await Store.Load(query.Page, query.PageSize, q => q.Filter(query)); + return result; + } + + + protected async Task> GetModelsByIndex(ListQuery query) where T : BasicModel where TIndex : AbstractCommonApiForIndexes, new() { query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); query.SearchSelector ??= x => x.Name; @@ -75,6 +113,15 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } + protected async Task> GetModelsByIndex(ListQuery query) where TIndex : AbstractCommonApiForIndexes, new() + { + query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); + query.SearchSelector ??= x => x.Name; + Paged result = await Store.Load(query.Page, query.PageSize, q => q.Filter(query)); + return result; + } + + protected async Task> CreateModel(T saveModel) where T : SaveModel where TEdit : DisplayModel { TModel emptyModel = saveModel.Flavor.IsNullOrEmpty() ? await Store.Empty() : await Store.Empty(saveModel.Flavor); @@ -94,6 +141,21 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } + protected async Task> CreateModel(TModel saveModel) + { + Result result = await Store.Create(saveModel); + + bool minimalResponse = Hints.ResponsePreference == ApiResponsePreference.Minimal; + + if (result.IsSuccess) + { + return Created(GetAction(saveModel), minimalResponse ? null : saveModel); + } + + return result.WithoutModel(); + } + + protected async Task> UpdateModel(string id, T updateModel, string changeToken = null) where T : SaveModel where TEdit : DisplayModel { if (id != updateModel.Id) @@ -129,6 +191,38 @@ public abstract class ZeroApiEntityStoreController : ZeroApiCont } + protected async Task> UpdateModel(string id, TModel updateModel, string changeToken = null) + { + if (id != updateModel.Id) + { + return BadRequest(Result.Fail(nameof(id), "@errors.onupdate.noidmatch")); + } + + TModel model = await Store.Load(id); + + if (model == null) + { + return BadRequest(Result.Fail(nameof(id), "@errors.idnotfound")); + } + + string storedChangeToken = Store.GetChangeToken(model); + + if (!changeToken.IsNullOrEmpty() && storedChangeToken != changeToken) + { + return BadRequest(Result.Fail("@errors.onupdate.changetokenmismatch")); + } + + Result result = await Store.Update(updateModel); + + if (Hints.ResponsePreference == ApiResponsePreference.Minimal) + { + return result.WithoutModel(); + } + + return result; + } + + protected async Task> DeleteModel(string id) { TModel model = await Store.Load(id); diff --git a/zero.Api/Abstractions/ZeroApiTreeEntityStoreController.cs b/zero.Api/Abstractions/ZeroApiTreeEntityStoreController.cs index 0cc42be5..89ff9021 100644 --- a/zero.Api/Abstractions/ZeroApiTreeEntityStoreController.cs +++ b/zero.Api/Abstractions/ZeroApiTreeEntityStoreController.cs @@ -19,7 +19,16 @@ public abstract class ZeroApiTreeEntityStoreController : ZeroApi } - protected async Task> GetChildModels(string parentId, ListQuery query) where T : BasicModel where TIndex : AbstractCommonApiForIndexes, new() + protected async Task> GetChildModels(string parentId, ListQuery query) + { + query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); + Paged result = await Store.LoadChildren(parentId, query.Page, query.PageSize, q => q.Filter(query)); + + return result; + } + + + protected async Task> GetChildModelsByIndex(string parentId, ListQuery query) where T : BasicModel where TIndex : AbstractCommonApiForIndexes, new() { query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); Paged result = await Store.LoadChildren(parentId, query.Page, query.PageSize, q => q.Filter(query)); @@ -28,6 +37,15 @@ public abstract class ZeroApiTreeEntityStoreController : ZeroApi } + protected async Task> GetChildModelsByIndex(string parentId, ListQuery query) where TIndex : AbstractCommonApiForIndexes, new() + { + query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); + Paged result = await Store.LoadChildren(parentId, query.Page, query.PageSize, q => q.Filter(query)); + + return result; + } + + protected async Task> SortModels(string[] ids) { return await Store.Sort(ids); @@ -40,18 +58,36 @@ public abstract class ZeroApiTreeEntityStoreController : ZeroApi } + protected async Task> MoveModel(string pageId, string newParentId) + { + return await PutOperation(async () => await Store.Move(pageId, newParentId)); + } + + protected async Task> CopyModel(string pageId, string newParentId) where TEdit : DisplayModel { return await PutOperation(async () => await Store.Copy(pageId, newParentId)); } + protected async Task> CopyModel(string pageId, string newParentId) + { + return await PutOperation(async () => await Store.Copy(pageId, newParentId)); + } + + protected async Task> CopyModelWithDescendants(string pageId, string newParentId) where TEdit : DisplayModel { return await PutOperation(async () => await Store.CopyWithDescendants(pageId, newParentId)); } + protected async Task> CopyModelWithDescendants(string pageId, string newParentId) + { + return await PutOperation(async () => await Store.CopyWithDescendants(pageId, newParentId)); + } + + protected async Task> DeleteModelWithDescendants(string id) { TModel model = await Store.Load(id); @@ -78,4 +114,17 @@ public abstract class ZeroApiTreeEntityStoreController : ZeroApi return Mapper.Map(result); } + + + async Task> PutOperation(Func>> action) + { + Result result = await action(); + + if (Hints.ResponsePreference == ApiResponsePreference.Minimal) + { + return result.WithoutModel(); + } + + return result; + } } diff --git a/zero.Api/Endpoints/Countries/CountriesController.cs b/zero.Api/Endpoints/Countries/CountriesController.cs index a92173b5..c6cbdbb9 100644 --- a/zero.Api/Endpoints/Countries/CountriesController.cs +++ b/zero.Api/Endpoints/Countries/CountriesController.cs @@ -9,12 +9,12 @@ public class CountriesController : ZeroApiEntityStoreController> Empty(string flavor = null) => EmptyModel(flavor); + public virtual Task> Empty(string flavor = null) => EmptyModel(flavor); [HttpGet("{id}")] [ZeroAuthorize(CountryPermissions.Read)] - public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); + public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); [HttpGet("")] @@ -22,18 +22,18 @@ public class CountriesController : ZeroApiEntityStoreController> Get([FromQuery] ListQuery query) { query.OrderQuery = q => q.OrderByDescending(x => x.IsPreferred).ThenBy(x => x.Name); - return GetModels(query); + return GetModelsByIndex(query); } [HttpPost("")] [ZeroAuthorize(CountryPermissions.Create)] - public virtual Task> Create(CountrySave saveModel) => CreateModel(saveModel); + public virtual Task> Create(Country saveModel) => CreateModel(saveModel); [HttpPut("{id}")] [ZeroAuthorize(CountryPermissions.Update)] - public virtual Task> Update(string id, CountrySave updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); + public virtual Task> Update(string id, Country updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); [HttpDelete("{id}")] diff --git a/zero.Api/Endpoints/Languages/LanguagesController.cs b/zero.Api/Endpoints/Languages/LanguagesController.cs index 173bff7f..262e3014 100644 --- a/zero.Api/Endpoints/Languages/LanguagesController.cs +++ b/zero.Api/Endpoints/Languages/LanguagesController.cs @@ -12,27 +12,27 @@ public class LanguagesController : ZeroApiEntityStoreController> Empty(string flavor = null) => EmptyModel(flavor); + public virtual Task> Empty(string flavor = null) => EmptyModel(flavor); [HttpGet("{id}")] [ZeroAuthorize(LanguagePermissions.Read)] - public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); + public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); [HttpGet("")] [ZeroAuthorize(LanguagePermissions.Read)] - public virtual Task> Get([FromQuery] ListQuery query) => GetModels(query); + public virtual Task> Get([FromQuery] ListQuery query) => GetModelsByIndex(query); [HttpPost("")] [ZeroAuthorize(LanguagePermissions.Create)] - public virtual Task> Create(LanguageSave saveModel) => CreateModel(saveModel); + public virtual Task> Create(Language saveModel) => CreateModel(saveModel); [HttpPut("{id}")] [ZeroAuthorize(LanguagePermissions.Update)] - public virtual Task> Update(string id, LanguageSave updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); + public virtual Task> Update(string id, Language updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); [HttpDelete("{id}")] diff --git a/zero.Api/Endpoints/Mails/MailTemplatesController.cs b/zero.Api/Endpoints/Mails/MailTemplatesController.cs index aa459416..01b5c47c 100644 --- a/zero.Api/Endpoints/Mails/MailTemplatesController.cs +++ b/zero.Api/Endpoints/Mails/MailTemplatesController.cs @@ -25,7 +25,7 @@ public class MailTemplatesController : ZeroApiEntityStoreController> Get([FromQuery] ListQuery query) { query.SearchFor(entity => entity.Name, entity => entity.Key, entity => entity.Subject); - return GetModels(query); + return GetModelsByIndex(query); } diff --git a/zero.Api/Endpoints/Translations/TranslationsController.cs b/zero.Api/Endpoints/Translations/TranslationsController.cs index 2fc56f4f..107d9eb8 100644 --- a/zero.Api/Endpoints/Translations/TranslationsController.cs +++ b/zero.Api/Endpoints/Translations/TranslationsController.cs @@ -12,12 +12,12 @@ public class TranslationsController : ZeroApiEntityStoreController> Empty(string flavor = null) => EmptyModel(flavor); + public virtual Task> Empty(string flavor = null) => EmptyModel(flavor); [HttpGet("{id}")] [ZeroAuthorize(TranslationPermissions.Read)] - public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); + public virtual Task> Get(string id, string changeVector = null) => GetModel(id, changeVector); [HttpGet("")] @@ -25,18 +25,18 @@ public class TranslationsController : ZeroApiEntityStoreController> Get([FromQuery] ListQuery query) { query.SearchFor(x => x.Key, x => x.Value); - return GetModels(query); + return GetModelsByIndex(query); } [HttpPost("")] [ZeroAuthorize(TranslationPermissions.Create)] - public virtual Task> Create(TranslationSave saveModel) => CreateModel(saveModel); + public virtual Task> Create(Translation saveModel) => CreateModel(saveModel); [HttpPut("{id}")] [ZeroAuthorize(TranslationPermissions.Update)] - public virtual Task> Update(string id, TranslationSave updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); + public virtual Task> Update(string id, Translation updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken); [HttpDelete("{id}")]