From f0963d245ab8c6fe6ac37cbb9f11031ede831d07 Mon Sep 17 00:00:00 2001 From: bkapustik <82807109+bkapustik@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:08:08 +0200 Subject: [PATCH] feat(sln): remove all obsolete api references --- Directory.Packages.props | 8 +- .../DancingGoat/.config/dotnet-tools.json | 2 +- .../SampleDataGeneratorApplication.cs | 4 +- .../Components/ComponentIdentifiers.cs | 2 +- .../FormBuilderComponentRegister.cs | 2 +- .../ColorPickerEditorViewModel.cs | 2 +- .../InlineEditors/InlineEditorViewModel.cs | 2 +- .../TextEditor/TextEditorViewModel.cs | 2 +- .../PageBuilderComponentRegister.cs | 2 +- .../IsInContactGroupConditionType.cs | 2 +- .../Sections/ThemeSectionProperties.cs | 2 +- .../ThreeColumnSectionProperties.cs | 2 +- .../Components/Sections/ZoneRestrictions.cs | 2 +- .../Articles/ArticlesViewComponent.cs | 12 +- .../Banner/BannerViewComponent.cs | 2 +- .../ViewComponents/Cafe/CafeViewComponent.cs | 2 +- .../ViewComponents/Cafe/Default.cshtml | 14 +- .../CafeCardSectionViewComponent.cs | 41 +- .../CafeCardSectionViewModel.cs | 10 + .../CafeCardSection/Default.cshtml | 10 +- .../NavigationMenuViewComponent.cs | 2 +- .../TrackingConsentViewComponent.cs | 4 +- .../CTAButton/CTAButtonWidgetViewModel.cs | 2 +- .../CardWidget/CardWidgetProperties.cs | 2 +- .../CardWidget/CardWidgetViewComponent.cs | 4 +- .../Widgets/CardWidget/CardWidgetViewModel.cs | 2 +- .../HeroImageWidgetProperties.cs | 2 +- .../HeroImageWidgetViewComponent.cs | 4 +- .../HeroImageWidgetViewModel.cs | 2 +- .../ProductCardListViewModel.cs | 6 +- .../ProductCardProperties.cs | 6 +- .../ProductCardSchemaFilter.cs | 17 + .../ProductCardWidget/ProductCardViewModel.cs | 14 +- .../ProductCardWidgetViewComponent.cs | 15 +- .../TestimonialWidgetProperties.cs | 4 +- .../Controllers/AccountController.cs | 10 +- .../Controllers/ConsentController.cs | 1 + .../DancingGoatArticleController.cs | 42 +- .../DancingGoatCoffeeController.cs | 48 + .../DancingGoatConfirmationController.cs | 2 +- .../DancingGoatContactsController.cs | 30 +- .../DancingGoatGrinderController.cs | 48 + .../Controllers/DancingGoatHomeController.cs | 2 +- .../DancingGoatLandingPageController.cs | 42 + .../DancingGoatPrivacyController.cs | 74 +- .../DancingGoatProductController.cs | 97 ++ .../Controllers/HttpErrorsController.cs | 2 +- .../Controllers/SiteMapController.cs | 117 ++ examples/DancingGoat/DancingGoatConstants.cs | 2 +- examples/DancingGoat/Data/Template.zip | Bin 4949617 -> 5103094 bytes .../Helpers/AreaRestrictionHelper.cs | 2 +- .../Models/Account/LoginViewModel.cs | 2 +- .../Models/Account/RegisterViewModel.cs | 2 +- .../Models/ContentRepositoryBase.cs | 73 +- .../Reusable/Banner/Banner.generated.cs | 2 + .../Models/Reusable/Cafe/Cafe.generated.cs | 2 + .../Models/Reusable/Cafe/CafeRepository.cs | 17 +- .../Models/Reusable/Cafe/CafeViewModel.cs | 7 +- .../Reusable/Coffee/Coffee.generated.cs | 32 +- .../Reusable/Coffee/CoffeeRepository.cs | 67 - .../Reusable/Contact/Contact.generated.cs | 2 + .../Reusable/Contact/ContactRepository.cs | 7 +- .../Reusable/Contact/ContactViewModel.cs | 14 +- .../Models/Reusable/Event/Event.generated.cs | 2 + .../Models/Reusable/Event/EventViewModel.cs | 8 +- .../Reusable/Grinder/Grinder.generated.cs | 72 + .../Models/Reusable/Image/Image.generated.cs | 2 + .../Models/Reusable/Image/ImageRepository.cs | 5 +- .../Reusable/Product/ProductRepository.cs | 164 ++ .../Reusable/Reference/Reference.generated.cs | 2 + .../Reusable/Reference/ReferenceViewModel.cs | 8 +- .../SocialLink/SocialLink.generated.cs | 2 + .../SocialLink/SocialLinkRepository.cs | 7 +- .../SocialLink/SocialLinkViewModel.cs | 2 +- .../Models/Reusable/Tag/TagViewModel.cs | 45 + .../Reusable/Taxonomy/TaxonomyViewModel.cs | 33 + .../Models/Schema/IProductFields.generated.cs | 51 + .../Models/Schema/ISEOFields.generated.cs | 45 + .../ArticlePage/ArticleDetailViewModel.cs | 11 +- .../ArticlePage/ArticlePage.generated.cs | 23 +- .../ArticlePage/ArticlePageRepository.cs | 27 +- .../WebPage/ArticlePage/ArticleViewModel.cs | 5 +- .../ArticlesSection.generated.cs | 23 +- .../ArticlesSectionRepository.cs | 4 +- .../ArticlesSectionViewModel.cs | 21 +- .../CoffeePage/CoffeeDetailViewModel.cs | 30 + .../Models/WebPage/CoffeePage/CoffeePage.cs | 13 + .../CoffeePage/CoffeePage.generated.cs | 43 + .../ConfirmationPage.generated.cs | 23 +- .../ConfirmationPageRepository.cs | 4 +- .../ConfirmationPageViewModel.cs | 11 +- .../ContactsPage/ContactsIndexViewModel.cs | 16 +- .../ContactsPage/ContactsPage.generated.cs | 23 +- .../ContactsPage/ContactsPageRepository.cs | 79 + .../GrinderPage/GrinderDetailViewModel.cs | 30 + .../Models/WebPage/GrinderPage/GrinderPage.cs | 13 + .../GrinderPage/GrinderPage.generated.cs | 43 + .../WebPage/HomePage/HomePage.generated.cs | 23 +- .../WebPage/HomePage/HomePageRepository.cs | 4 +- .../WebPage/HomePage/HomePageViewModel.cs | 10 +- .../Models/WebPage/IWebPageBasedViewModel.cs | 15 + .../LandingPage/LandingPage.generated.cs | 23 +- .../LandingPage/LandingPageRepository.cs | 67 + .../NavigationItem.generated.cs | 3 + .../NavigationItemRepository.cs | 4 +- .../NavigationItem/NavigationItemViewModel.cs | 2 +- .../PrivacyConsentViewModel.cs | 2 - .../PrivacyPage/PrivacyPage.generated.cs | 55 + .../PrivacyPageConstants.cs | 0 .../PrivacyPage/PrivacyPageRepository.cs | 64 + .../PrivacyViewModel.cs | 7 +- .../WebPage/ProductPage/IProductPage.cs | 17 + .../ProductPage/ProductListItemViewModel.cs | 24 + .../ProductPage/ProductListViewModel.cs | 8 + .../ProductPage/ProductPageRepository.cs | 151 ++ .../ProductSectionRepository.cs | 82 + .../ProductsSection.generated.cs} | 9 +- .../Models/WebPage/SEOSchemaDataRetriever.cs | 120 ++ .../PageTemplates/Article/_Article.cshtml | 6 +- .../Article/_ArticleWithSidebar.cshtml | 6 +- ...DancingGoat_LandingPageSingleColumn.cshtml | 3 +- .../PageTemplates/_ViewImports.cshtml | 2 +- examples/DancingGoat/Program.cs | 15 + examples/DancingGoat/README.md | 29 +- .../DancingGoatSamplesModule.cs | 16 +- .../SampleContactInfoIdentityCollector.cs | 0 .../SampleMemberInfoIdentityCollector.cs | 0 .../PersonalDataCollectors/CollectedColumn.cs | 0 .../SampleContactDataCollector.cs | 8 +- .../SampleContactDataCollectorCore.cs | 8 +- .../SampleMemberDataCollector.cs | 0 .../SampleMemberDataCollectorCore.cs | 0 .../HumanReadablePersonalDataWriter.cs | 0 .../Writers/IPersonalDataWriter.cs | 0 .../Writers/XmlPersonalDataWriter.cs | 0 .../SampleContactPersonalDataEraser.cs | 10 +- .../SampleMemberPersonalDataEraser.cs | 0 .../EmailActivityTrackingEvaluator.cs | 49 + .../Services/IServiceCollectionExtensions.cs | 14 +- .../Views/DancingGoatArticle/Index.cshtml | 5 +- .../Views/DancingGoatCoffee/Detail.cshtml | 41 + .../DancingGoatConfirmation/Index.cshtml | 4 - .../Views/DancingGoatContacts/Index.cshtml | 23 +- .../Views/DancingGoatGrinder/Detail.cshtml | 41 + .../Views/DancingGoatHome/Index.cshtml | 4 - .../Views/DancingGoatPrivacy/Index.cshtml | 54 +- .../Views/DancingGoatProduct/Filter.cshtml | 15 + .../Views/DancingGoatProduct/Index.cshtml | 29 + .../DancingGoatProduct/ProductsList.cshtml | 18 + .../DisplayTemplates/ProductListItem.cshtml | 15 + .../EditorTemplates/TagViewModel.cshtml | 10 + .../Views/Shared/_DancingGoatLayout.cshtml | 34 +- .../Views/Shared/_LandingPageLayout.cshtml | 24 +- .../DancingGoat/Views/_ViewImports.cshtml | 1 + .../510968cb-ef94-433c-ac43-2ae7679e92d4.jpg | Bin 0 -> 23639 bytes .../a0fee33a-d7bc-4f4e-ad0b-5154e0c131b3.jpg | Bin 0 -> 23639 bytes .../12d13cb4-6639-4166-9de1-8a1377cc840d.jpg | Bin 0 -> 21768 bytes .../390a5c69-11e2-41f0-9cb0-a716af074393.jpg | Bin 0 -> 25422 bytes .../6af2458f-e1b7-4d0c-b0aa-769f0e677551.jpg | Bin 0 -> 25422 bytes .../c7037ecc-202b-423a-bce7-12d010eb7c2f.jpg | Bin 0 -> 21768 bytes examples/DancingGoat/packages.lock.json | 410 ++--- .../wwwroot/Content/Styles/Controls.less | 186 +++ .../wwwroot/Content/Styles/Landing-page.css | 11 + .../wwwroot/Content/Styles/Products.less | 132 ++ .../wwwroot/Content/Styles/Site.css | 352 +++- .../wwwroot/Content/Styles/Site.less | 4 + .../Content/Styles/TrackingConsent.less | 16 + .../wwwroot/Scripts/formAutoPost.js | 44 + .../Admin/Client/package-lock.json | 1451 ++++++++++------- .../Admin/Client/package.json | 8 +- .../Admin/FrontEnd/package-lock.json | 202 +-- .../Admin/FrontEnd/package.json | 2 +- .../Admin/UIPages/CodeSnippetCreatePage.cs | 8 +- .../packages.lock.json | 368 +++-- .../packages.lock.json | 372 ++--- 175 files changed, 4837 insertions(+), 1750 deletions(-) create mode 100644 examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewModel.cs create mode 100644 examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs create mode 100644 examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs create mode 100644 examples/DancingGoat/Controllers/DancingGoatGrinderController.cs create mode 100644 examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs create mode 100644 examples/DancingGoat/Controllers/DancingGoatProductController.cs create mode 100644 examples/DancingGoat/Controllers/SiteMapController.cs delete mode 100644 examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs create mode 100644 examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs create mode 100644 examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs create mode 100644 examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs create mode 100644 examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs create mode 100644 examples/DancingGoat/Models/Schema/IProductFields.generated.cs create mode 100644 examples/DancingGoat/Models/Schema/ISEOFields.generated.cs create mode 100644 examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs create mode 100644 examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs create mode 100644 examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs create mode 100644 examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs create mode 100644 examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs create mode 100644 examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs create mode 100644 examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs create mode 100644 examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs create mode 100644 examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs rename examples/DancingGoat/Models/WebPage/{Privacy => PrivacyPage}/PrivacyConsentViewModel.cs (83%) create mode 100644 examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs rename examples/DancingGoat/Models/WebPage/{Privacy => PrivacyPage}/PrivacyPageConstants.cs (100%) create mode 100644 examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs rename examples/DancingGoat/Models/WebPage/{Privacy => PrivacyPage}/PrivacyViewModel.cs (75%) create mode 100644 examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs create mode 100644 examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs create mode 100644 examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs create mode 100644 examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs create mode 100644 examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs rename examples/DancingGoat/Models/WebPage/{Privacy/PrivacyPage.generated.cs => ProductsSection/ProductsSection.generated.cs} (74%) create mode 100644 examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/DancingGoatSamplesModule.cs (91%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/IdentityCollectors/SampleContactInfoIdentityCollector.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/IdentityCollectors/SampleMemberInfoIdentityCollector.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/CollectedColumn.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/SampleContactDataCollector.cs (93%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/SampleContactDataCollectorCore.cs (99%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/SampleMemberDataCollector.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/SampleMemberDataCollectorCore.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/Writers/HumanReadablePersonalDataWriter.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/Writers/IPersonalDataWriter.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataCollectors/Writers/XmlPersonalDataWriter.cs (100%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataErasers/SampleContactPersonalDataEraser.cs (94%) rename examples/DancingGoat/{DataProtectionSamples => Samples/DataProtection}/PersonalDataErasers/SampleMemberPersonalDataEraser.cs (100%) create mode 100644 examples/DancingGoat/Samples/EmailActivityTracking/EmailActivityTrackingEvaluator.cs create mode 100644 examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml create mode 100644 examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml create mode 100644 examples/DancingGoat/Views/DancingGoatProduct/Filter.cshtml create mode 100644 examples/DancingGoat/Views/DancingGoatProduct/Index.cshtml create mode 100644 examples/DancingGoat/Views/DancingGoatProduct/ProductsList.cshtml create mode 100644 examples/DancingGoat/Views/Shared/DisplayTemplates/ProductListItem.cshtml create mode 100644 examples/DancingGoat/Views/Shared/EditorTemplates/TagViewModel.cshtml create mode 100644 examples/DancingGoat/assets/ContentItems/1e/1efd72c9-f3ff-4fbf-ac90-f18b7fe7b40e/cc721195-df8f-4799-b974-5ade63036cab/510968cb-ef94-433c-ac43-2ae7679e92d4.jpg create mode 100644 examples/DancingGoat/assets/ContentItems/60/60771371-3371-42cd-a101-8ffb6d90f318/cc721195-df8f-4799-b974-5ade63036cab/a0fee33a-d7bc-4f4e-ad0b-5154e0c131b3.jpg create mode 100644 examples/DancingGoat/assets/ContentItems/8a/8a4b970a-99d0-404a-8e9c-82a188731328/cc721195-df8f-4799-b974-5ade63036cab/12d13cb4-6639-4166-9de1-8a1377cc840d.jpg create mode 100644 examples/DancingGoat/assets/ContentItems/da/da0f6058-65b8-48d1-838d-b4d164839cb9/cc721195-df8f-4799-b974-5ade63036cab/390a5c69-11e2-41f0-9cb0-a716af074393.jpg create mode 100644 examples/DancingGoat/assets/ContentItems/dd/dde0b153-206f-4adc-924a-8d6e16a7df9e/cc721195-df8f-4799-b974-5ade63036cab/6af2458f-e1b7-4d0c-b0aa-769f0e677551.jpg create mode 100644 examples/DancingGoat/assets/ContentItems/fe/fe59453e-5e59-422f-97b7-0da25ac54354/cc721195-df8f-4799-b974-5ade63036cab/c7037ecc-202b-423a-bce7-12d010eb7c2f.jpg create mode 100644 examples/DancingGoat/wwwroot/Content/Styles/Controls.less create mode 100644 examples/DancingGoat/wwwroot/Content/Styles/Products.less create mode 100644 examples/DancingGoat/wwwroot/Scripts/formAutoPost.js diff --git a/Directory.Packages.props b/Directory.Packages.props index f7d776b..cdef38b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,10 +6,10 @@ true - - - - + + + + diff --git a/examples/DancingGoat/.config/dotnet-tools.json b/examples/DancingGoat/.config/dotnet-tools.json index 658a106..d6bdc96 100644 --- a/examples/DancingGoat/.config/dotnet-tools.json +++ b/examples/DancingGoat/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "kentico.xperience.dbmanager": { - "version": "28.1.0", + "version": "29.5.3", "commands": [ "kentico-xperience-dbmanager" ] diff --git a/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs b/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs index 1e0251e..92a0588 100644 --- a/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs +++ b/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs @@ -43,7 +43,7 @@ public class SampleDataGeneratorApplication : OverviewPageBase private readonly IInfoProvider consentInfoProvider; private readonly IInfoProvider bizFormInfoProvider; private readonly IInfoProvider contactGroupInfoProvider; - private readonly ISettingsKeyInfoProvider settingsKeyInfoProvider; + private readonly IInfoProvider settingsKeyInfoProvider; private readonly IInfoProvider websiteChannelInfoProvider; @@ -63,7 +63,7 @@ public SampleDataGeneratorApplication( IInfoProvider consentInfoProvider, IInfoProvider bizFormInfoProvider, IInfoProvider contactGroupInfoProvider, - ISettingsKeyInfoProvider settingsKeyInfoProvider, + IInfoProvider settingsKeyInfoProvider, IInfoProvider websiteChannelInfoProvider) { this.formBuilderConfigurationSerializer = formBuilderConfigurationSerializer; diff --git a/examples/DancingGoat/Components/ComponentIdentifiers.cs b/examples/DancingGoat/Components/ComponentIdentifiers.cs index a14c0d8..4001b07 100644 --- a/examples/DancingGoat/Components/ComponentIdentifiers.cs +++ b/examples/DancingGoat/Components/ComponentIdentifiers.cs @@ -21,4 +21,4 @@ public static class ComponentIdentifiers public const string ARTICLE_TEMPLATE = "DancingGoat.Article"; public const string ARTICLE_WITH_SIDEBAR_TEMPLATE = "DancingGoat.ArticleWithSidebar"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/FormBuilderComponentRegister.cs b/examples/DancingGoat/Components/FormBuilderComponentRegister.cs index 24f4781..a8afe79 100644 --- a/examples/DancingGoat/Components/FormBuilderComponentRegister.cs +++ b/examples/DancingGoat/Components/FormBuilderComponentRegister.cs @@ -2,4 +2,4 @@ using Kentico.Forms.Web.Mvc; -[assembly: RegisterFormSection("DancingGoat.TitledSection", "Section with title", "~/Components/FormSections/TitledSection/_TitledSection.cshtml", Description = "Single-column section with one zone and an editable title", IconClass = "icon-rectangle-a", PropertiesType = typeof(TitledSectionProperties))] \ No newline at end of file +[assembly: RegisterFormSection("DancingGoat.TitledSection", "Section with title", "~/Components/FormSections/TitledSection/_TitledSection.cshtml", Description = "Single-column section with one zone and an editable title", IconClass = "icon-rectangle-a", PropertiesType = typeof(TitledSectionProperties))] diff --git a/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs index 8293a82..9c68348 100644 --- a/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs @@ -10,4 +10,4 @@ public sealed class ColorPickerEditorViewModel : InlineEditorViewModel /// public string ColorCssClass { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs index e12fe37..916b8b7 100644 --- a/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs @@ -10,4 +10,4 @@ public abstract class InlineEditorViewModel /// public string PropertyName { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs index bafe5d9..b122df9 100644 --- a/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs @@ -16,4 +16,4 @@ public sealed class TextEditorViewModel : InlineEditorViewModel /// public string PlaceholderText { get; set; } = "Type your text"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/PageBuilderComponentRegister.cs b/examples/DancingGoat/Components/PageBuilderComponentRegister.cs index 1db2b0f..b904930 100644 --- a/examples/DancingGoat/Components/PageBuilderComponentRegister.cs +++ b/examples/DancingGoat/Components/PageBuilderComponentRegister.cs @@ -1,4 +1,4 @@ -using DancingGoat; +using DancingGoat; using DancingGoat.Models; using DancingGoat.PageTemplates; using DancingGoat.Sections; diff --git a/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs b/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs index 23a616e..6e2a3f9 100644 --- a/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs +++ b/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs @@ -46,4 +46,4 @@ public override bool Evaluate() return contact.IsInAnyContactGroup(SelectedContactGroups.Select(c => c.ObjectCodeName).ToArray()); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs b/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs index 2fa7bb6..1d57989 100644 --- a/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs +++ b/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs @@ -14,4 +14,4 @@ public class ThemeSectionProperties : ISectionProperties [DropDownComponent(Label = "Color scheme", Order = 1, Options = ";None\nsection-white;Flat white\nsection-cappuccino;Cappuccino")] public string Theme { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs b/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs index 99dc9b6..aa491a1 100644 --- a/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs +++ b/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs @@ -13,4 +13,4 @@ public class ThreeColumnSectionProperties : ThemeSectionProperties [TextInputComponent(Label = "Title", Order = 1)] public string Title { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs b/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs index ab62de6..c28d28d 100644 --- a/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs +++ b/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs @@ -58,4 +58,4 @@ private static IEnumerable GetWidgetsIdentifiers() .Select(definition => definition.Identifier); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs index 1ac19fa..3675cda 100644 --- a/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs @@ -43,10 +43,10 @@ public async Task InvokeAsync(WebPageRelatedItem articl { var languageName = currentLanguageRetriever.Get(); - var articlesSection = await articlesSectionRepository.GetArticlesSection(articlesSectionItem.WebPageGuid, languageName); + var articlesSection = await articlesSectionRepository.GetArticlesSection(articlesSectionItem.WebPageGuid, languageName, HttpContext.RequestAborted); if (articlesSection == null) { - return View("~/Components/ViewComponents/Articles/Default.cshtml", ArticlesSectionViewModel.GetViewModel(Enumerable.Empty(), string.Empty)); + return View("~/Components/ViewComponents/Articles/Default.cshtml", ArticlesSectionViewModel.GetViewModel(null, Enumerable.Empty(), string.Empty)); } var articlePages = await articlePageRepository.GetArticles(articlesSection.SystemFields.WebPageItemTreePath, @@ -55,15 +55,15 @@ public async Task InvokeAsync(WebPageRelatedItem articl var models = new List(); foreach (var article in articlePages) { - var model = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName); + var model = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName, HttpContext.RequestAborted); models.Add(model); } - var url = (await urlRetriever.Retrieve(articlesSection, languageName)).RelativePath; + var url = (await urlRetriever.Retrieve(articlesSection, languageName, HttpContext.RequestAborted)).RelativePath; - var viewModel = ArticlesSectionViewModel.GetViewModel(models, url); + var viewModel = ArticlesSectionViewModel.GetViewModel(articlesSection, models, url); return View("~/Components/ViewComponents/Articles/Default.cshtml", viewModel); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs index 85a197e..30214c7 100644 --- a/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs @@ -15,4 +15,4 @@ public ViewViewComponentResult Invoke(BannerViewModel banner) return View("~/Components/ViewComponents/Banner/Default.cshtml", banner); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs index 5cc5e21..aea0596 100644 --- a/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs @@ -15,4 +15,4 @@ public ViewViewComponentResult Invoke(CafeViewModel cafe) return View("~/Components/ViewComponents/Cafe/Default.cshtml", cafe); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Cafe/Default.cshtml b/examples/DancingGoat/Components/ViewComponents/Cafe/Default.cshtml index 144930d..adf016c 100644 --- a/examples/DancingGoat/Components/ViewComponents/Cafe/Default.cshtml +++ b/examples/DancingGoat/Components/ViewComponents/Cafe/Default.cshtml @@ -8,13 +8,11 @@ } else { - -

@Model.Name

- - @if (!string.IsNullOrEmpty(Model.PhotoPath)) - { - @Model.PhotoShortDescription - } -
+

@Model.Name

+ + @if (!string.IsNullOrEmpty(Model.PhotoPath)) + { + @Model.PhotoShortDescription + } } \ No newline at end of file diff --git a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs index 32a3b46..21e673c 100644 --- a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs @@ -1,8 +1,13 @@ using System.Collections.Generic; -using System.Linq; +using System.Threading.Tasks; +using System.Threading; + +using CMS.Websites; using DancingGoat.Models; +using Kentico.Content.Web.Mvc.Routing; + using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ViewComponents; @@ -11,11 +16,39 @@ namespace DancingGoat.ViewComponents /// /// Cafe card section view component. /// - public class CafeCardSectionViewComponent: ViewComponent + public class CafeCardSectionViewComponent : ViewComponent { - public ViewViewComponentResult Invoke(IEnumerable cafes) + private readonly ContactsPageRepository contactsPageRepository; + private readonly IWebPageUrlRetriever webPageUrlRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + + + public CafeCardSectionViewComponent(IPreferredLanguageRetriever currentLanguageRetriever, ContactsPageRepository contactsPageRepository, IWebPageUrlRetriever webPageUrlRetriever) + { + this.currentLanguageRetriever = currentLanguageRetriever; + this.contactsPageRepository = contactsPageRepository; + this.webPageUrlRetriever = webPageUrlRetriever; + } + + + public async Task InvokeAsync(IEnumerable cafes) { - return View("~/Components/ViewComponents/CafeCardSection/Default.cshtml", cafes.Take(3)); + string languageName = currentLanguageRetriever.Get(); + string contactsPagePath = await GetContactsPagePath(languageName, HttpContext.RequestAborted); + var model = new CafeCardSectionViewModel(cafes, contactsPagePath); + + return View("~/Components/ViewComponents/CafeCardSection/Default.cshtml", model); + } + + + private async Task GetContactsPagePath(string languageName, CancellationToken cancellationToken) + { + const string CONTACTS_PAGE_TREE_PATH = "/Contacts"; + + var contactsPage = await contactsPageRepository.GetContactsPage(CONTACTS_PAGE_TREE_PATH, languageName, cancellationToken); + var url = await webPageUrlRetriever.Retrieve(contactsPage, cancellationToken); + + return url.RelativePath; } } } diff --git a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewModel.cs b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewModel.cs new file mode 100644 index 0000000..b913e19 --- /dev/null +++ b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +using DancingGoat.Models; + +namespace DancingGoat.ViewComponents +{ + public record CafeCardSectionViewModel(IEnumerable Cafes, string ContactsPagePath) + { + } +} diff --git a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/Default.cshtml b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/Default.cshtml index 4d3463d..74b7e0d 100644 --- a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/Default.cshtml +++ b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/Default.cshtml @@ -1,15 +1,17 @@ -@using DancingGoat.Models -@model IEnumerable +@using DancingGoat.ViewComponents +@model CafeCardSectionViewModel

@HtmlLocalizer["Taste our coffee"]

- @foreach (var cafe in Model) + @foreach (var cafe in Model.Cafes) {
- + + +
}
diff --git a/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs index b7e0fbe..0dbdf25 100644 --- a/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs @@ -27,4 +27,4 @@ public async Task InvokeAsync() return View($"~/Components/ViewComponents/NavigationMenu/Default.cshtml", navigationViewModels); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/TrackingConsent/TrackingConsentViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/TrackingConsent/TrackingConsentViewComponent.cs index 5aba6e7..dc70e54 100644 --- a/examples/DancingGoat/Components/ViewComponents/TrackingConsent/TrackingConsentViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/TrackingConsent/TrackingConsentViewComponent.cs @@ -54,7 +54,7 @@ public async Task InvokeAsync() { ConsentShortText = (await consent.GetConsentTextAsync(currentLanguage)).ShortText, ReturnPageUrl = webPageDataContextRetriever.TryRetrieve(out var currentWebPageContext) - ? (await urlRetriever.Retrieve(currentWebPageContext.WebPage.WebPageItemID, currentLanguage)).RelativePath + ? (await urlRetriever.Retrieve(currentWebPageContext.WebPage.WebPageItemID, currentLanguage, cancellationToken: HttpContext.RequestAborted)).RelativePath : (HttpContext.Request.PathBase + HttpContext.Request.Path).Value }; @@ -62,7 +62,7 @@ public async Task InvokeAsync() if ((contact != null) && consentAgreementService.IsAgreed(contact, consent)) { consentModel.IsConsentAgreed = true; - consentModel.PrivacyPageUrl = Url.Content((await urlRetriever.Retrieve(PrivacyPageConstants.PRIVACY_PAGE_TREE_PATH, websiteChannelContext.WebsiteChannelName, currentLanguage)).RelativePath); + consentModel.PrivacyPageUrl = Url.Content((await urlRetriever.Retrieve(PrivacyPageConstants.PRIVACY_PAGE_TREE_PATH, websiteChannelContext.WebsiteChannelName, currentLanguage, cancellationToken: HttpContext.RequestAborted)).RelativePath); } return View("~/Components/ViewComponents/TrackingConsent/Default.cshtml", consentModel); diff --git a/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs index e4666ff..7d2ea2e 100644 --- a/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs @@ -22,4 +22,4 @@ public class CTAButtonWidgetViewModel /// public bool OpenInNewTab { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs index cd47e46..c432008 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs @@ -23,4 +23,4 @@ public class CardWidgetProperties : IWidgetProperties /// public string Text { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs index d532287..e008489 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Threading.Tasks; using DancingGoat.Models; @@ -66,4 +66,4 @@ private async Task GetImage(CardWidgetProperties properties, string langu return await imageRepository.GetImage(image.Identifier, languageName); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs index 4c36108..7e27780 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs @@ -16,4 +16,4 @@ public class CardWidgetViewModel /// public string Text { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs index cf92a29..ad72474 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs @@ -46,4 +46,4 @@ public class HeroImageWidgetProperties : IWidgetProperties [DropDownComponent(Label = "Color scheme", Order = 3, Options = "light;Light\ndark;Dark")] public string Theme { get; set; } = "dark"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs index 9fc24f3..4e74f23 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Threading.Tasks; using DancingGoat.Models; @@ -68,4 +68,4 @@ private async Task GetImage(HeroImageWidgetProperties properties, string return await imageRepository.GetImage(image.Identifier, languageName); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs index 84f095a..6c50c57 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs @@ -34,4 +34,4 @@ public class HeroImageWidgetViewModel /// public string Theme { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs index 26c15fc..7c37d68 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs @@ -21,10 +21,10 @@ public class ProductCardListViewModel /// /// Collection of products. /// Hydrated ViewModel. - public static ProductCardListViewModel GetViewModel(IEnumerable products) + public static ProductCardListViewModel GetViewModel(IEnumerable products) { var productModels = new List(); - + foreach (var product in products.Where(product => product != null)) { var productModel = ProductCardViewModel.GetViewModel(product); @@ -37,4 +37,4 @@ public static ProductCardListViewModel GetViewModel(IEnumerable products }; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs index 478674a..cf4a8d3 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs @@ -2,8 +2,6 @@ using CMS.ContentEngine; -using DancingGoat.Models; - using Kentico.PageBuilder.Web.Mvc; using Kentico.Xperience.Admin.Base.FormAnnotations; @@ -17,7 +15,7 @@ public class ProductCardProperties : IWidgetProperties /// /// Selected products. /// - [ContentItemSelectorComponent(Coffee.CONTENT_TYPE_NAME, Label = "Selected products", Order = 1)] + [ContentItemSelectorComponent(typeof(ProductCardSchemaFilter), Label = "Selected products", Order = 1)] public IEnumerable SelectedProducts { get; set; } = new List(); } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs new file mode 100644 index 0000000..9f36e5f --- /dev/null +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +using DancingGoat.Models; + +using Kentico.Xperience.Admin.Base.FormAnnotations; + +namespace DancingGoat.Widgets +{ + /// + /// Product card widget filter for content item selector. + /// + public class ProductCardSchemaFilter : IReusableFieldSchemasFilter + { + /// + IEnumerable IReusableFieldSchemasFilter.AllowedSchemaNames => new List { IProductFields.REUSABLE_FIELD_SCHEMA_NAME }; + } +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs index 6b5b86d..19936a5 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs @@ -32,7 +32,7 @@ public class ProductCardViewModel /// /// Product. /// Hydrated ViewModel. - public static ProductCardViewModel GetViewModel(Coffee product) + public static ProductCardViewModel GetViewModel(IProductFields product) { if (product == null) { @@ -40,11 +40,11 @@ public static ProductCardViewModel GetViewModel(Coffee product) } return new ProductCardViewModel - { - Heading = product.CoffeeName, - ImagePath = (product.CoffeeImage.FirstOrDefault())?.ImageFile.Url, - Text = product.CoffeeShortDescription - }; + { + Heading = product.ProductFieldsName, + ImagePath = product.ProductFieldsImage.FirstOrDefault()?.ImageFile.Url, + Text = product.ProductFieldsShortDescription + }; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs index c127307..04a3e77 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs @@ -1,7 +1,8 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using System.Threading.Tasks; +using CMS.ContentEngine; + using DancingGoat.Models; using DancingGoat.Widgets; @@ -26,7 +27,7 @@ public class ProductCardWidgetViewComponent : ViewComponent public const string IDENTIFIER = "DancingGoat.LandingPage.ProductCardWidget"; - private readonly CoffeeRepository repository; + private readonly ProductRepository repository; private readonly IPreferredLanguageRetriever currentLanguageRetriever; @@ -35,7 +36,7 @@ public class ProductCardWidgetViewComponent : ViewComponent /// /// Repository for retrieving products. /// Retrieves preferred language name for the current request. Takes language fallback into account. - public ProductCardWidgetViewComponent(CoffeeRepository repository, IPreferredLanguageRetriever currentLanguageRetriever) + public ProductCardWidgetViewComponent(ProductRepository repository, IPreferredLanguageRetriever currentLanguageRetriever) { this.repository = repository; this.currentLanguageRetriever = currentLanguageRetriever; @@ -46,11 +47,11 @@ public async Task InvokeAsync(ProductCardProperties pro { var languageName = currentLanguageRetriever.Get(); var selectedProductGuids = properties.SelectedProducts.Select(i => i.Identifier).ToList(); - IEnumerable products = (await repository.GetCoffees(selectedProductGuids, languageName)) - .OrderBy(p => selectedProductGuids.IndexOf(p.SystemFields.ContentItemGUID)); + var products = (await repository.GetProducts(selectedProductGuids, languageName)) + .OrderBy(p => selectedProductGuids.IndexOf(((IContentItemFieldsSource)p).SystemFields.ContentItemGUID)); var model = ProductCardListViewModel.GetViewModel(products); return View("~/Components/Widgets/ProductCardWidget/_ProductCardWidget.cshtml", model); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs index 3decca3..57c31e9 100644 --- a/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs @@ -12,7 +12,7 @@ public class TestimonialWidgetProperties : IWidgetProperties /// public string QuotationText { get; set; } - + /// /// Author text. /// @@ -24,4 +24,4 @@ public class TestimonialWidgetProperties : IWidgetProperties /// public string ColorCssClass { get; set; } = "first-color"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/AccountController.cs b/examples/DancingGoat/Controllers/AccountController.cs index 704a8f4..f43a9c6 100644 --- a/examples/DancingGoat/Controllers/AccountController.cs +++ b/examples/DancingGoat/Controllers/AccountController.cs @@ -180,10 +180,10 @@ private async Task GetHomeWebPageUrl(CancellationToken cancellationToken } var homePageUrl = await webPageUrlRetriever.Retrieve( - websiteChannel.WebsiteChannelHomePage, - websiteChannelContext.WebsiteChannelName, - currentLanguageRetriever.Get(), - websiteChannelContext.IsPreview, + websiteChannel.WebsiteChannelHomePage, + websiteChannelContext.WebsiteChannelName, + currentLanguageRetriever.Get(), + websiteChannelContext.IsPreview, cancellationToken ); @@ -196,4 +196,4 @@ private async Task GetHomeWebPageUrl(CancellationToken cancellationToken } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/ConsentController.cs b/examples/DancingGoat/Controllers/ConsentController.cs index 79545e1..5e11048 100644 --- a/examples/DancingGoat/Controllers/ConsentController.cs +++ b/examples/DancingGoat/Controllers/ConsentController.cs @@ -5,6 +5,7 @@ using DancingGoat.Helpers.Generator; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace DancingGoat.Controllers diff --git a/examples/DancingGoat/Controllers/DancingGoatArticleController.cs b/examples/DancingGoat/Controllers/DancingGoatArticleController.cs index cf03528..260fd39 100644 --- a/examples/DancingGoat/Controllers/DancingGoatArticleController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatArticleController.cs @@ -27,22 +27,22 @@ public class DancingGoatArticleController : Controller private readonly IPreferredLanguageRetriever currentLanguageRetriever; - public DancingGoatArticleController( - ArticlePageRepository articlePageRepository, - ArticlesSectionRepository articlesSectionRepository, - IWebPageUrlRetriever urlRetriever, - IWebPageDataContextRetriever webPageDataContextRetriever, - IPreferredLanguageRetriever currentLanguageRetriever) - { - this.articlePageRepository = articlePageRepository; - this.articlesSectionRepository = articlesSectionRepository; - this.urlRetriever = urlRetriever; - this.webPageDataContextRetriever = webPageDataContextRetriever; - this.currentLanguageRetriever = currentLanguageRetriever; - } - - - public async Task Index() + public DancingGoatArticleController( + ArticlePageRepository articlePageRepository, + ArticlesSectionRepository articlesSectionRepository, + IWebPageUrlRetriever urlRetriever, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever) + { + this.articlePageRepository = articlePageRepository; + this.articlesSectionRepository = articlesSectionRepository; + this.urlRetriever = urlRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + } + + + public async Task Index() { var languageName = currentLanguageRetriever.Get(); @@ -55,11 +55,15 @@ public async Task Index() var models = new List(); foreach (var article in articles) { - var model = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName); - models.Add(model); + var articleModel = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName); + models.Add(articleModel); } - return View(models); + var url = (await urlRetriever.Retrieve(articlesSection, languageName)).RelativePath; + + var model = ArticlesSectionViewModel.GetViewModel(articlesSection, models, url); + + return View(model); } diff --git a/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs b/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs new file mode 100644 index 0000000..75421af --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using CMS.ContentEngine; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +[assembly: RegisterWebPageRoute(CoffeePage.CONTENT_TYPE_NAME, typeof(DancingGoatCoffeeController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME }, ActionName = nameof(DancingGoatCoffeeController.Detail))] + +namespace DancingGoat.Controllers +{ + public class DancingGoatCoffeeController : Controller + { + private readonly ProductPageRepository productPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly ITaxonomyRetriever taxonomyRetriever; + + + public DancingGoatCoffeeController(ProductPageRepository productPageRepository, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productPageRepository = productPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Detail() + { + var languageName = currentLanguageRetriever.Get(); + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + + var coffee = await productPageRepository.GetProduct(CoffeePage.CONTENT_TYPE_NAME, webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return View(await CoffeeDetailViewModel.GetViewModel(coffee, languageName, taxonomyRetriever)); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs b/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs index f213f4a..2a4d559 100644 --- a/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs @@ -37,4 +37,4 @@ public async Task Index() return View(ConfirmationPageViewModel.GetViewModel(confirmationPage)); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatContactsController.cs b/examples/DancingGoat/Controllers/DancingGoatContactsController.cs index 1642f8b..ceadd78 100644 --- a/examples/DancingGoat/Controllers/DancingGoatContactsController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatContactsController.cs @@ -6,6 +6,8 @@ using DancingGoat; using DancingGoat.Controllers; using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; using Kentico.Content.Web.Mvc.Routing; using Microsoft.AspNetCore.Mvc; @@ -16,45 +18,57 @@ namespace DancingGoat.Controllers { public class DancingGoatContactsController : Controller { + private readonly ContactsPageRepository contactsPageRepository; private readonly ContactRepository contactRepository; private readonly CafeRepository cafeRepository; private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; - public DancingGoatContactsController(ContactRepository contactRepository, - CafeRepository cafeRepository, IPreferredLanguageRetriever currentLanguageRetriever) + public DancingGoatContactsController(ContactsPageRepository contactsPageRepository, ContactRepository contactRepository, + CafeRepository cafeRepository, IPreferredLanguageRetriever currentLanguageRetriever, IWebPageDataContextRetriever webPageDataContextRetriever) { + this.contactsPageRepository = contactsPageRepository; this.contactRepository = contactRepository; this.cafeRepository = cafeRepository; this.currentLanguageRetriever = currentLanguageRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; } public async Task Index(CancellationToken cancellationToken) { - var model = await GetIndexViewModel(cancellationToken); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + + var contactsPage = await contactsPageRepository.GetContactsPage(webPage.WebPageItemID, webPage.LanguageName, HttpContext.RequestAborted); + + var model = await GetIndexViewModel(contactsPage, cancellationToken); return View(model); } - private async Task GetIndexViewModel(CancellationToken cancellationToken) + private async Task GetIndexViewModel(ContactsPage contactsPage, CancellationToken cancellationToken) { var languageName = currentLanguageRetriever.Get(); - var cafes = await cafeRepository.GetCompanyCafes(4, languageName, cancellationToken); + var cafes = (await cafeRepository.GetCafes(0, languageName, cancellationToken)).ToList(); + var companyCafes = cafes.Where(c => c.CafeIsCompanyCafe).OrderBy(c => c.CafeName); + var partnerCafes = cafes.Where(c => !c.CafeIsCompanyCafe).OrderBy(c => c.CafeCity); var contact = await contactRepository.GetContact(languageName, HttpContext.RequestAborted); return new ContactsIndexViewModel { CompanyContact = ContactViewModel.GetViewModel(contact), - CompanyCafes = GetCompanyCafesModel(cafes) + CompanyCafes = GetCafesModel(companyCafes), + PartnerCafes = GetCafesModel(partnerCafes), + WebPage = contactsPage }; } - private List GetCompanyCafesModel(IEnumerable cafes) + private List GetCafesModel(IEnumerable cafes) { return cafes.Select(cafe => CafeViewModel.GetViewModel(cafe)).ToList(); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs b/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs new file mode 100644 index 0000000..be3f1a4 --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using CMS.ContentEngine; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +[assembly: RegisterWebPageRoute(GrinderPage.CONTENT_TYPE_NAME, typeof(DancingGoatGrinderController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME }, ActionName = nameof(DancingGoatGrinderController.Detail))] + +namespace DancingGoat.Controllers +{ + public class DancingGoatGrinderController : Controller + { + private readonly ProductPageRepository productPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly ITaxonomyRetriever taxonomyRetriever; + + + public DancingGoatGrinderController(ProductPageRepository productPageRepository, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productPageRepository = productPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Detail() + { + var languageName = currentLanguageRetriever.Get(); + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + + var grinder = await productPageRepository.GetProduct(GrinderPage.CONTENT_TYPE_NAME, webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return View(await GrinderDetailViewModel.GetViewModel(grinder, languageName, taxonomyRetriever)); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatHomeController.cs b/examples/DancingGoat/Controllers/DancingGoatHomeController.cs index 38d5823..68ee611 100644 --- a/examples/DancingGoat/Controllers/DancingGoatHomeController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatHomeController.cs @@ -34,4 +34,4 @@ public async Task Index() return View(HomePageViewModel.GetViewModel(homePage)); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs b/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs new file mode 100644 index 0000000..5dd7951 --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; +using Kentico.PageBuilder.Web.Mvc.PageTemplates; + +using Microsoft.AspNetCore.Mvc; + +[assembly: RegisterWebPageRoute(LandingPage.CONTENT_TYPE_NAME, typeof(DancingGoatLandingPageController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME })] + +namespace DancingGoat.Controllers +{ + public class DancingGoatLandingPageController : Controller + { + private readonly LandingPageRepository landingPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + + + public DancingGoatLandingPageController(LandingPageRepository landingPageRepository, IWebPageDataContextRetriever webPageDataContextRetriever, IPreferredLanguageRetriever currentLanguageRetriever) + { + this.landingPageRepository = landingPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + } + + + public async Task Index() + { + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + var languageName = currentLanguageRetriever.Get(); + + var landingPage = await landingPageRepository.GetLandingPage(webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return new TemplateResult(landingPage); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs b/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs index 5a3d602..992fd9c 100644 --- a/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs @@ -1,12 +1,19 @@ -using CMS.ContactManagement; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContactManagement; using CMS.DataEngine; using CMS.DataProtection; -using CMS.Helpers; + using DancingGoat; using DancingGoat.Controllers; using DancingGoat.Helpers.Generator; using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; using Kentico.Content.Web.Mvc.Routing; + using Microsoft.AspNetCore.Mvc; [assembly: RegisterWebPageRoute(PrivacyPage.CONTENT_TYPE_NAME, typeof(DancingGoatPrivacyController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME })] @@ -18,10 +25,11 @@ public class DancingGoatPrivacyController : Controller private const string SUCCESS_RESULT = "success"; private const string ERROR_RESULT = "error"; - private readonly ICurrentCookieLevelProvider cookieLevelProvider; private readonly IConsentAgreementService consentAgreementService; private readonly IInfoProvider consentInfoProvider; private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly PrivacyPageRepository privacyPageRepository; private ContactInfo currentContact; @@ -39,29 +47,33 @@ private ContactInfo CurrentContact } - public DancingGoatPrivacyController( - ICurrentCookieLevelProvider cookieLevelProvider, - IConsentAgreementService consentAgreementService, - IInfoProvider consentInfoProvider, - IPreferredLanguageRetriever currentLanguageRetriever) + public DancingGoatPrivacyController(PrivacyPageRepository privacyPageRepository, IConsentAgreementService consentAgreementService, IInfoProvider consentInfoProvider, IPreferredLanguageRetriever currentLanguageRetriever, IWebPageDataContextRetriever webPageDataContextRetriever) { - this.cookieLevelProvider = cookieLevelProvider; + this.privacyPageRepository = privacyPageRepository; this.consentAgreementService = consentAgreementService; this.consentInfoProvider = consentInfoProvider; this.currentLanguageRetriever = currentLanguageRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; } - public async Task Index() + public async Task Index() { - var model = new PrivacyViewModel(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + + var privacyPage = await privacyPageRepository.GetPrivacyPage(webPage.WebPageItemID, webPage.LanguageName, HttpContext.RequestAborted); + + var model = new PrivacyViewModel { WebPage = privacyPage }; if (!IsDemoEnabled()) { model.DemoDisabled = true; } + else if (CurrentContact != null) + { + model.Consents = GetAgreedConsentsForCurrentContact(); + } - model.Consents = await GetAgreedConsentsForCurrentContact(); model.ShowSavedMessage = TempData[SUCCESS_RESULT] != null; model.ShowErrorMessage = TempData[ERROR_RESULT] != null; model.PrivacyPageUrl = HttpContext.Request.Path; @@ -69,28 +81,6 @@ public async Task Index() return View(model); } - [HttpPost] - [ValidateAntiForgeryToken] - [Route("/Agree")] - public ActionResult Agree(string returnUrl, string consentName) - { - var consentToAgree = consentInfoProvider.Get(consentName); - - cookieLevelProvider.SetCurrentCookieLevel(Kentico.Web.Mvc.CookieLevel.All.Level); - - if (consentToAgree != null && CurrentContact != null) - { - consentAgreementService.Agree(CurrentContact, consentToAgree); - - TempData[SUCCESS_RESULT] = true; - } - else - { - TempData[ERROR_RESULT] = true; - } - - return Redirect(returnUrl); - } [HttpPost] [ValidateAntiForgeryToken] @@ -114,17 +104,15 @@ public ActionResult Revoke(string returnUrl, string consentName) } - private async Task> GetAgreedConsentsForCurrentContact() + private IEnumerable GetAgreedConsentsForCurrentContact() { - return await consentInfoProvider.Get() - .ToAsyncEnumerable() - .SelectAwait(async consent => new PrivacyConsentViewModel + return consentAgreementService.GetAgreedConsents(CurrentContact) + .Select(consent => new PrivacyConsentViewModel { - Name = consent.ConsentName, - Title = consent.ConsentDisplayName, - Text = (await consent.GetConsentTextAsync(currentLanguageRetriever.Get())).ShortText, - Agreed = CurrentContact is not null && consentAgreementService.IsAgreed(CurrentContact, consent) - }).ToListAsync(); + Name = consent.Name, + Title = consent.DisplayName, + Text = consent.GetConsentText(currentLanguageRetriever.Get()).ShortText + }); } diff --git a/examples/DancingGoat/Controllers/DancingGoatProductController.cs b/examples/DancingGoat/Controllers/DancingGoatProductController.cs new file mode 100644 index 0000000..511c03d --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatProductController.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Websites; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using Microsoft.AspNetCore.Mvc; + +[assembly: RegisterWebPageRoute(ProductsSection.CONTENT_TYPE_NAME, typeof(DancingGoatProductController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME })] + +namespace DancingGoat.Controllers +{ + public class DancingGoatProductController : Controller + { + private readonly ProductSectionRepository productSectionRepository; + private readonly ProductPageRepository productPageRepository; + private readonly ProductRepository productRepository; + private readonly ITaxonomyRetriever taxonomyRetriever; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + + + public DancingGoatProductController( + ProductSectionRepository productSectionRepository, + ProductPageRepository productPageRepository, + ProductRepository productRepository, + IWebPageUrlRetriever urlRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + IWebPageDataContextRetriever webPageDataContextRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productSectionRepository = productSectionRepository; + this.productPageRepository = productPageRepository; + this.productRepository = productRepository; + this.urlRetriever = urlRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Index() + { + var languageName = currentLanguageRetriever.Get(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + var productsSection = await productSectionRepository.GetProductsSection(webPage.WebPageItemID, languageName, HttpContext.RequestAborted); + + var products = await GetProducts(languageName, productsSection); + + var taxonomies = new Dictionary(); + var taxonomyNames = new List { "CoffeeProcessing", "CoffeeTastes", "GrinderManufacturer", "GrinderType" }; + foreach (var taxonomyName in taxonomyNames) + { + var taxonomy = await taxonomyRetriever.RetrieveTaxonomy(taxonomyName, languageName); + if (taxonomy.Tags.Any()) + { + taxonomies.Add(taxonomyName, TaxonomyViewModel.GetViewModel(taxonomy)); + } + } + + var listModel = new ProductListViewModel(products, taxonomies); + + return View(listModel); + } + + + [HttpPost($"{{{WebPageRoutingOptions.LANGUAGE_ROUTE_VALUE_KEY}}}/{{controller}}/{{action}}")] + [ValidateAntiForgeryToken] + public async Task Filter(IDictionary filter) + { + var languageName = currentLanguageRetriever.Get(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + var productsSection = await productSectionRepository.GetProductsSection(webPage.WebPageItemID, languageName, HttpContext.RequestAborted); + + var products = await GetProducts(languageName, productsSection, filter); + return PartialView("ProductsList", products); + } + + + private async Task> GetProducts(string languageName, ProductsSection productsSection, IDictionary filter = null) + { + var products = await productRepository.GetProducts(languageName, filter ?? new Dictionary(), cancellationToken: HttpContext.RequestAborted); + var productPages = await productPageRepository.GetProducts(productsSection.SystemFields.WebPageItemTreePath, languageName, products, cancellationToken: HttpContext.RequestAborted); + + return productPages.Select(productPage => ProductListItemViewModel.GetViewModel(productPage, urlRetriever, languageName).Result); + } + } +} diff --git a/examples/DancingGoat/Controllers/HttpErrorsController.cs b/examples/DancingGoat/Controllers/HttpErrorsController.cs index 06b2b2c..7057f60 100644 --- a/examples/DancingGoat/Controllers/HttpErrorsController.cs +++ b/examples/DancingGoat/Controllers/HttpErrorsController.cs @@ -14,4 +14,4 @@ public IActionResult Error(int code) return StatusCode(code); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/SiteMapController.cs b/examples/DancingGoat/Controllers/SiteMapController.cs new file mode 100644 index 0000000..28d5fdc --- /dev/null +++ b/examples/DancingGoat/Controllers/SiteMapController.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml; + +using CMS.ContentEngine; +using CMS.DataEngine; +using CMS.Websites; + +using DancingGoat.Models; + +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Mvc; + +namespace DancingGoat.Controllers +{ + /// + /// Controller for generating a sitemap. + /// + public class SiteMapController : Controller + { + private const string XML_TYPE = "application/xml"; + + private readonly IContentQueryExecutor contentQueryExecutor; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly IInfoProvider contentLanguageProvider; + + + /// + /// Initializes a new instance of the class. + /// + public SiteMapController(IContentQueryExecutor contentQueryExecutor, IWebPageUrlRetriever urlRetriever, IInfoProvider contentLanguageProvider) + { + this.contentQueryExecutor = contentQueryExecutor; + this.urlRetriever = urlRetriever; + this.contentLanguageProvider = contentLanguageProvider; + } + + + [HttpGet] + [Route("/sitemap.xml")] + public async Task Index() + { + var options = new ContentQueryExecutionOptions + { + ForPreview = false, + IncludeSecuredItems = false + }; + + var relativeUrls = new List(); + + foreach (var language in contentLanguageProvider.Get().OrderByDescending(i => i.ContentLanguageIsDefault)) + { + var builder = new ContentItemQueryBuilder().ForContentTypes(p => p.OfReusableSchema("SEOFields").ForWebsite()) + .InLanguage(language.ContentLanguageName, false) + .Parameters(p => p.Columns(nameof(IWebPageContentQueryDataContainer.WebPageItemID)) + .Where(w => w.WhereTrue(nameof(ISEOFields.SEOFieldsAllowSearchIndexing)))); + + var pageIdentifiers = await contentQueryExecutor.GetWebPageResult(builder, i => i.WebPageItemID, options, HttpContext.RequestAborted); + var languageUrls = await GetWebPageRelativeUrls(pageIdentifiers, language.ContentLanguageName); + + relativeUrls.AddRange(languageUrls); + } + + var absoluteUrls = GetAbsoluteUrls(relativeUrls); + var document = GetSitemap(absoluteUrls); + + return Content(document.OuterXml, XML_TYPE); + } + + + private async Task> GetWebPageRelativeUrls(IEnumerable pageIdentifiers, string languageName) + { + var relativeUrls = new List(); + + foreach (var pageIdentifier in pageIdentifiers) + { + var webPageUrl = await urlRetriever.Retrieve(pageIdentifier, languageName, false, HttpContext.RequestAborted); + relativeUrls.Add(webPageUrl.RelativePath.TrimStart('~')); + } + + return relativeUrls; + } + + + private IEnumerable GetAbsoluteUrls(IEnumerable relativeUrls) + { + var request = HttpContext.Request; + + return relativeUrls.Select(i => UriHelper.BuildAbsolute(request.Scheme, request.Host, path: i)).OrderBy(i => i); + } + + + private static XmlDocument GetSitemap(IEnumerable urls) + { + var document = new XmlDocument(); + + var urlSet = document.CreateElement("urlset"); + urlSet.SetAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in urls) + { + var element = document.CreateElement("url"); + var location = document.CreateElement("loc"); + location.InnerText = url; + + element.AppendChild(location); + urlSet.AppendChild(element); + } + + document.AppendChild(urlSet); + + return document; + } + } +} diff --git a/examples/DancingGoat/DancingGoatConstants.cs b/examples/DancingGoat/DancingGoatConstants.cs index ad53549..774b6b1 100644 --- a/examples/DancingGoat/DancingGoatConstants.cs +++ b/examples/DancingGoat/DancingGoatConstants.cs @@ -8,7 +8,7 @@ internal static class DancingGoatConstants /// The constraint ensures that broken URLs lead to a "404 page not found" page and are not handled by a controller dedicated to the component or /// to a page handled by the content tree-based router (which would lead to an exception). /// - public const string CONSTRAINT_FOR_NON_ROUTER_PAGE_CONTROLLERS = "Account|Consent"; + public const string CONSTRAINT_FOR_NON_ROUTER_PAGE_CONTROLLERS = "Account|Consent|SiteMap"; public const string DEFAULT_ROUTE_NAME = "default"; diff --git a/examples/DancingGoat/Data/Template.zip b/examples/DancingGoat/Data/Template.zip index 25c6560d553248b371691d40d6001b4b619102e4..2c7f8f33b7512d3eebb7331a26679e1d1ae1685c 100644 GIT binary patch delta 239059 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%0DMj5Qg0Z- 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%0A6=sJ*-nJ;bc3ZuYm{O0@_^Y{FF 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 delta 95428 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 Js~b6T{U4E$s-yq_ diff --git a/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs b/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs index 10404ff..6bc5878 100644 --- a/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs +++ b/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs @@ -31,4 +31,4 @@ private static IEnumerable GetWidgetsIdentifiers() .Select(definition => definition.Identifier); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Account/LoginViewModel.cs b/examples/DancingGoat/Models/Account/LoginViewModel.cs index 2127246..c865cc2 100644 --- a/examples/DancingGoat/Models/Account/LoginViewModel.cs +++ b/examples/DancingGoat/Models/Account/LoginViewModel.cs @@ -20,4 +20,4 @@ public class LoginViewModel [DisplayName("Stay signed in")] public bool StaySignedIn { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Account/RegisterViewModel.cs b/examples/DancingGoat/Models/Account/RegisterViewModel.cs index ada5add..386b39f 100644 --- a/examples/DancingGoat/Models/Account/RegisterViewModel.cs +++ b/examples/DancingGoat/Models/Account/RegisterViewModel.cs @@ -35,4 +35,4 @@ public class RegisterViewModel [Compare("Password", ErrorMessage = "Password does not match the confirmation password")] public string PasswordConfirmation { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/ContentRepositoryBase.cs b/examples/DancingGoat/Models/ContentRepositoryBase.cs index 511e9e5..f18e177 100644 --- a/examples/DancingGoat/Models/ContentRepositoryBase.cs +++ b/examples/DancingGoat/Models/ContentRepositoryBase.cs @@ -1,10 +1,18 @@ -using CMS.ContentEngine; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models { + ///

+ /// Shared implementation for content type repositories. + /// public abstract class ContentRepositoryBase { /// @@ -14,7 +22,6 @@ public abstract class ContentRepositoryBase private readonly IContentQueryExecutor executor; - private readonly IWebPageQueryResultMapper mapper; private readonly IProgressiveCache cache; @@ -23,13 +30,11 @@ public abstract class ContentRepositoryBase /// /// Website channel context. /// Content query executor. - /// Mapper to provide mapping from data container to model. /// Cache. - public ContentRepositoryBase(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) + public ContentRepositoryBase(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) { WebsiteChannelContext = websiteChannelContext; this.executor = executor; - this.mapper = mapper; this.cache = cache; } @@ -51,52 +56,6 @@ public Task> GetCachedQueryResult( CacheSettings cacheSettings, Func, CancellationToken, Task>> cacheDependenciesFunc, CancellationToken cancellationToken) - where T : new() - { - if (queryBuilder is null) - { - throw new ArgumentNullException(nameof(queryBuilder)); - } - - if (cacheSettings is null) - { - throw new ArgumentNullException(nameof(cacheSettings)); - } - - if (cacheDependenciesFunc is null) - { - throw new ArgumentNullException(nameof(cacheDependenciesFunc)); - } - - if (queryOptions == null) - { - queryOptions = new ContentQueryExecutionOptions(); - } - - return GetCachedQueryResultInternal(queryBuilder, queryOptions, container => mapper.Map(container), cacheSettings, cacheDependenciesFunc, cancellationToken); - } - - - /// - /// Returns cached query result. - /// - /// Model to which the query results will be mapped. - /// Prepared query builder to be executed by the injected . - /// Optional . Default values are used if not specified. - /// Function converting a web page content query data record container to the resulting instance. - /// Object with values to set up cache. See for more information. - /// Function that will create cache dependencies for the query. - /// Cancellation instruction. - /// Thrown when any of the , or parameters is null. - /// Request is not cached if the request is for preview. - public Task> GetCachedQueryResult( - ContentItemQueryBuilder queryBuilder, - ContentQueryExecutionOptions queryOptions, - Func resultSelector, - CacheSettings cacheSettings, - Func, CancellationToken, Task>> cacheDependenciesFunc, - CancellationToken cancellationToken) - where T : new() { if (queryBuilder is null) { @@ -118,31 +77,29 @@ public Task> GetCachedQueryResult( queryOptions = new ContentQueryExecutionOptions(); } - return GetCachedQueryResultInternal(queryBuilder, queryOptions, resultSelector, cacheSettings, cacheDependenciesFunc, cancellationToken); + return GetCachedQueryResultInternal(queryBuilder, queryOptions, cacheSettings, cacheDependenciesFunc, cancellationToken); } private async Task> GetCachedQueryResultInternal(ContentItemQueryBuilder queryBuilder, ContentQueryExecutionOptions queryOptions, - Func resultSelector, CacheSettings cacheSettings, Func, CancellationToken, Task>> cacheDependenciesFunc, CancellationToken cancellationToken) - where T : new() { queryOptions.ForPreview = WebsiteChannelContext.IsPreview; queryOptions.IncludeSecuredItems = queryOptions.IncludeSecuredItems || WebsiteChannelContext.IsPreview; if (WebsiteChannelContext.IsPreview) { - return await executor.GetWebPageResult(queryBuilder, resultSelector, options: queryOptions, cancellationToken: cancellationToken); + return await executor.GetMappedResult(queryBuilder, queryOptions, cancellationToken); } return await cache.LoadAsync(async (cacheSettings) => { - var result = await executor.GetWebPageResult(queryBuilder, resultSelector, options: queryOptions, cancellationToken: cancellationToken); + var result = await executor.GetMappedResult(queryBuilder, queryOptions, cancellationToken); - if (cacheSettings.Cached = (result != null && result.Any())) + if (cacheSettings.Cached = result != null && result.Any()) { cacheSettings.CacheDependency = CacheHelper.GetCacheDependency(await cacheDependenciesFunc(result, cancellationToken)); } diff --git a/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs b/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs index 2bffb4a..381fb0f 100644 --- a/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Banner : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Banner : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs b/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs index 2940e5c..46ba1ef 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Cafe : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Cafe : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs b/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs index 8a8546a..2bb02a5 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs @@ -6,7 +6,6 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models @@ -22,22 +21,21 @@ public partial class CafeRepository : ContentRepositoryBase public CafeRepository( IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, - IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + : base(websiteChannelContext, executor, cache) { this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; } /// - /// Returns an enumerable collection of company cafes ordered by a position in the content tree. + /// Returns an enumerable collection of cafes. /// - public async Task> GetCompanyCafes(int count, string languageName, CancellationToken cancellationToken = default) + public async Task> GetCafes(int count, string languageName, CancellationToken cancellationToken = default) { var queryBuilder = GetQueryBuilder(count, languageName); - var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(CafeRepository), languageName, nameof(GetCompanyCafes), count); + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(CafeRepository), nameof(GetCafes), count, languageName); return await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); } @@ -48,9 +46,8 @@ private static ContentItemQueryBuilder GetQueryBuilder(int count, string languag return new ContentItemQueryBuilder() .ForContentType(Cafe.CONTENT_TYPE_NAME, config => config - .WithLinkedItems(1) - .TopN(count) - .Where(where => where.WhereTrue(nameof(Cafe.CafeIsCompanyCafe)))) + .WithLinkedItems(1) + .TopN(count)) .InLanguage(languageName); } @@ -65,4 +62,4 @@ private async Task> GetDependencyCacheKeys(IEnumerable cafes, return dependencyCacheKeys; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs b/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs index dafbea7..9a26bb0 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs @@ -1,7 +1,12 @@ -namespace DancingGoat.Models +using System.Linq; + +namespace DancingGoat.Models { public record CafeViewModel(string Name, string PhotoPath, string PhotoShortDescription, string Street, string City, string Country, string ZipCode, string Phone) { + /// + /// Maps to a . + /// public static CafeViewModel GetViewModel(Cafe cafe) { var cafePhoto = cafe.CafePhoto?.FirstOrDefault(); diff --git a/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs b/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs index 75b1b01..4271000 100644 --- a/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs @@ -18,7 +18,8 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// - public partial class Coffee : IContentItemFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class Coffee : IContentItemFieldsSource, IProductFields { /// /// Code name of the content type. @@ -29,30 +30,43 @@ public partial class Coffee : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } /// - /// CoffeeName. + /// CoffeeProcessing. /// - public string CoffeeName { get; set; } + public IEnumerable CoffeeProcessing { get; set; } /// - /// CoffeeShortDescription. + /// CoffeeTastes. /// - public string CoffeeShortDescription { get; set; } + public IEnumerable CoffeeTastes { get; set; } /// - /// CoffeeDescription. + /// ProductFieldsName. /// - public string CoffeeDescription { get; set; } + public string ProductFieldsName { get; set; } /// - /// CoffeeImage. + /// ProductFieldsDescription. /// - public IEnumerable CoffeeImage { get; set; } + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs b/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs deleted file mode 100644 index adface8..0000000 --- a/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -using CMS.ContentEngine; -using CMS.Helpers; -using CMS.Websites; -using CMS.Websites.Routing; - -namespace DancingGoat.Models -{ - /// - /// Represents a collection of coffees. - /// - public partial class CoffeeRepository : ContentRepositoryBase - { - private readonly ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever; - - /// - /// Initializes a new instance of the class that returns coffees. - /// - public CoffeeRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) - { - this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; - } - - - /// - /// Returns an enumerable collection of based on a given collection of content item guids. - /// - public async Task> GetCoffees(ICollection coffeeGuids, string languageName, CancellationToken cancellationToken = default) - { - var queryBuilder = GetQueryBuilder(coffeeGuids, languageName); - - var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(CoffeeRepository), nameof(GetCoffees), languageName, coffeeGuids.Select(guid => guid.ToString()).Join("|")); - - return await GetCachedQueryResult(queryBuilder, null, cacheSettings, (coffees, cancellationToken) => GetDependencyCacheKeys(coffees, coffeeGuids), cancellationToken); - } - - - private static ContentItemQueryBuilder GetQueryBuilder(ICollection coffeeGuids, string languageName) - { - return new ContentItemQueryBuilder() - .ForContentType(Coffee.CONTENT_TYPE_NAME, - config => config - .WithLinkedItems(1) - .Where(where => where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), coffeeGuids))) - .InLanguage(languageName); - } - - - private Task> GetDependencyCacheKeys(IEnumerable coffees, IEnumerable coffeeGuids) - { - var dependencyCacheKeys = linkedItemsDependencyRetriever.Get(coffees.Select(coffee => coffee.SystemFields.ContentItemID), 1).ToHashSet(StringComparer.InvariantCultureIgnoreCase); - - foreach (var guid in coffeeGuids) - { - dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "contentitem", "byguid", guid.ToString() }, false)); - } - - return Task.FromResult>(dependencyCacheKeys); - } - } -} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs b/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs index 6c7e3e1..541e1d6 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Contact : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Contact : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs b/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs index 770c357..96f9025 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs @@ -5,7 +5,6 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models @@ -15,8 +14,8 @@ namespace DancingGoat.Models /// public class ContactRepository : ContentRepositoryBase { - public ContactRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ContactRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } @@ -58,4 +57,4 @@ private static Task> GetDependencyCacheKeys(IEnumerable co return Task.FromResult>(dependencyCacheKeys); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs b/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs index a007d16..3e01f8f 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs @@ -13,14 +13,14 @@ public static ContactViewModel GetViewModel(Contact contact) } return new ContactViewModel( - contact.ContactName, - contact.ContactStreet, - contact.ContactCity, - contact.ContactCountry, - contact.ContactZipCode, - contact.ContactPhone, + contact.ContactName, + contact.ContactStreet, + contact.ContactCity, + contact.ContactCountry, + contact.ContactZipCode, + contact.ContactPhone, contact.ContactEmail ); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs b/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs index dcc7131..221b331 100644 --- a/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Event : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Event : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs b/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs index 3cc4233..fb7ce36 100644 --- a/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs @@ -20,13 +20,13 @@ public static EventViewModel GetViewModel(Event eventContentItem) var cafe = eventContentItem.EventCafe?.FirstOrDefault(); return new EventViewModel( - eventContentItem.EventTitle, - bannerImage?.ImageFile.Url, - bannerImage?.ImageShortDescription, + eventContentItem.EventTitle, + bannerImage?.ImageFile.Url, + bannerImage?.ImageShortDescription, eventContentItem.EventPromoText, eventContentItem.EventDate, cafe?.CafeName, - cafe?.CafeCuppingOffer.Select(coffee => coffee.CoffeeName) + cafe?.CafeCuppingOffer.Select(coffee => coffee.ProductFieldsName) ); } } diff --git a/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs b/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs new file mode 100644 index 0000000..32cc100 --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs @@ -0,0 +1,72 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; + +namespace DancingGoat.Models +{ + /// + /// Represents a content item of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class Grinder : IContentItemFieldsSource, IProductFields + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.Grinder"; + + + /// + /// Represents system properties for a content item. + /// + [SystemField] + public ContentItemFields SystemFields { get; set; } + + + /// + /// GrinderManufacturer. + /// + public IEnumerable GrinderManufacturer { get; set; } + + + /// + /// GrinderType. + /// + public IEnumerable GrinderType { get; set; } + + + /// + /// ProductFieldsName. + /// + public string ProductFieldsName { get; set; } + + + /// + /// ProductFieldsDescription. + /// + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs b/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs index d334b91..4c98e04 100644 --- a/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Image : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Image : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs b/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs index 31e6e1f..2852d46 100644 --- a/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs @@ -6,15 +6,14 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models { public class ImageRepository : ContentRepositoryBase { - public ImageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ImageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs b/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs new file mode 100644 index 0000000..ff114df --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.DataEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of product pages. + /// + public class ProductRepository : ContentRepositoryBase + { + private const string COFFEE_PROCESSING = "CoffeeProcessing"; + private const string COFFEE_TASTES = "CoffeeTastes"; + private const string GRINDER_MANUFACTURER = "GrinderManufacturer"; + private const string GRINDER_TYPE = "GrinderType"; + + + private readonly ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever; + private readonly IInfoProvider taxonomyInfoProvider; + + + /// + /// Initializes new instance of . + /// + public ProductRepository( + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, + IProgressiveCache cache, + ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever, + IInfoProvider taxonomyInfoProvider) + : base(websiteChannelContext, executor, cache) + { + this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; + this.taxonomyInfoProvider = taxonomyInfoProvider; + } + + + /// + /// Returns list of content items. + /// + public async Task> GetProducts(string languageName, IDictionary filter, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + { + var queryBuilder = await GetQueryBuilder(languageName, filter: filter); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var filterCacheItemNameParts = filter.Values.Where(value => value != null && value.Tags != null).SelectMany(value => value.Tags.Where(tag => tag.IsChecked)).Select(id => id.Value.ToString()).Join("|"); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, includeSecuredItems, nameof(IProductFields), filterCacheItemNameParts); + + return await GetCachedQueryResult(queryBuilder, options, cacheSettings, (_, _) => GetDependencyCacheKeys(languageName), cancellationToken); + } + + + /// + /// Returns list of content items. + /// + public async Task> GetProducts(ICollection productGuids, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = await GetQueryBuilder(languageName, productGuids); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, nameof(IProductFields), productGuids.Select(guid => guid.ToString()).Join("|")); + + return await GetCachedQueryResult(queryBuilder, new ContentQueryExecutionOptions(), cacheSettings, (_, _) => GetDependencyCacheKeys(languageName, productGuids), cancellationToken); + } + + + private static async Task GetQueryBuilder(string languageName, IEnumerable productGuids = null, IDictionary filter = null) + { + var baseBuilder = new ContentItemQueryBuilder().ForContentTypes(ct => + { + ct.OfReusableSchema(IProductFields.REUSABLE_FIELD_SCHEMA_NAME) + .WithContentTypeFields() + .WithLinkedItems(1); + }).InLanguage(languageName); + + if (productGuids != null) + { + baseBuilder.Parameters(query => query.Where(where => where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), productGuids))); + } + + if (filter == null || !filter.Any()) + { + return baseBuilder; + } + + var coffeeProcessingTags = await GetSelectedTags(filter, COFFEE_PROCESSING); + var coffeeTastesTags = await GetSelectedTags(filter, COFFEE_TASTES); + var grinderManufacturerTags = await GetSelectedTags(filter, GRINDER_MANUFACTURER); + var grinderTypeTags = await GetSelectedTags(filter, GRINDER_TYPE); + + return baseBuilder + .Parameters(query => query.Where(where => where + .Where(coffeeWhere => coffeeWhere + .WhereContainsTags(nameof(Coffee.CoffeeProcessing), coffeeProcessingTags) + .WhereContainsTags(nameof(Coffee.CoffeeTastes), coffeeTastesTags)) + .Where(grinderWhere => grinderWhere + .WhereContainsTags(nameof(Grinder.GrinderManufacturer), grinderManufacturerTags) + .WhereContainsTags(nameof(Grinder.GrinderType), grinderTypeTags)) + )); + } + + + private static async Task GetSelectedTags(IDictionary filter, string taxonomyName) + { + if (filter.TryGetValue(taxonomyName, out var taxonomy)) + { + return await taxonomy.GetSelectedTags(); + } + + return null; + } + + + private async Task> GetDependencyCacheKeys(string languageName, ICollection productGuids = null) + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase) + { + CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID), + CacheHelper.GetCacheItemName(null, "contentitem", "bycontenttype", Coffee.CONTENT_TYPE_NAME, languageName), + CacheHelper.GetCacheItemName(null, "contentitem", "bycontenttype", Grinder.CONTENT_TYPE_NAME, languageName), + await GetTaxonomyTagsCacheDependencyKey(COFFEE_PROCESSING), + await GetTaxonomyTagsCacheDependencyKey(COFFEE_TASTES), + await GetTaxonomyTagsCacheDependencyKey(GRINDER_MANUFACTURER), + await GetTaxonomyTagsCacheDependencyKey(GRINDER_TYPE) + }; + GetProductPageDependencies(productGuids, dependencyCacheKeys); + + return dependencyCacheKeys; + } + + + private static void GetProductPageDependencies(ICollection productGuids, HashSet dependencyCacheKeys) + { + if (productGuids == null || !productGuids.Any()) + { + return; + } + + foreach (var guid in productGuids) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "contentitem", "byguid", guid.ToString() }, false)); + } + } + + + private async Task GetTaxonomyTagsCacheDependencyKey(string taxonomyName) + { + var taxonomyID = (await taxonomyInfoProvider.GetAsync(taxonomyName)).TaxonomyID; + return CacheHelper.GetCacheItemName(null, TaxonomyInfo.OBJECT_TYPE, "byid", taxonomyID, "children"); + } + } +} diff --git a/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs b/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs index 0b60d2c..c1aaa25 100644 --- a/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Reference : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Reference : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs b/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs index b5a060d..af4dc68 100644 --- a/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs @@ -15,10 +15,10 @@ public static ReferenceViewModel GetViewModel(Reference reference) } return new ReferenceViewModel( - reference.ReferenceName, - reference.ReferenceDescription, - reference.ReferenceText, - reference.ReferenceImage.FirstOrDefault()?.ImageFile.Url, + reference.ReferenceName, + reference.ReferenceDescription, + reference.ReferenceText, + reference.ReferenceImage.FirstOrDefault()?.ImageFile.Url, reference.ReferenceImage.FirstOrDefault()?.ImageShortDescription ); } diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs index 64dab81..1bef5b5 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class SocialLink : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class SocialLink : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs index dc8d632..08d8b07 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs @@ -6,7 +6,6 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models @@ -19,8 +18,8 @@ public class SocialLinkRepository : ContentRepositoryBase private readonly ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever; - public SocialLinkRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + public SocialLinkRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) { this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; } @@ -66,4 +65,4 @@ private static IEnumerable GetCacheByIdKeys(IEnumerable itemIds) } } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs index bd6e518..757033d 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs @@ -14,4 +14,4 @@ public static SocialLinkViewModel GetViewModel(SocialLink socialLink) return new SocialLinkViewModel(socialLink.SocialLinkTitle, socialLinkUrl, socialLink.SocialLinkIcon.FirstOrDefault()?.ImageFile?.Url); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs b/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs new file mode 100644 index 0000000..a7dcaaa --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record TagViewModel(string Name, int Level, Guid Value, bool IsChecked = false) + { + private const int ROOT_TAG_ID = 0; + + public static TagViewModel GetViewModel(Tag tag, int level = 0) + { + return new TagViewModel(tag.Title, level, tag.Identifier); + } + + + public static List GetViewModels(IEnumerable tags) + { + var result = new List(); + var tagsByParentId = tags.GroupBy(tag => tag.ParentID).ToDictionary(group => group.Key, group => group.ToList()); + + if (tagsByParentId.TryGetValue(ROOT_TAG_ID, out var firstLevelTags)) + { + GetTagsWithTagViewModels(firstLevelTags, ROOT_TAG_ID); + } + + return result; + + + void GetTagsWithTagViewModels(IEnumerable currentLevelTags, int level) + { + foreach (var tag in currentLevelTags.OrderBy(tag => tag.Order)) + { + var children = tagsByParentId.TryGetValue(tag.ID, out var childrenTags) ? childrenTags : Enumerable.Empty(); + result.Add(GetViewModel(tag, level)); + GetTagsWithTagViewModels(children, level + 1); + } + } + } + } +} diff --git a/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs b/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs new file mode 100644 index 0000000..d4128ef --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +namespace DancingGoat.Models +{ + public record TaxonomyViewModel(string Name, string CodeName, List Tags) + { + /// + /// Maps to a . + /// + public static TaxonomyViewModel GetViewModel(TaxonomyData taxonomy) + { + return new TaxonomyViewModel(taxonomy.Taxonomy.Title, taxonomy.Taxonomy.Name, TagViewModel.GetViewModels(taxonomy.Tags)); + } + + + /// + /// Gets selected tags. + /// + public async Task GetSelectedTags() + { + if (Tags == null) + { + return null; + } + + return await TagCollection.Create(Tags.Where(tag => tag.IsChecked).Select(tag => tag.Value)); + } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Schema/IProductFields.generated.cs b/examples/DancingGoat/Models/Schema/IProductFields.generated.cs new file mode 100644 index 0000000..d5dda02 --- /dev/null +++ b/examples/DancingGoat/Models/Schema/IProductFields.generated.cs @@ -0,0 +1,51 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Defines a contract for content types with the reusable schema assigned. + /// + public interface IProductFields + { + /// + /// Code name of the reusable field schema. + /// + public const string REUSABLE_FIELD_SCHEMA_NAME = "ProductFields"; + + + /// + /// ProductFieldsName. + /// + public string ProductFieldsName { get; set; } + + + /// + /// ProductFieldsDescription. + /// + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs b/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs new file mode 100644 index 0000000..3146ad8 --- /dev/null +++ b/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs @@ -0,0 +1,45 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Defines a contract for content types with the reusable schema assigned. + /// + public interface ISEOFields + { + /// + /// Code name of the reusable field schema. + /// + public const string REUSABLE_FIELD_SCHEMA_NAME = "SEOFields"; + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs index 3016d6b..63a2117 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs @@ -8,7 +8,12 @@ namespace DancingGoat.Models { public record ArticleDetailViewModel(string Title, string TeaserUrl, string Summary, string Text, DateTime PublicationDate, Guid Guid, bool IsSecured, string Url, IEnumerable RelatedArticles) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -37,8 +42,10 @@ public static async Task GetViewModel(ArticlePage articl articlePage.SystemFields.ContentItemGUID, articlePage.SystemFields.ContentItemIsSecured, url.RelativePath, - relatedArticlesViewModels - ); + relatedArticlesViewModels) + { + WebPage = articlePage + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs index f872fbb..e3b46a9 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ArticlePage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ArticlePage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class ArticlePage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -66,5 +69,23 @@ public partial class ArticlePage : IWebPageFieldsSource /// ArticleRelatedArticles. /// public IEnumerable ArticleRelatedArticles { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs index 0999459..c9b6325 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs @@ -24,12 +24,11 @@ public class ArticlePageRepository : ContentRepositoryBase /// Initializes new instance of . /// public ArticlePageRepository( - IWebsiteChannelContext websiteChannelContext, - IContentQueryExecutor executor, - IWebPageQueryResultMapper mapper, + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + : base(websiteChannelContext, executor, cache) { this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; } @@ -60,10 +59,7 @@ public async Task> GetArticles(ICollection guids, { var queryBuilder = GetQueryBuilder(guids, languageName); - var options = new ContentQueryExecutionOptions - { - IncludeSecuredItems = true - }; + var options = new ContentQueryExecutionOptions { IncludeSecuredItems = true }; var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, guids.GetHashCode()); @@ -106,13 +102,14 @@ private ContentItemQueryBuilder GetQueryBuilder(int topN, string treePath, strin private ContentItemQueryBuilder GetQueryBuilder(ICollection guids, string languageName) { - return GetQueryBuilder( - languageName, - config => config - .WithLinkedItems(1) - .OrderBy(OrderByColumn.Desc(nameof(ArticlePage.ArticlePagePublishDate))) - .ForWebsite(WebsiteChannelContext.WebsiteChannelName) - .Where(where => where.WhereIn(nameof(IWebPageContentQueryDataContainer.WebPageItemGUID), guids))); + return new ContentItemQueryBuilder().ForContentTypes(q => + { + q.ForWebsite(guids) + .WithContentTypeFields() + .WithLinkedItems(1); + }).InLanguage(languageName) + .Parameters(q => + q.OrderBy(OrderByColumn.Desc(nameof(ArticlePage.ArticlePagePublishDate)))); } diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleViewModel.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleViewModel.cs index e3feaff..9410c3d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using CMS.Websites; @@ -11,11 +12,11 @@ public record ArticleViewModel(string Title, string TeaserUrl, string Summary, s /// /// Validates and maps to a . /// - public static async Task GetViewModel(ArticlePage articlePage, IWebPageUrlRetriever urlRetriever, string languageName) + public static async Task GetViewModel(ArticlePage articlePage, IWebPageUrlRetriever urlRetriever, string languageName, CancellationToken cancellationToken = default) { var teaser = articlePage.ArticlePageTeaser.FirstOrDefault(); - var url = await urlRetriever.Retrieve(articlePage, languageName); + var url = await urlRetriever.Retrieve(articlePage, languageName, cancellationToken); return new ArticleViewModel( articlePage.ArticleTitle, diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs index aaf4ca9..c51466d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ArticlesSection : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ArticlesSection : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class ArticlesSection : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs index a4abc11..390f96d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs @@ -16,8 +16,8 @@ public class ArticlesSectionRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public ArticlesSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ArticlesSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs index bcfba66..72ca09d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs @@ -1,10 +1,25 @@ -namespace DancingGoat.Models +using System.Collections.Generic; + +using CMS.Websites; + +namespace DancingGoat.Models { public record ArticlesSectionViewModel(IEnumerable Articles, string ArticlesPath) + : IWebPageBasedViewModel { - public static ArticlesSectionViewModel GetViewModel(IEnumerable Articles, string ArticlesPath) + /// + public IWebPageFieldsSource WebPage { get; init; } + + + /// + /// Maps to a . + /// + public static ArticlesSectionViewModel GetViewModel(ArticlesSection articlesSection, IEnumerable Articles, string ArticlesPath) { - return new ArticlesSectionViewModel(Articles, ArticlesPath); + return new ArticlesSectionViewModel(Articles, ArticlesPath) + { + WebPage = articlesSection + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs new file mode 100644 index 0000000..ae380f3 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record CoffeeDetailViewModel(string Name, string Description, string ImageUrl, IEnumerable Tastes, IEnumerable Processing) + { + /// + /// Maps to a . + /// + public async static Task GetViewModel(CoffeePage coffeePage, string languageName, ITaxonomyRetriever taxonomyRetriever) + { + var coffee = coffeePage.RelatedItem.FirstOrDefault(); + var image = coffee.ProductFieldsImage.FirstOrDefault(); + + return new CoffeeDetailViewModel( + coffee.ProductFieldsName, + coffee.ProductFieldsDescription, + image?.ImageFile.Url, + await taxonomyRetriever.RetrieveTags(coffee.CoffeeTastes.Select(taste => taste.Identifier), languageName), + await taxonomyRetriever.RetrieveTags(coffee.CoffeeProcessing.Select(processing => processing.Identifier), languageName) + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs new file mode 100644 index 0000000..57542c5 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Custom code for page of type . + /// + public partial class CoffeePage : IProductPage + { + /// + IEnumerable IProductPage.RelatedItem { get => RelatedItem; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs new file mode 100644 index 0000000..5045100 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs @@ -0,0 +1,43 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class CoffeePage : IWebPageFieldsSource + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.CoffeePage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// RelatedItem. + /// + public IEnumerable RelatedItem { get; set; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs index 4b7fe29..5c0fcd1 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ConfirmationPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ConfirmationPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class ConfirmationPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -54,5 +57,23 @@ public partial class ConfirmationPage : IWebPageFieldsSource /// ConfirmationPageArticlesSection. /// public IEnumerable ConfirmationPageArticlesSection { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs index d81fb45..6a9179c 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs @@ -15,8 +15,8 @@ namespace DancingGoat.Models /// public class ConfirmationPageRepository : ContentRepositoryBase { - public ConfirmationPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ConfirmationPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs index 766dec2..83430e5 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs @@ -5,7 +5,12 @@ namespace DancingGoat.Models { public record ConfirmationPageViewModel(string Title, string Header, string Content, WebPageRelatedItem ArticlesSection) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -20,8 +25,10 @@ public static ConfirmationPageViewModel GetViewModel(ConfirmationPage confirmati confirmationPage.ConfirmationPageTitle, confirmationPage.ConfirmationPageHeader, confirmationPage.ConfirmationPageContent, - confirmationPage.ConfirmationPageArticlesSection.FirstOrDefault() - ); + confirmationPage.ConfirmationPageArticlesSection.FirstOrDefault()) + { + WebPage = confirmationPage + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs index 131d1ec..ccb1a70 100644 --- a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; +using CMS.Websites; + namespace DancingGoat.Models { - public class ContactsIndexViewModel + public class ContactsIndexViewModel : IWebPageBasedViewModel { /// /// The company contact data. @@ -14,5 +16,15 @@ public class ContactsIndexViewModel /// The company cafes data. /// public List CompanyCafes { get; set; } + + + /// + /// The partner cafes data. + /// + public List PartnerCafes { get; set; } + + + /// + public IWebPageFieldsSource WebPage { get; init; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs index bb2b633..965fbb5 100644 --- a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ContactsPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ContactsPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class ContactsPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs new file mode 100644 index 0000000..4133065 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class ContactsPageRepository : ContentRepositoryBase + { + /// + /// Initializes new instance of . + /// + public ContactsPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + + /// + /// Returns web page by tree path and language name. + /// + public async Task GetContactsPage(string treePath, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(w => w.WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemTreePath), treePath), languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ContactsPage), nameof(IWebPageContentQueryDataContainer.WebPageItemTreePath), treePath, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + /// + /// Returns web page by ID and language name. + /// + public async Task GetContactsPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(w => w.WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId), languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ContactsPage), nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(Action where, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(ContactsPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName) + .Where(where) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable contactsPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var contactsPage = contactsPages.FirstOrDefault(); + if (contactsPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", contactsPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs new file mode 100644 index 0000000..5079460 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record GrinderDetailViewModel(string Name, string Description, string ImageUrl, IEnumerable Manufacturers, IEnumerable Type) + { + /// + /// Maps to a . + /// + public async static Task GetViewModel(GrinderPage grinderPage, string languageName, ITaxonomyRetriever taxonomyRetriever) + { + var grinder = grinderPage.RelatedItem.FirstOrDefault(); + var image = grinder.ProductFieldsImage.FirstOrDefault(); + + return new GrinderDetailViewModel( + grinder.ProductFieldsName, + grinder.ProductFieldsDescription, + image?.ImageFile.Url, + await taxonomyRetriever.RetrieveTags(grinder.GrinderManufacturer.Select(manufacturer => manufacturer.Identifier), languageName), + await taxonomyRetriever.RetrieveTags(grinder.GrinderType.Select(type => type.Identifier), languageName) + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs new file mode 100644 index 0000000..ded6ed2 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Custom code for page of type . + /// + public partial class GrinderPage : IProductPage + { + /// + IEnumerable IProductPage.RelatedItem { get => RelatedItem; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs new file mode 100644 index 0000000..d79dda1 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs @@ -0,0 +1,43 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class GrinderPage : IWebPageFieldsSource + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.GrinderPage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// RelatedItem. + /// + public IEnumerable RelatedItem { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs index a13cc52..4585e10 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class HomePage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class HomePage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class HomePage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -66,5 +69,23 @@ public partial class HomePage : IWebPageFieldsSource /// HomePageArticlesSection. /// public IEnumerable HomePageArticlesSection { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs index 9f8c8a5..c9614e3 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs @@ -22,8 +22,8 @@ public class HomePageRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public HomePageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + public HomePageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) { this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; } diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs index ceb728e..5fde574 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs @@ -7,7 +7,12 @@ namespace DancingGoat.Models { public record HomePageViewModel(BannerViewModel Banner, EventViewModel Event, string OurStoryText, ReferenceViewModel Reference, IEnumerable Cafes, WebPageRelatedItem ArticlesSection) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -24,7 +29,10 @@ public static HomePageViewModel GetViewModel(HomePage home) home.HomePageOurStory, ReferenceViewModel.GetViewModel(home.HomePageReference.FirstOrDefault()), home.HomePageCafes.Select(CafeViewModel.GetViewModel), - home.HomePageArticlesSection.FirstOrDefault()); + home.HomePageArticlesSection.FirstOrDefault()) + { + WebPage = home + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs b/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs new file mode 100644 index 0000000..4fa8179 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs @@ -0,0 +1,15 @@ +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Interface for view model instances based on web page items. + /// + public interface IWebPageBasedViewModel + { + /// + /// Web page which the view model is based on. + /// + IWebPageFieldsSource WebPage { get; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs index 32a55a8..fcfb146 100644 --- a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class LandingPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class LandingPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class LandingPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs new file mode 100644 index 0000000..7b4c717 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of landing pages. + /// + public class LandingPageRepository : ContentRepositoryBase + { + public LandingPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + /// + /// Returns content item. + /// + /// Web page item ID. + /// Language name. + /// Cancellation token. + public async Task GetLandingPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(webPageItemId, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(LandingPage), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int webPageItemId, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(LandingPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, includeUrlPath: false) + .Where(where => where + .WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId)) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable confirmationPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var confirmationPage = confirmationPages.FirstOrDefault(); + + if (confirmationPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", confirmationPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs index 179c2c3..a338f4e 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,6 +19,7 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class NavigationItem : IWebPageFieldsSource { /// @@ -29,6 +31,7 @@ public partial class NavigationItem : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs index c9615c9..2d6a49e 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs @@ -19,8 +19,8 @@ public class NavigationItemRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public NavigationItemRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public NavigationItemRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs index 57973e7..4e8345a 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs @@ -3,4 +3,4 @@ public record NavigationItemViewModel(string Caption, string RelativeUrl) { } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs similarity index 83% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs index 07f68ba..523d9e5 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs @@ -9,7 +9,5 @@ public class PrivacyConsentViewModel public string Text { get; set; } - - public bool Agreed { get; set; } } } diff --git a/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs new file mode 100644 index 0000000..976108f --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs @@ -0,0 +1,55 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class PrivacyPage : IWebPageFieldsSource, ISEOFields + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.PrivacyPage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPageConstants.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageConstants.cs similarity index 100% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyPageConstants.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageConstants.cs diff --git a/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs new file mode 100644 index 0000000..dfcc233 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class PrivacyPageRepository : ContentRepositoryBase + { + /// + /// Initializes new instance of . + /// + public PrivacyPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + + /// + /// Returns web page by ID and language name. + /// + public async Task GetPrivacyPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(webPageItemId, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(PrivacyPage), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int webPageItemId, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(PrivacyPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, includeUrlPath: false) + .Where(where => where + .WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId)) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable privacyPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var privacyPage = privacyPages.FirstOrDefault(); + if (privacyPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", privacyPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs similarity index 75% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs index 5d1d48e..8be3a5b 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; +using CMS.Websites; + namespace DancingGoat.Models { - public class PrivacyViewModel + public class PrivacyViewModel : IWebPageBasedViewModel { public bool DemoDisabled { get; set; } @@ -18,5 +20,8 @@ public class PrivacyViewModel public string PrivacyPageUrl { get; set; } + + + public IWebPageFieldsSource WebPage { get; init; } } } diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs b/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs new file mode 100644 index 0000000..82e308f --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a common product page model. + /// + public interface IProductPage : IWebPageFieldsSource + { + /// + /// Get product related item. + /// + public IEnumerable RelatedItem { get; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs new file mode 100644 index 0000000..35d8c22 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs @@ -0,0 +1,24 @@ +using System.Linq; +using System.Threading.Tasks; + +using CMS.Websites; + +namespace DancingGoat.Models +{ + public record ProductListItemViewModel(string Name, string ImagePath, string Url) + { + public static async Task GetViewModel(IProductPage productPage, IWebPageUrlRetriever urlRetriever, string languageName) + { + var product = productPage.RelatedItem.FirstOrDefault(); + var image = product.ProductFieldsImage.FirstOrDefault(); + + var path = (await urlRetriever.Retrieve(productPage, languageName)).RelativePath; + + return new ProductListItemViewModel( + product.ProductFieldsName, + image?.ImageFile.Url, + path + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs new file mode 100644 index 0000000..3c71a88 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + public record ProductListViewModel(IEnumerable Items, Dictionary Filter) + { + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs new file mode 100644 index 0000000..f2f12e5 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of product pages. + /// + public class ProductPageRepository : ContentRepositoryBase + { + private readonly IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever; + + + /// + /// Initializes new instance of . + /// + public ProductPageRepository( + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, + IProgressiveCache cache, + IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) + { + this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; + } + + + /// + /// Returns list of web pages. + /// + public async Task> GetProducts(string treePath, string languageName, IEnumerable linkedProducts, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + { + if (!linkedProducts.Any()) + { + return Enumerable.Empty(); + } + + var queryBuilder = GetQueryBuilder(treePath, languageName, linkedProducts); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var linkedProductCacheParts = linkedProducts.Select(product => product.ProductFieldsName).Join("|"); + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, treePath, languageName, includeSecuredItems, nameof(IProductPage), linkedProductCacheParts); + + return await GetCachedQueryResult(queryBuilder, options, cacheSettings, GetDependencyCacheKeys, cancellationToken); + } + + + public async Task GetProduct(string contentTypeName, int id, string languageName, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + where ProductPageType : IWebPageFieldsSource, new() + { + var queryBuilder = GetQueryBuilder(id, languageName, contentTypeName); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ProductPageType), id, languageName); + + var result = await GetCachedQueryResult(queryBuilder, options, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(string treePath, string languageName, IEnumerable linkedProducts) + { + return GetQueryBuilder( + languageName, + config => config + .Linking(nameof(IProductPage.RelatedItem), linkedProducts.Select(linkedProduct => ((IContentItemFieldsSource)linkedProduct).SystemFields.ContentItemID)) + .WithLinkedItems(2) + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, PathMatch.Children(treePath))); + } + + + private static ContentItemQueryBuilder GetQueryBuilder(string languageName, Action configure = null) + { + return new ContentItemQueryBuilder() + .ForContentType(CoffeePage.CONTENT_TYPE_NAME, configure) + .ForContentType(GrinderPage.CONTENT_TYPE_NAME, configure) + .InLanguage(languageName); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int id, string languageName, string contentTypeName) + { + return GetQueryBuilder( + languageName, + contentTypeName, + config => config + .WithLinkedItems(2) + .ForWebsite(WebsiteChannelContext.WebsiteChannelName) + .Where(where => where.WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), id))); + } + + + private static ContentItemQueryBuilder GetQueryBuilder(string languageName, string contentTypeName, Action configureQuery = null) + { + return new ContentItemQueryBuilder() + .ForContentType(contentTypeName, configureQuery) + .InLanguage(languageName); + } + + + private async Task> GetDependencyCacheKeys(IEnumerable products, CancellationToken cancellationToken) + where ProductPageType : IWebPageFieldsSource + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase); + + foreach (var product in products) + { + dependencyCacheKeys.UnionWith(GetDependencyCacheKeys(product)); + } + + dependencyCacheKeys.UnionWith(await webPageLinkedItemsDependencyRetriever.Get(products.Select(productPage => productPage.SystemFields.WebPageItemID), 1, cancellationToken)); + dependencyCacheKeys.Add(CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID)); + + return dependencyCacheKeys; + } + + + private IEnumerable GetDependencyCacheKeys(IWebPageFieldsSource product) + { + if (product == null) + { + return Enumerable.Empty(); + } + + return new List() + { + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", product.SystemFields.WebPageItemID.ToString() }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "bychannel", WebsiteChannelContext.WebsiteChannelName, "bypath", product.SystemFields.WebPageItemTreePath }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "bychannel", WebsiteChannelContext.WebsiteChannelName, "childrenofpath", DataHelper.GetParentPath(product.SystemFields.WebPageItemTreePath) }, false), + CacheHelper.GetCacheItemName(null, ContentLanguageInfo.OBJECT_TYPE, "all") + }; + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs new file mode 100644 index 0000000..f58f027 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class ProductSectionRepository : ContentRepositoryBase + { + private readonly ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever; + + + public ProductSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) + { + this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; + } + + + public async Task GetProductsSection(int id, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(id, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ProductsSection), id, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private Task> GetDependencyCacheKeys(IEnumerable productsSection, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase); + + foreach (var productSection in productsSection) + { + dependencyCacheKeys.UnionWith(GetDependencyCacheKeys(productSection)); + } + + dependencyCacheKeys.Add(CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID)); + + return Task.FromResult>(dependencyCacheKeys); + } + + + private static IEnumerable GetDependencyCacheKeys(ProductsSection productsSection) + { + if (productsSection == null) + { + return Enumerable.Empty(); + } + + var cacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase) + { + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", productsSection.SystemFields.WebPageItemID.ToString() }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byguid", productsSection.SystemFields.WebPageItemGUID.ToString() }, false), + }; + + return cacheKeys; + } + + + private ContentItemQueryBuilder GetQueryBuilder(int id, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(ProductsSection.CONTENT_TYPE_NAME, + config => + config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName) + .Where(where => where.WhereEquals(nameof(WebPageFields.WebPageItemID), id)) + .TopN(1)) + .InLanguage(languageName); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs similarity index 74% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs rename to examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs index 2e5891f..2948028 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs @@ -11,24 +11,27 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models { /// - /// Represents a page of type . + /// Represents a page of type . /// - public partial class PrivacyPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ProductsSection : IWebPageFieldsSource { /// /// Code name of the content type. /// - public const string CONTENT_TYPE_NAME = "DancingGoat.PrivacyPage"; + public const string CONTENT_TYPE_NAME = "DancingGoat.ProductsSection"; /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs b/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs new file mode 100644 index 0000000..29ae013 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs @@ -0,0 +1,120 @@ +using Kentico.Content.Web.Mvc.PageBuilder; + +namespace DancingGoat.Models +{ + /// + /// Helper class for retrieving values from web page based view models which include reusable schema fields "SEO Fields". + /// + public static class SEOSchemaModelDataRetriever + { + /// + /// Returns value of title field from the given model. + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns null. + ///
+ /// View model. + public static string GetTitleValue(object model) + { + string title = null; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + title = webPageWithSEO.SEOFieldsTitle; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + title = basePageWithSEO.SEOFieldsTitle; + } + } + + return title; + } + + + /// + /// Returns value of description field from the given model. + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns null. + ///
+ /// Model + public static string GetDescriptionValue(object model) + { + string description = null; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + description = webPageWithSEO.SEOFieldsDescription; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + description = basePageWithSEO.SEOFieldsDescription; + } + } + + return description; + } + + + /// + /// Returns value of field from the given model."/> + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns false. + ///
+ /// Model + public static bool GetSearchIndexing(object model) + { + bool allowSearchIndexing = false; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + allowSearchIndexing = webPageWithSEO.SEOFieldsAllowSearchIndexing; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + allowSearchIndexing = basePageWithSEO.SEOFieldsAllowSearchIndexing; + } + } + + return allowSearchIndexing; + } + } +} diff --git a/examples/DancingGoat/PageTemplates/Article/_Article.cshtml b/examples/DancingGoat/PageTemplates/Article/_Article.cshtml index aa237cb..f95d123 100644 --- a/examples/DancingGoat/PageTemplates/Article/_Article.cshtml +++ b/examples/DancingGoat/PageTemplates/Article/_Article.cshtml @@ -1,6 +1,4 @@ -@using Kentico.Content.Web.Mvc.PageBuilder - -@using DancingGoat.PageTemplates +@using DancingGoat.PageTemplates @using DancingGoat.Models @model TemplateViewModel @@ -9,8 +7,6 @@ Layout = "~/Views/Shared/_DancingGoatLayout.cshtml"; var viewModel = Model.GetTemplateModel(); - ViewBag.Title = viewModel.Title; - var hasRelatedArticles = viewModel.RelatedArticles.Any(); } diff --git a/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml b/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml index 90d24c1..61441d9 100644 --- a/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml +++ b/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml @@ -1,6 +1,4 @@ -@using Kentico.Content.Web.Mvc.PageBuilder - -@using DancingGoat.PageTemplates +@using DancingGoat.PageTemplates @using DancingGoat.Widgets @using DancingGoat.Models @@ -13,8 +11,6 @@ // The page's content takes 12 points of width which are divided between the sidebar and the article var articleWidth = 9; var sidebardBootstrapWidth = 12 - articleWidth; - - ViewBag.Title = templateModel.Title; }
diff --git a/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml b/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml index 2e4ea7a..04e2820 100644 --- a/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml +++ b/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml @@ -1,11 +1,10 @@ @using DancingGoat.PageTemplates @using DancingGoat.Helpers -@model ComponentViewModel +@model TemplateViewModel @{ Layout = "~/Views/Shared/_LandingPageLayout.cshtml"; - ViewBag.Title = HtmlLocalizer["Landing page"].Value; }
diff --git a/examples/DancingGoat/PageTemplates/_ViewImports.cshtml b/examples/DancingGoat/PageTemplates/_ViewImports.cshtml index d0f38c6..477580f 100644 --- a/examples/DancingGoat/PageTemplates/_ViewImports.cshtml +++ b/examples/DancingGoat/PageTemplates/_ViewImports.cshtml @@ -4,7 +4,7 @@ @using Kentico.Web.Mvc @using Kentico.Content.Web.Mvc -@using Kentico.PageBuilder.Web.Mvc +@using Kentico.Content.Web.Mvc.PageBuilder @using Microsoft.AspNetCore.Mvc.Localization diff --git a/examples/DancingGoat/Program.cs b/examples/DancingGoat/Program.cs index 2ab876a..f2c6d93 100644 --- a/examples/DancingGoat/Program.cs +++ b/examples/DancingGoat/Program.cs @@ -1,3 +1,6 @@ +using System; +using System.Threading.Tasks; + using DancingGoat; using DancingGoat.Models; @@ -8,10 +11,16 @@ using Kentico.PageBuilder.Web.Mvc; using Kentico.Web.Mvc; + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; + using DancingGoat.TagManager; var builder = WebApplication.CreateBuilder(args); @@ -137,5 +146,11 @@ static void ConfigureMembershipServices(IServiceCollection services) }; }); + services.Configure(options => + { + // The expiration time span of 8 hours is set for demo purposes only. In production environment, set expiration according to best practices. + options.AuthenticationOptions.ExpireTimeSpan = TimeSpan.FromHours(8); + }); + services.AddAuthorization(); } diff --git a/examples/DancingGoat/README.md b/examples/DancingGoat/README.md index 13de7bd..4428c25 100644 --- a/examples/DancingGoat/README.md +++ b/examples/DancingGoat/README.md @@ -1,7 +1,6 @@ # Xperience by Kentico: Dancing Goat Sample Project -This project implements a company website of a fictional coffee shop franchise with the aim of demonstrating -the content management and digital marketing features of the Xperience solution. +This project implements a company website of a fictional coffee shop franchise to demonstrate the Xperience solution's content management and digital marketing features. ## Installation and setup @@ -10,13 +9,25 @@ to troubleshoot any installation or configuration issues. ## Project notes -### Content type code files +### Content type and reusable field schema code files -[Content type](https://docs.xperience.io/x/gYHWCQ) code files under `./Models/Reusable` and `./Models/WebPage` are -generated using [code generators](https://docs.xperience.io/x/5IbWCQ) provided by Xperience. +[Content type](https://docs.xperience.io/x/gYHWCQ) and [reusable field schema](https://docs.xperience.io/x/D4_OD) code files under -If you add new content types or make changes to existing ones (e.g., add or remove fields), you can -run the following commands from the root of the Dancing Goat project: +- `./Models/Reusable` +- `./Models/WebPage` +- `./Models/Schema` + +are generated using Xperience's [code generators](https://docs.xperience.io/x/5IbWCQ). + +If you change the site's content model (add or remove fields, define new content types or schemas, etc.), you can run the following commands from the root of the Dancing Goat project to regenerate the files. + +For _reusable field schemas_: + +```powershell +dotnet run --no-build -- --kxp-codegen --location "./Models/Schema/" --type ReusableFieldSchemas --namespace "DancingGoat.Models" +``` + +This command regenerates the interfaces for all reusable field schemas in the project. Note that the specified `--namespace` must match the namespace where content type code files that reference the schemas are generated. You will get uncompilable code otherwise. For _reusable_ content types: @@ -26,7 +37,7 @@ dotnet run --no-build -- --kxp-codegen --location "./Models/Reusable/{name}/" -- This command generates code files for content types with the `DancingGoat` namespace under the `./Models/Reusable` directory. -You can use a similar approach for _page_ content types: +For _page_ content types: ```powershell dotnet run --no-build -- --kxp-codegen --location "./Models/WebPage/{name}/" --type PageContentTypes --include "DancingGoat.*" --namespace "DancingGoat.Models" @@ -34,4 +45,4 @@ dotnet run --no-build -- --kxp-codegen --location "./Models/WebPage/{name}/" --t This command generates code files for content types with the `DancingGoat` namespace under the `./Models/WebPage` directory. -You can of course adapt these example for use in projects with a different folder structure by modifying the `location` parameter accordingly. +You can adapt these examples for use in projects with a different folder structure by modifying the `location` parameter accordingly. diff --git a/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs b/examples/DancingGoat/Samples/DataProtection/DancingGoatSamplesModule.cs similarity index 91% rename from examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs rename to examples/DancingGoat/Samples/DataProtection/DancingGoatSamplesModule.cs index 7a3a7d4..afc4c92 100644 --- a/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs +++ b/examples/DancingGoat/Samples/DataProtection/DancingGoatSamplesModule.cs @@ -35,10 +35,10 @@ internal class DancingGoatSamplesModule : Module private IInfoProvider consentAgreementInfoProvider; private IInfoProvider bizFormInfoProvider; private IInfoProvider accountContactInfoProvider; - private ISettingsKeyInfoProvider settingsKeyInfoProvider; + private IInfoProvider settingsKeyInfoProvider; private IInfoProvider activityInfoProvider; - private ICountryInfoProvider countryInfoProvider; - private IStateInfoProvider stateInfoProvider; + private IInfoProvider countryInfoProvider; + private IInfoProvider stateInfoProvider; private IInfoProvider accountInfoProvider; @@ -62,10 +62,10 @@ protected override void OnInit() consentAgreementInfoProvider = Service.Resolve>(); bizFormInfoProvider = Service.Resolve>(); accountContactInfoProvider = Service.Resolve>(); - settingsKeyInfoProvider = Service.Resolve(); + settingsKeyInfoProvider = Service.Resolve>(); activityInfoProvider = Service.Resolve>(); - countryInfoProvider = Service.Resolve(); - stateInfoProvider = Service.Resolve(); + countryInfoProvider = Service.Resolve>(); + stateInfoProvider = Service.Resolve>(); accountInfoProvider = Service.Resolve>(); InitializeSamples(); @@ -107,7 +107,7 @@ internal void RegisterSamples() accountContactInfoProvider, accountInfoProvider, bizFormInfoProvider)); PersonalDataCollectorRegister.Instance.Add(new SampleMemberDataCollector()); - PersonalDataEraserRegister.Instance.Add(new SampleContactPersonalDataEraser(consentAgreementInfoProvider, bizFormInfoProvider, accountContactInfoProvider, contactInfoProvider)); + PersonalDataEraserRegister.Instance.Add(new SampleContactPersonalDataEraser(consentAgreementInfoProvider, bizFormInfoProvider, accountContactInfoProvider, contactInfoProvider, activityInfoProvider)); PersonalDataEraserRegister.Instance.Add(new SampleMemberPersonalDataEraser(memberInfoProvider)); RegisterConsentRevokeHandler(); @@ -121,7 +121,7 @@ internal void DeleteContactActivities(ContactInfo contact) { "deleteActivities", true } }; - new SampleContactPersonalDataEraser(consentAgreementInfoProvider, bizFormInfoProvider, accountContactInfoProvider, contactInfoProvider) + new SampleContactPersonalDataEraser(consentAgreementInfoProvider, bizFormInfoProvider, accountContactInfoProvider, contactInfoProvider, activityInfoProvider) .Erase(new[] { contact }, configuration); } diff --git a/examples/DancingGoat/DataProtectionSamples/IdentityCollectors/SampleContactInfoIdentityCollector.cs b/examples/DancingGoat/Samples/DataProtection/IdentityCollectors/SampleContactInfoIdentityCollector.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/IdentityCollectors/SampleContactInfoIdentityCollector.cs rename to examples/DancingGoat/Samples/DataProtection/IdentityCollectors/SampleContactInfoIdentityCollector.cs diff --git a/examples/DancingGoat/DataProtectionSamples/IdentityCollectors/SampleMemberInfoIdentityCollector.cs b/examples/DancingGoat/Samples/DataProtection/IdentityCollectors/SampleMemberInfoIdentityCollector.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/IdentityCollectors/SampleMemberInfoIdentityCollector.cs rename to examples/DancingGoat/Samples/DataProtection/IdentityCollectors/SampleMemberInfoIdentityCollector.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/CollectedColumn.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/CollectedColumn.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/CollectedColumn.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/CollectedColumn.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollector.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollector.cs similarity index 93% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollector.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollector.cs index 57bb7bc..47fcdb7 100644 --- a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollector.cs +++ b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollector.cs @@ -15,8 +15,8 @@ namespace Samples.DancingGoat internal class SampleContactDataCollector : IPersonalDataCollector { private readonly IInfoProvider activityInfoProvider; - private readonly ICountryInfoProvider countryInfoProvider; - private readonly IStateInfoProvider stateInfoProvider; + private readonly IInfoProvider countryInfoProvider; + private readonly IInfoProvider stateInfoProvider; private readonly IInfoProvider consentAgreementInfoProvider; private readonly IInfoProvider accountContactInfoProvider; private readonly IInfoProvider accountInfoProvider; @@ -35,8 +35,8 @@ internal class SampleContactDataCollector : IPersonalDataCollector /// BizForm info provider. public SampleContactDataCollector( IInfoProvider activityInfoProvider, - ICountryInfoProvider countryInfoProvider, - IStateInfoProvider stateInfoProvider, + IInfoProvider countryInfoProvider, + IInfoProvider stateInfoProvider, IInfoProvider consentAgreementInfoProvider, IInfoProvider accountContactInfoProvider, IInfoProvider accountInfoProvider, diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollectorCore.cs similarity index 99% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollectorCore.cs index 200639a..6e78567 100644 --- a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs +++ b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleContactDataCollectorCore.cs @@ -21,8 +21,8 @@ internal class SampleContactDataCollectorCore { private readonly IPersonalDataWriter writer; private readonly IInfoProvider activityInfoProvider; - private readonly ICountryInfoProvider countryInfoProvider; - private readonly IStateInfoProvider stateInfoProvider; + private readonly IInfoProvider countryInfoProvider; + private readonly IInfoProvider stateInfoProvider; private readonly IInfoProvider consentAgreementInfoProvider; private readonly IInfoProvider accountContactInfoProvider; private readonly IInfoProvider accountInfoProvider; @@ -326,8 +326,8 @@ private object TransformConsentAction(string columnName, object columnValue) public SampleContactDataCollectorCore( IPersonalDataWriter writer, IInfoProvider activityInfoProvider, - ICountryInfoProvider countryInfoProvider, - IStateInfoProvider stateInfoProvider, + IInfoProvider countryInfoProvider, + IInfoProvider stateInfoProvider, IInfoProvider consentAgreementInfoProvider, IInfoProvider accountContactInfoProvider, IInfoProvider accountInfoProvider, diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleMemberDataCollector.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleMemberDataCollector.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleMemberDataCollector.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleMemberDataCollector.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleMemberDataCollectorCore.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleMemberDataCollectorCore.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleMemberDataCollectorCore.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/SampleMemberDataCollectorCore.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/HumanReadablePersonalDataWriter.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/HumanReadablePersonalDataWriter.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/HumanReadablePersonalDataWriter.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/HumanReadablePersonalDataWriter.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/IPersonalDataWriter.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/IPersonalDataWriter.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/IPersonalDataWriter.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/IPersonalDataWriter.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/XmlPersonalDataWriter.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/XmlPersonalDataWriter.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/Writers/XmlPersonalDataWriter.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataCollectors/Writers/XmlPersonalDataWriter.cs diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataErasers/SampleContactPersonalDataEraser.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataErasers/SampleContactPersonalDataEraser.cs similarity index 94% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataErasers/SampleContactPersonalDataEraser.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataErasers/SampleContactPersonalDataEraser.cs index ab67294..c5a73f0 100644 --- a/examples/DancingGoat/DataProtectionSamples/PersonalDataErasers/SampleContactPersonalDataEraser.cs +++ b/examples/DancingGoat/Samples/DataProtection/PersonalDataErasers/SampleContactPersonalDataEraser.cs @@ -39,6 +39,7 @@ internal class SampleContactPersonalDataEraser : IPersonalDataEraser private readonly IInfoProvider bizFormInfoProvider; private readonly IInfoProvider accountContactInfoProvider; private readonly IInfoProvider contactInfoProvider; + private readonly IInfoProvider activityInfoProvider; /// @@ -48,16 +49,19 @@ internal class SampleContactPersonalDataEraser : IPersonalDataEraser /// BizForm info provider. /// Account contact info provider. /// Contact info provider. + /// Activity info provider. public SampleContactPersonalDataEraser( IInfoProvider consentAgreementInfoProvider, IInfoProvider bizFormInfoProvider, IInfoProvider accountContactInfoProvider, - IInfoProvider contactInfoProvider) + IInfoProvider contactInfoProvider, + IInfoProvider activityInfoProvider) { this.consentAgreementInfoProvider = consentAgreementInfoProvider; this.bizFormInfoProvider = bizFormInfoProvider; this.accountContactInfoProvider = accountContactInfoProvider; this.contactInfoProvider = contactInfoProvider; + this.activityInfoProvider = activityInfoProvider; } @@ -119,7 +123,7 @@ private void DeleteSubmittedFormsActivities(ICollection contactIds, IDictio if (configuration.TryGetValue("DeleteSubmittedFormsActivities", out object deleteSubmittedFormsActivities) && ValidationHelper.GetBoolean(deleteSubmittedFormsActivities, false)) { - ActivityInfoProvider.ProviderObject.BulkDelete(new WhereCondition().WhereEquals("ActivityType", PredefinedActivityType.BIZFORM_SUBMIT) + activityInfoProvider.BulkDelete(new WhereCondition().WhereEquals("ActivityType", PredefinedActivityType.BIZFORM_SUBMIT) .WhereIn("ActivityContactID", contactIds)); } } @@ -173,7 +177,7 @@ private void DeleteActivities(List contactIds, IDictionary if (configuration.TryGetValue("deleteActivities", out object deleteActivities) && ValidationHelper.GetBoolean(deleteActivities, false)) { - ActivityInfoProvider.ProviderObject.BulkDelete(new WhereCondition().WhereIn("ActivityContactID", contactIds)); + activityInfoProvider.BulkDelete(new WhereCondition().WhereIn("ActivityContactID", contactIds)); } } diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataErasers/SampleMemberPersonalDataEraser.cs b/examples/DancingGoat/Samples/DataProtection/PersonalDataErasers/SampleMemberPersonalDataEraser.cs similarity index 100% rename from examples/DancingGoat/DataProtectionSamples/PersonalDataErasers/SampleMemberPersonalDataEraser.cs rename to examples/DancingGoat/Samples/DataProtection/PersonalDataErasers/SampleMemberPersonalDataEraser.cs diff --git a/examples/DancingGoat/Samples/EmailActivityTracking/EmailActivityTrackingEvaluator.cs b/examples/DancingGoat/Samples/EmailActivityTracking/EmailActivityTrackingEvaluator.cs new file mode 100644 index 0000000..6473870 --- /dev/null +++ b/examples/DancingGoat/Samples/EmailActivityTracking/EmailActivityTrackingEvaluator.cs @@ -0,0 +1,49 @@ +using System.Threading.Tasks; + +using CMS.ContactManagement; +using CMS.DataEngine; +using CMS.DataProtection; +using CMS.EmailLibrary; + +using DancingGoat.Helpers.Generator; + +using Kentico.OnlineMarketing.Web.Mvc; + +namespace Samples.DancingGoat; + +/// +/// Example implementation of . +/// It uses consent generated by the data protection (GDPR) demo. To make it work, +/// you need to visit Sample data generator application and generate the data. +/// Without the consent, email activity tracking is disabled. +/// +public class EmailActivityTrackingEvaluator : IEmailActivityTrackingEvaluator +{ + private readonly IConsentAgreementService consentAgreementService; + private readonly IInfoProvider consentInfoProvider; + + + /// + /// Initializes an instance of the class. + /// + public EmailActivityTrackingEvaluator(IConsentAgreementService consentAgreementService, IInfoProvider consentInfoProvider) + { + this.consentAgreementService = consentAgreementService; + this.consentInfoProvider = consentInfoProvider; + } + + + /// + /// Determines whether the email activities can be tracked for the contact. + /// + /// Contact info of the recipient. + /// Email configuration info. + /// True if the contact has agreed to tracking by giving consent. + /// The consent is generated by . + public async Task IsTrackingAllowed(ContactInfo contact, EmailConfigurationInfo emailConfiguration) + { + var consent = await consentInfoProvider.GetAsync(TrackingConsentGenerator.CONSENT_NAME); + + return consent is not null && consentAgreementService.IsAgreed(contact, consent); + } +} diff --git a/examples/DancingGoat/Services/IServiceCollectionExtensions.cs b/examples/DancingGoat/Services/IServiceCollectionExtensions.cs index 0d8c542..3abf54e 100644 --- a/examples/DancingGoat/Services/IServiceCollectionExtensions.cs +++ b/examples/DancingGoat/Services/IServiceCollectionExtensions.cs @@ -1,8 +1,12 @@ using DancingGoat.Models; using DancingGoat.ViewComponents; +using Kentico.OnlineMarketing.Web.Mvc; + using Microsoft.Extensions.DependencyInjection; +using Samples.DancingGoat; + namespace DancingGoat { public static class IServiceCollectionExtensions @@ -14,8 +18,9 @@ public static void AddDancingGoatServices(this IServiceCollection services) { AddViewComponentServices(services); AddRepositories(services); - + services.AddSingleton(); + services.AddSingleton(); } @@ -27,10 +32,15 @@ private static void AddRepositories(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); } diff --git a/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml b/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml index 5a8e750..3b97fc0 100644 --- a/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml @@ -1,14 +1,13 @@ @using Microsoft.AspNetCore.Mvc.Localization -@model IEnumerable +@model DancingGoat.Models.ArticlesSectionViewModel @{ - ViewBag.Title = HtmlLocalizer["Articles"].Value; var i = 1; }
- @foreach (var article in @Model) + @foreach (var article in @Model.Articles) { var lastInRow = ""; if (i % 4 == 0) diff --git a/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml b/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml new file mode 100644 index 0000000..bf29fe6 --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml @@ -0,0 +1,41 @@ +@using DancingGoat.Models + +@model CoffeeDetailViewModel; + +@{ + ViewData["PageClass"] = "inverted"; + ViewData["Title"] = Model.Name; +} + +
+
+
+
+

@Model.Name

+
+
+
+ +
+ @foreach (var item in Model.Processing.Union(Model.Tastes)) + { +
+ @item.Title +
+ } +
+ +
+
+ @if (!string.IsNullOrEmpty(Model.ImageUrl)) + { +
+ @Model.Name +
+ } +
+ @Html.Raw(Model.Description) +
+
+
+
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml b/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml index cba0d3b..41cd2c1 100644 --- a/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml @@ -2,10 +2,6 @@ @using System.Linq; -@{ - ViewBag.Title = Model.Title; -} -

@Model.Header

diff --git a/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml b/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml index f39c4cb..a63b088 100644 --- a/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml @@ -1,9 +1,5 @@ @model DancingGoat.Models.ContactsIndexViewModel -@{ - ViewBag.Title = HtmlLocalizer["Contacts"].Value; -} -
@@ -34,14 +30,12 @@ @foreach (var cafe in @Model.CompanyCafes) {
-
+

@cafe.Name

- - @cafe.Street, @cafe.City
- @cafe.Country -
+ @cafe.Street, @cafe.City
+ @cafe.Country

@cafe.Phone

@@ -49,4 +43,15 @@
}
+ +

@HtmlLocalizer["Other places where you can drink our coffee"]

+
+ @foreach (var partnerCafe in Model.PartnerCafes) + { +

@partnerCafe.City, @partnerCafe.Country

+

+ @partnerCafe.Name, @partnerCafe.Street, @partnerCafe.Phone +

+ } +
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml b/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml new file mode 100644 index 0000000..67c293f --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml @@ -0,0 +1,41 @@ +@using DancingGoat.Models + +@model GrinderDetailViewModel; + +@{ + ViewData["PageClass"] = "inverted"; + ViewData["Title"] = Model.Name; +} + +
+
+
+
+

@Model.Name

+
+
+
+ +
+ @foreach (var item in Model.Manufacturers.Union(Model.Type)) + { +
+ @item.Title +
+ } +
+ +
+
+ @if (!string.IsNullOrEmpty(Model.ImageUrl)) + { +
+ @Model.Name +
+ } +
+ @Html.Raw(Model.Description) +
+
+
+
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml b/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml index 437e6a6..e35a96a 100644 --- a/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml @@ -2,10 +2,6 @@ @using System.Linq; -@{ - ViewData["Title"] = @HtmlLocalizer["Home"]; -} - @if (Model.Banner != null) { diff --git a/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml b/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml index 3e7e0a1..60e9381 100644 --- a/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml @@ -2,7 +2,6 @@ @{ ViewData["PageClass"] = "inverted no-bg"; - ViewBag.Title = HtmlLocalizer["Privacy"].Value; }
@@ -31,37 +30,16 @@ if (Model.Consents.Any()) { var routeData = new Dictionary { { "returnUrl", Model.PrivacyPageUrl } }; -
+ @foreach (var consent in Model.Consents) {