From c81cb6a60033008c491f9f80be442e6c106ec75f Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Fri, 15 Oct 2021 13:04:05 +0200 Subject: [PATCH] backoffice indexes for zero --- zero.Core/Api/RecycleBinApi.cs | 7 +++--- zero.Core/Api/SpacesApi.cs | 3 ++- zero.Core/Collections/CollectionBase.cs | 17 +++++++++++++ .../Indexes/Backoffice/zero_Countries.cs | 20 ++++++++++++++++ .../Indexes/Backoffice/zero_Languages.cs | 21 ++++++++++++++++ .../Indexes/Backoffice/zero_MailTemplates.cs | 24 +++++++++++++++++++ .../Backoffice/zero_RecycledEntities.cs | 18 ++++++++++++++ .../Indexes/Backoffice/zero_Spaces.cs | 22 +++++++++++++++++ .../Indexes/Backoffice/zero_Translations.cs | 22 +++++++++++++++++ zero.Core/Options/ZeroOptions.cs | 7 ++++++ zero.Web.UI/app/core/list-column.ts | 2 +- zero.Web.UI/app/core/list.ts | 2 +- .../BackofficeCollectionController.cs | 11 +++------ zero.Web/Controllers/CountriesController.cs | 13 ++++++++-- zero.Web/Controllers/LanguagesController.cs | 13 ++++++++-- .../Controllers/MailTemplatesController.cs | 12 +++++++++- zero.Web/Controllers/SpacesController.cs | 2 ++ .../Controllers/TranslationsController.cs | 9 ++++--- 18 files changed, 201 insertions(+), 24 deletions(-) create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_Countries.cs create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_Languages.cs create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_MailTemplates.cs create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_RecycledEntities.cs create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_Spaces.cs create mode 100644 zero.Core/Database/Indexes/Backoffice/zero_Translations.cs diff --git a/zero.Core/Api/RecycleBinApi.cs b/zero.Core/Api/RecycleBinApi.cs index 2b723888..0bfd8948 100644 --- a/zero.Core/Api/RecycleBinApi.cs +++ b/zero.Core/Api/RecycleBinApi.cs @@ -4,6 +4,7 @@ using Raven.Client.Documents.Session; using System.Collections.Generic; using System.Threading.Tasks; using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Utils; @@ -68,7 +69,7 @@ namespace zero.Core.Api { query.SearchSelector = x => x.Name; - return await Session.Query() + return await Session.Query() .WhereIf(x => x.Group == query.Group, !query.Group.IsNullOrWhiteSpace()) .WhereIf(x => x.OperationId == query.OperationId, !query.OperationId.IsNullOrWhiteSpace()) .ToQueriedListAsync(query); @@ -78,7 +79,7 @@ namespace zero.Core.Api /// public async Task> GetByOperation(string operationId) { - return await Session.Query() + return await Session.Query() .Where(x => x.OperationId == operationId) .ToListAsync(); } @@ -89,7 +90,7 @@ namespace zero.Core.Api /// public async Task GetCountByOperation(string operationId) { - return await Session.Query() + return await Session.Query() .Where(x => x.OperationId == operationId) .CountAsync(); } diff --git a/zero.Core/Api/SpacesApi.cs b/zero.Core/Api/SpacesApi.cs index 8039b915..6c1c0d23 100644 --- a/zero.Core/Api/SpacesApi.cs +++ b/zero.Core/Api/SpacesApi.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; @@ -92,7 +93,7 @@ namespace zero.Core.Api { query.SearchSelector = item => item.Name; - return await Session.Query() + return await Session.Query() .Where(x => x.SpaceAlias == alias) .ToQueriedListAsync(query); } diff --git a/zero.Core/Collections/CollectionBase.cs b/zero.Core/Collections/CollectionBase.cs index 5da526bd..57d82b75 100644 --- a/zero.Core/Collections/CollectionBase.cs +++ b/zero.Core/Collections/CollectionBase.cs @@ -1,6 +1,7 @@ using FluentValidation; using FluentValidation.Results; using Raven.Client; +using Raven.Client.Documents.Indexes; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System; @@ -157,6 +158,17 @@ namespace zero.Core.Collections } + /// + public virtual async Task> GetByQuery(ListQuery query) where TIndex : AbstractCommonApiForIndexes, new() + { + if (query.SearchSelector == null && !query.SearchSelectors.Any()) + { + query.SearchSelector = x => x.Name; + } + return await Session.Query().WhereIf(x => x.IsActive, OnlyActive).ToQueriedListAsync(query); + } + + /// public virtual async Task> GetAll() { @@ -513,6 +525,11 @@ namespace zero.Core.Collections /// Task> GetByQuery(ListQuery query); + /// + /// Get entities by query (by using the specified index) + /// + Task> GetByQuery(ListQuery query) where TIndex : AbstractCommonApiForIndexes, new(); + /// /// Get all entities from this collection. /// Warning: Don't use this method for large collections. Stream the results instead. diff --git a/zero.Core/Database/Indexes/Backoffice/zero_Countries.cs b/zero.Core/Database/Indexes/Backoffice/zero_Countries.cs new file mode 100644 index 00000000..ea6b043b --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_Countries.cs @@ -0,0 +1,20 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_Countries : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Name = item.Name, + IsPreferred = item.IsPreferred + }); + + Index(x => x.Name, FieldIndexing.Search); + } + } +} diff --git a/zero.Core/Database/Indexes/Backoffice/zero_Languages.cs b/zero.Core/Database/Indexes/Backoffice/zero_Languages.cs new file mode 100644 index 00000000..935558a1 --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_Languages.cs @@ -0,0 +1,21 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_Languages : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Name = item.Name, + CreatedDate = item.CreatedDate, + IsDefault = item.IsDefault + }); + + Index(x => x.Name, FieldIndexing.Search); + } + } +} diff --git a/zero.Core/Database/Indexes/Backoffice/zero_MailTemplates.cs b/zero.Core/Database/Indexes/Backoffice/zero_MailTemplates.cs new file mode 100644 index 00000000..80809324 --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_MailTemplates.cs @@ -0,0 +1,24 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_MailTemplates : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Name = item.Name, + Key = item.Key, + Subject = item.Subject, + CreatedDate = item.CreatedDate + }); + + Index(x => x.Name, FieldIndexing.Search); + Index(x => x.Key, FieldIndexing.Search); + Index(x => x.Subject, FieldIndexing.Search); + } + } +} diff --git a/zero.Core/Database/Indexes/Backoffice/zero_RecycledEntities.cs b/zero.Core/Database/Indexes/Backoffice/zero_RecycledEntities.cs new file mode 100644 index 00000000..ddf8e4d0 --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_RecycledEntities.cs @@ -0,0 +1,18 @@ +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_RecycledEntities : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Group = item.Group, + OperationId = item.OperationId, + CreatedDate = item.CreatedDate + }); + } + } +} diff --git a/zero.Core/Database/Indexes/Backoffice/zero_Spaces.cs b/zero.Core/Database/Indexes/Backoffice/zero_Spaces.cs new file mode 100644 index 00000000..c7479d3b --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_Spaces.cs @@ -0,0 +1,22 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_Spaces : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Name = item.Name, + IsActive = item.IsActive, + SpaceAlias = item.SpaceAlias, + CreatedDate = item.CreatedDate + }); + + Index(x => x.Name, FieldIndexing.Search); + } + } +} diff --git a/zero.Core/Database/Indexes/Backoffice/zero_Translations.cs b/zero.Core/Database/Indexes/Backoffice/zero_Translations.cs new file mode 100644 index 00000000..69fa96a7 --- /dev/null +++ b/zero.Core/Database/Indexes/Backoffice/zero_Translations.cs @@ -0,0 +1,22 @@ +using Raven.Client.Documents.Indexes; +using System.Linq; +using zero.Core.Entities; + +namespace zero.Core.Database.Indexes +{ + public class zero_Translations : ZeroIndex + { + protected override void Create() + { + Map = items => items.Select(item => new + { + Key = item.Key, + Value = item.Value, + CreatedDate = item.CreatedDate + }); + + Index(x => x.Key, FieldIndexing.Search); + Index(x => x.Value, FieldIndexing.Search); + } + } +} diff --git a/zero.Core/Options/ZeroOptions.cs b/zero.Core/Options/ZeroOptions.cs index 7ba0f02e..143cdc7e 100644 --- a/zero.Core/Options/ZeroOptions.cs +++ b/zero.Core/Options/ZeroOptions.cs @@ -42,6 +42,13 @@ namespace zero.Core.Options Raven.Indexes.Add(); Raven.Indexes.Add(); + Raven.Indexes.Add(); + Raven.Indexes.Add(); + Raven.Indexes.Add(); + Raven.Indexes.Add(); + Raven.Indexes.Add(); + Raven.Indexes.Add(); + Search = new(); } diff --git a/zero.Web.UI/app/core/list-column.ts b/zero.Web.UI/app/core/list-column.ts index 71ca166f..69cbdf8b 100644 --- a/zero.Web.UI/app/core/list-column.ts +++ b/zero.Web.UI/app/core/list-column.ts @@ -11,7 +11,7 @@ class ListColumn label: null, hideLabel: false, width: null, - canSort: true, + canSort: false, class: '' }; diff --git a/zero.Web.UI/app/core/list.ts b/zero.Web.UI/app/core/list.ts index 8fefb2f6..0fd017a6 100644 --- a/zero.Web.UI/app/core/list.ts +++ b/zero.Web.UI/app/core/list.ts @@ -159,7 +159,7 @@ class List * @param {boolean} [options.hideLabel=false] - Hide the column label * @param {number} [options.index] - Custom position for this column * @param {number} [options.width] - Custom width of the column in px - * @param {boolean} [options.canSort=true] - Disable/enable sorting within this column + * @param {boolean} [options.canSort=false] - Disable/enable sorting within this column * @param {string} [options.class] - Append HTML class to the generated cells * @returns {ListColumn} */ diff --git a/zero.Web/Controllers/BackofficeCollectionController.cs b/zero.Web/Controllers/BackofficeCollectionController.cs index bce84aad..75576eae 100644 --- a/zero.Web/Controllers/BackofficeCollectionController.cs +++ b/zero.Web/Controllers/BackofficeCollectionController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using Raven.Client.Documents.Indexes; using Raven.Client.Documents.Linq; using System; using System.Collections.Generic; @@ -17,6 +18,7 @@ namespace zero.Web.Controllers { protected TCollection Collection { get; private set; } + [Obsolete] protected Func, IRavenQueryable> DefaultQuery { get; set; } protected Action PreviewTransform { get; set; } @@ -46,14 +48,7 @@ namespace zero.Web.Controllers public virtual async Task> GetByQuery([FromQuery] ListBackofficeQuery query) { - query.SearchSelector = model => model.Name; - IRavenQueryable ravenQuery = Collection.Query; - if (DefaultQuery != null) - { - ravenQuery = DefaultQuery(ravenQuery); - } - - return await ravenQuery.ToQueriedListAsync(query); + return await Collection.GetByQuery(query); } diff --git a/zero.Web/Controllers/CountriesController.cs b/zero.Web/Controllers/CountriesController.cs index 4d4e6459..0de66d36 100644 --- a/zero.Web/Controllers/CountriesController.cs +++ b/zero.Web/Controllers/CountriesController.cs @@ -1,5 +1,9 @@ -using Raven.Client.Documents.Linq; +using Microsoft.AspNetCore.Mvc; +using Raven.Client.Documents; +using Raven.Client.Documents.Linq; +using System.Threading.Tasks; using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Identity; @@ -11,8 +15,13 @@ namespace zero.Web.Controllers { public CountriesController(ICountriesCollection collection) : base(collection) { - DefaultQuery = q => q.OrderByDescending(x => x.IsPreferred).ThenBy(x => x.Name); PreviewTransform = (item, model) => model.Icon = "flag-" + item.Code.ToLowerInvariant(); } + + public override async Task> GetByQuery([FromQuery] ListBackofficeQuery query) + { + query.OrderQuery = q => q.OrderByDescending(x => x.IsPreferred).ThenBy(x => x.Name); + return await Collection.GetByQuery(query); + } } } diff --git a/zero.Web/Controllers/LanguagesController.cs b/zero.Web/Controllers/LanguagesController.cs index 3737953d..164669a4 100644 --- a/zero.Web/Controllers/LanguagesController.cs +++ b/zero.Web/Controllers/LanguagesController.cs @@ -1,7 +1,10 @@ -using Raven.Client.Documents.Linq; +using Microsoft.AspNetCore.Mvc; +using Raven.Client.Documents.Linq; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Identity; @@ -12,7 +15,6 @@ namespace zero.Web.Controllers { public LanguagesController(ILanguagesCollection collection) : base(collection) { - DefaultQuery = q => q.OrderByDescending(x => x.CreatedDate); PreviewTransform = (item, model) => model.Icon = "fth-globe"; } @@ -27,5 +29,12 @@ namespace zero.Web.Controllers { return Collection.GetAllCultures(Options.SupportedLanguages); } + + + public override async Task> GetByQuery([FromQuery] ListBackofficeQuery query) + { + query.OrderQuery = q => q.OrderByDescending(x => x.CreatedDate); + return await Collection.GetByQuery(query); + } } } diff --git a/zero.Web/Controllers/MailTemplatesController.cs b/zero.Web/Controllers/MailTemplatesController.cs index 51c1c243..086b0852 100644 --- a/zero.Web/Controllers/MailTemplatesController.cs +++ b/zero.Web/Controllers/MailTemplatesController.cs @@ -1,4 +1,8 @@ -using zero.Core.Collections; +using Microsoft.AspNetCore.Mvc; +using Raven.Client.Documents; +using System.Threading.Tasks; +using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Identity; @@ -11,5 +15,11 @@ namespace zero.Web.Controllers { PreviewTransform = (item, model) => model.Icon = "fth-mail"; } + + public override async Task> GetByQuery([FromQuery] ListBackofficeQuery query) + { + query.SearchFor(entity => entity.Name, entity => entity.Key, entity => entity.Subject); + return await Collection.GetByQuery(query); + } } } diff --git a/zero.Web/Controllers/SpacesController.cs b/zero.Web/Controllers/SpacesController.cs index cd0b5a41..7cd0005f 100644 --- a/zero.Web/Controllers/SpacesController.cs +++ b/zero.Web/Controllers/SpacesController.cs @@ -45,6 +45,8 @@ namespace zero.Web.Controllers return Ok(await Api.GetListByQuery(alias, query)); } + + public async Task GetContent([FromQuery] string alias, [FromQuery] string contentId = null) { if (!CanReadSpace(alias)) diff --git a/zero.Web/Controllers/TranslationsController.cs b/zero.Web/Controllers/TranslationsController.cs index ac760c4a..7a36e9df 100644 --- a/zero.Web/Controllers/TranslationsController.cs +++ b/zero.Web/Controllers/TranslationsController.cs @@ -3,8 +3,8 @@ using Raven.Client.Documents.Linq; using System.Linq; using System.Threading.Tasks; using zero.Core.Collections; +using zero.Core.Database.Indexes; using zero.Core.Entities; -using zero.Core.Extensions; using zero.Core.Identity; namespace zero.Web.Controllers @@ -12,14 +12,13 @@ namespace zero.Web.Controllers [ZeroAuthorize(Permissions.Settings.Translations, PermissionsValue.Read)] public class TranslationsController : BackofficeCollectionController { - public TranslationsController(ITranslationsCollection collection) : base(collection) - { - } + public TranslationsController(ITranslationsCollection collection) : base(collection) { } public override async Task> GetByQuery([FromQuery] ListBackofficeQuery query) { query.SearchFor(entity => entity.Key, entity => entity.Value); - return await Collection.Query.OrderByDescending(x => x.CreatedDate).ToQueriedListAsync(query); + query.OrderQuery = q => q.OrderByDescending(x => x.CreatedDate); + return await Collection.GetByQuery(query); } } }