From 3adf4f3e0b9144d121b1a2e02f3b53561a94b36a Mon Sep 17 00:00:00 2001 From: Alexey Zarakovskiy Date: Wed, 14 Feb 2018 11:13:09 +0100 Subject: [PATCH 01/78] Set DXA version to 2.1.0-SNAPSHOT --- webapp-java/dxa-module-51degrees/pom.xml | 2 +- webapp-java/dxa-module-audience-manager/pom.xml | 2 +- webapp-java/dxa-module-cid/pom.xml | 2 +- webapp-java/dxa-module-context-expressions/pom.xml | 2 +- webapp-java/dxa-module-core/pom.xml | 2 +- webapp-java/dxa-module-googleanalytics/pom.xml | 2 +- webapp-java/dxa-module-mediamanager/pom.xml | 2 +- webapp-java/dxa-module-search/pom.xml | 2 +- webapp-java/dxa-module-smarttarget/pom.xml | 2 +- webapp-java/dxa-module-test/pom.xml | 2 +- webapp-java/gradle.properties | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/webapp-java/dxa-module-51degrees/pom.xml b/webapp-java/dxa-module-51degrees/pom.xml index 565321b4e..f0d74fe81 100644 --- a/webapp-java/dxa-module-51degrees/pom.xml +++ b/webapp-java/dxa-module-51degrees/pom.xml @@ -7,7 +7,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-audience-manager/pom.xml b/webapp-java/dxa-module-audience-manager/pom.xml index bb730e246..b95fc37b4 100644 --- a/webapp-java/dxa-module-audience-manager/pom.xml +++ b/webapp-java/dxa-module-audience-manager/pom.xml @@ -5,7 +5,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-cid/pom.xml b/webapp-java/dxa-module-cid/pom.xml index 428cbcf45..76fc09ae8 100644 --- a/webapp-java/dxa-module-cid/pom.xml +++ b/webapp-java/dxa-module-cid/pom.xml @@ -6,7 +6,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-context-expressions/pom.xml b/webapp-java/dxa-module-context-expressions/pom.xml index 0682fdacc..86eb5aeac 100644 --- a/webapp-java/dxa-module-context-expressions/pom.xml +++ b/webapp-java/dxa-module-context-expressions/pom.xml @@ -7,7 +7,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-core/pom.xml b/webapp-java/dxa-module-core/pom.xml index 3e95d1fcd..233a46bf6 100644 --- a/webapp-java/dxa-module-core/pom.xml +++ b/webapp-java/dxa-module-core/pom.xml @@ -6,7 +6,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-googleanalytics/pom.xml b/webapp-java/dxa-module-googleanalytics/pom.xml index 1a64c1ed3..af702c917 100644 --- a/webapp-java/dxa-module-googleanalytics/pom.xml +++ b/webapp-java/dxa-module-googleanalytics/pom.xml @@ -5,7 +5,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-mediamanager/pom.xml b/webapp-java/dxa-module-mediamanager/pom.xml index 22bbda770..2a03d141c 100644 --- a/webapp-java/dxa-module-mediamanager/pom.xml +++ b/webapp-java/dxa-module-mediamanager/pom.xml @@ -6,7 +6,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-search/pom.xml b/webapp-java/dxa-module-search/pom.xml index d667ce9be..5e76a46f7 100644 --- a/webapp-java/dxa-module-search/pom.xml +++ b/webapp-java/dxa-module-search/pom.xml @@ -5,7 +5,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-smarttarget/pom.xml b/webapp-java/dxa-module-smarttarget/pom.xml index c5bbad9a0..649c9c6f1 100644 --- a/webapp-java/dxa-module-smarttarget/pom.xml +++ b/webapp-java/dxa-module-smarttarget/pom.xml @@ -6,7 +6,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/dxa-module-test/pom.xml b/webapp-java/dxa-module-test/pom.xml index 87a1dfcf9..c3693bf32 100644 --- a/webapp-java/dxa-module-test/pom.xml +++ b/webapp-java/dxa-module-test/pom.xml @@ -7,7 +7,7 @@ com.sdl.dxa dxa-oss-parent - 2.0.0 + 2.1.0-SNAPSHOT com.sdl.dxa.modules diff --git a/webapp-java/gradle.properties b/webapp-java/gradle.properties index e997a9af9..431ee3726 100644 --- a/webapp-java/gradle.properties +++ b/webapp-java/gradle.properties @@ -1 +1 @@ -version=2.0.0 \ No newline at end of file +version=2.1.0-SNAPSHOT \ No newline at end of file From f4fedcd5818bbb20391fb6169d8df5891cf6db43 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 16 Mar 2018 16:50:13 +0000 Subject: [PATCH 02/78] TSI-3128 : Updated references to 2.1 + refactor to use ILocalization interface --- .../Degrees51ContextClaimsProvider.cs | 3 +-- .../Sdl.Web.Modules.Degrees51.csproj | 2 +- webapp-net/51Degrees/packages.config | 2 +- .../Sdl.Web.Modules.AudienceManager.csproj | 2 +- .../AudienceManager/UserProfileFactory.cs | 3 ++- webapp-net/AudienceManager/packages.config | 2 +- .../AzureUnknownLocalizationHandler.cs | 2 +- .../Sdl.Web.Modules.AzureWebApp.csproj | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- .../ContextExpressionEvaluator.cs | 4 ++-- .../ContextExpressionModelBuilder.cs | 12 +++++----- .../Sdl.Web.Modules.ContextExpressions.csproj | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- .../Core/Views/Entity/LanguageSelector.cshtml | 6 +++-- webapp-net/Core/Models/Entity/Article.cs | 4 ++-- webapp-net/Core/Models/Entity/ContentList.cs | 5 ++-- webapp-net/Core/Models/Entity/Download.cs | 6 ++--- webapp-net/Core/Models/Entity/Image.cs | 3 ++- webapp-net/Core/Models/Entity/ItemList.cs | 4 ++-- webapp-net/Core/Models/Entity/Teaser.cs | 4 ++-- webapp-net/Core/Models/Entity/YouTubeVideo.cs | 3 ++- webapp-net/Core/Sdl.Web.Modules.Core.csproj | 2 +- webapp-net/Core/packages.config | 2 +- .../Mapping/SmartTargetModelBuilder.cs | 23 ++++++++++--------- .../Models/SmartTargetItem.cs | 5 ++-- .../Models/SmartTargetPromotion.cs | 4 ++-- .../Models/SmartTargetRegion.cs | 6 ++--- .../SDL.Web.Modules.SmartTarget.csproj | 2 +- .../ExperienceOptimization/packages.config | 2 +- .../Sdl.Web.Modules.GoogleAnalytics.csproj | 2 +- webapp-net/GoogleAnalytics/packages.config | 2 +- .../Impress/Sdl.Web.Modules.Impress.csproj | 2 +- webapp-net/Impress/packages.config | 2 +- .../Models/MediaManagerDistribution.cs | 4 ++-- .../Sdl.Web.Modules.MediaManager.csproj | 2 +- webapp-net/MediaManager/packages.config | 2 +- .../Providers/AwsCloudSearchProvider.cs | 4 ++-- .../Search/Providers/ISearchProvider.cs | 4 ++-- .../Search/Providers/SI4TSearchProvider.cs | 8 +++---- webapp-net/Search/Providers/SolrProvider.cs | 4 ++-- .../SI4T.Query.CloudSearch/packages.config | 2 +- .../Search/Sdl.Web.Modules.Search.csproj | 2 +- webapp-net/Search/packages.config | 2 +- .../Test/Models/TestFlickrImageModel.cs | 4 ++-- webapp-net/Test/Models/Tsi1758TestEntity.cs | 6 ++--- webapp-net/Test/Sdl.Web.Modules.Test.csproj | 2 +- webapp-net/Test/packages.config | 2 +- 47 files changed, 92 insertions(+), 85 deletions(-) diff --git a/webapp-net/51Degrees/Degrees51ContextClaimsProvider.cs b/webapp-net/51Degrees/Degrees51ContextClaimsProvider.cs index f3918fd15..74c48ab98 100644 --- a/webapp-net/51Degrees/Degrees51ContextClaimsProvider.cs +++ b/webapp-net/51Degrees/Degrees51ContextClaimsProvider.cs @@ -4,7 +4,6 @@ using System.Threading; using System.Web; using FiftyOne.Foundation.Mobile.Detection; -using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Context.Api.Types; @@ -131,7 +130,7 @@ protected bool PerformUpdateRequest(string key) return false; } - public IDictionary GetContextClaims(string aspectName, Localization localization) + public IDictionary GetContextClaims(string aspectName, ILocalization localization) { try { diff --git a/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj b/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj index b0aebe8d2..198f43d7e 100644 --- a/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj +++ b/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj @@ -13,7 +13,7 @@ 512 - 2.0.0 + 2.1.0-beta-201803161729 10.1.0 diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 282195bcd..618d05f3c 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj index 697b08522..520f72cb0 100644 --- a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj +++ b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj @@ -18,7 +18,7 @@ 12.0 - 2.0.0 + 2.1.0-beta-201803161729 10.1.0 8.5.0 diff --git a/webapp-net/AudienceManager/UserProfileFactory.cs b/webapp-net/AudienceManager/UserProfileFactory.cs index 4e30d818b..6683d225c 100644 --- a/webapp-net/AudienceManager/UserProfileFactory.cs +++ b/webapp-net/AudienceManager/UserProfileFactory.cs @@ -1,6 +1,7 @@ using System; using System.Web; using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Mvc.Configuration; using Tridion.ContentDelivery.AmbientData; @@ -57,7 +58,7 @@ public static UserProfile GetUserProfile(string identificationKey) return null; } - Localization localization = WebRequestContext.Localization; + ILocalization localization = WebRequestContext.Localization; // Audience Manager reads the context Publication ID from ADF: AmbientDataContext.CurrentClaimStore.Put(new Uri("taf:claim:publication:id"), localization.Id); diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index aa2944298..275336d95 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/AzureUnknownLocalizationHandler.cs b/webapp-net/AzureWebApp/AzureUnknownLocalizationHandler.cs index 0b17b966d..5690c35bd 100644 --- a/webapp-net/AzureWebApp/AzureUnknownLocalizationHandler.cs +++ b/webapp-net/AzureWebApp/AzureUnknownLocalizationHandler.cs @@ -24,7 +24,7 @@ public class AzureUnknownLocalizationHandler : IUnknownLocalizationHandler /// the response headers and body should be set and should be called to terminate the HTTP processing pipeline. /// /// May return a instance if the handler manages to resolve the Localization. If null is returned, default error handling will be applied. - public Localization HandleUnknownLocalization(DxaUnknownLocalizationException exception, HttpRequest request, HttpResponse response) + public ILocalization HandleUnknownLocalization(DxaUnknownLocalizationException exception, HttpRequest request, HttpResponse response) { using (new Tracer(exception, request, response)) { diff --git a/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj b/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj index 03b0a3ee8..9f19f55ee 100644 --- a/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj +++ b/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj @@ -13,7 +13,7 @@ 512 - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index fd5cb3cfd..9b7bf27d0 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/ContextExpressionEvaluator.cs b/webapp-net/ContextExpressions/ContextExpressionEvaluator.cs index 05883d9fc..7b392ac7c 100644 --- a/webapp-net/ContextExpressions/ContextExpressionEvaluator.cs +++ b/webapp-net/ContextExpressions/ContextExpressionEvaluator.cs @@ -20,7 +20,7 @@ public class ContextExpressionEvaluator : IConditionalEntityEvaluator /// The Entity Model to be evaluated. /// The context Localization /// true if the Entity should be included. - public bool IncludeEntity(EntityModel entity, Localization localization) + public bool IncludeEntity(EntityModel entity, ILocalization localization) { using (new Tracer(entity)) { @@ -51,7 +51,7 @@ public bool IncludeEntity(EntityModel entity, Localization localization) } #endregion - private static IDictionary GetCachedContextClaims(Localization localization) + private static IDictionary GetCachedContextClaims(ILocalization localization) { // TODO TSI-110: This is a temporary measure to cache the Context Claims per request IDictionary result = null; diff --git a/webapp-net/ContextExpressions/ContextExpressionModelBuilder.cs b/webapp-net/ContextExpressions/ContextExpressionModelBuilder.cs index c5801b0b4..d627816f9 100644 --- a/webapp-net/ContextExpressions/ContextExpressionModelBuilder.cs +++ b/webapp-net/ContextExpressions/ContextExpressionModelBuilder.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using DD4T.ContentModel; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Common.Models; using Sdl.Web.DataModel; @@ -21,12 +21,12 @@ namespace Sdl.Web.Modules.ContextExpressions public class ContextExpressionModelBuilder : IModelBuilder, IEntityModelBuilder { #region IModelBuilder members - public void BuildPageModel(ref PageModel pageModel, IPage page, IEnumerable includes, Localization localization) + public void BuildPageModel(ref PageModel pageModel, IPage page, IEnumerable includes, ILocalization localization) { // Nothing to do here } - public void BuildEntityModel(ref EntityModel entityModel, IComponentPresentation cp, Localization localization) + public void BuildEntityModel(ref EntityModel entityModel, IComponentPresentation cp, ILocalization localization) { using (new Tracer(entityModel, cp, localization)) { @@ -53,7 +53,7 @@ public void BuildEntityModel(ref EntityModel entityModel, IComponentPresentation } } - public void BuildEntityModel(ref EntityModel entityModel, IComponent component, Type baseModelType, Localization localization) + public void BuildEntityModel(ref EntityModel entityModel, IComponent component, Type baseModelType, ILocalization localization) { // Nothing to do here } @@ -66,8 +66,8 @@ public void BuildEntityModel(ref EntityModel entityModel, IComponent component, /// The strongly typed Entity Model to build. Is null for the first Entity Model Builder in the pipeline. /// The DXA R2 Data Model. /// The base type for the Entity Model to build. - /// The context . - public void BuildEntityModel(ref EntityModel entityModel, EntityModelData entityModelData, Type baseModelType, Localization localization) + /// The context . + public void BuildEntityModel(ref EntityModel entityModel, EntityModelData entityModelData, Type baseModelType, ILocalization localization) { using (new Tracer(entityModel, entityModelData, baseModelType, localization)) { diff --git a/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj b/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj index 19afedb5b..3d0189957 100644 --- a/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj +++ b/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj @@ -14,7 +14,7 @@ 2.0.0 - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 82a2a8389..8e0b286f1 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/Areas/Core/Views/Entity/LanguageSelector.cshtml b/webapp-net/Core/Areas/Core/Views/Entity/LanguageSelector.cshtml index 27c285db6..fc5079098 100644 --- a/webapp-net/Core/Areas/Core/Views/Entity/LanguageSelector.cshtml +++ b/webapp-net/Core/Areas/Core/Views/Entity/LanguageSelector.cshtml @@ -1,7 +1,9 @@ -@model Configuration +@using System.Collections.Generic +@using Sdl.Web.Common.Interfaces +@model Configuration @{ var siteLocalizations = WebRequestContext.Localization.SiteLocalizations; - var filteredLocalizations = new List(); + var filteredLocalizations = new List(); if (siteLocalizations.Count > 1) { var excludedLocalizations = new List(); diff --git a/webapp-net/Core/Models/Entity/Article.cs b/webapp-net/Core/Models/Entity/Article.cs index 1d78c0d17..d7d7820a3 100644 --- a/webapp-net/Core/Models/Entity/Article.cs +++ b/webapp-net/Core/Models/Entity/Article.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.ServiceModel.Syndication; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.Core.Models { @@ -27,7 +27,7 @@ public class Article : EntityModel, ISyndicationFeedItemProvider /// /// The context . /// A single syndication feed item containing information extracted from this . - public IEnumerable ExtractSyndicationFeedItems(Localization localization) + public IEnumerable ExtractSyndicationFeedItems(ILocalization localization) { return new[] { CreateSyndicationItem(Headline, Description, null, Date, localization) }; } diff --git a/webapp-net/Core/Models/Entity/ContentList.cs b/webapp-net/Core/Models/Entity/ContentList.cs index e7b8e1a0e..0358ca8e7 100644 --- a/webapp-net/Core/Models/Entity/ContentList.cs +++ b/webapp-net/Core/Models/Entity/ContentList.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; namespace Sdl.Web.Modules.Core.Models @@ -40,7 +41,7 @@ public int CurrentPage } } - public override Query GetQuery(Localization localization) + public override Query GetQuery(ILocalization localization) { return new SimpleBrokerQuery { @@ -53,7 +54,7 @@ public override Query GetQuery(Localization localization) }; } - protected int MapSchema(Localization localization) + protected int MapSchema(ILocalization localization) { if (ContentType == null) { diff --git a/webapp-net/Core/Models/Entity/Download.cs b/webapp-net/Core/Models/Entity/Download.cs index 582f84a24..88e0f88ed 100644 --- a/webapp-net/Core/Models/Entity/Download.cs +++ b/webapp-net/Core/Models/Entity/Download.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.ServiceModel.Syndication; -using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Models; using System; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.Core.Models { @@ -50,7 +50,7 @@ public override string ToHtml(string widthFactor, double aspect = 0, string cssC /// /// This makes it possible possible to render "embedded" Download Models using the Html.DxaEntity method. /// - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Core:Download"); } @@ -61,7 +61,7 @@ public override MvcData GetDefaultView(Localization localization) /// /// The context . /// A single syndication feed item containing information extracted from this . - public IEnumerable ExtractSyndicationFeedItems(Localization localization) + public IEnumerable ExtractSyndicationFeedItems(ILocalization localization) { Link downloadLink = new Link {Url = Url}; return new[] { CreateSyndicationItem(FileName, Description, downloadLink, null, localization) }; diff --git a/webapp-net/Core/Models/Entity/Image.cs b/webapp-net/Core/Models/Entity/Image.cs index 94ec1efbe..afa082ca3 100644 --- a/webapp-net/Core/Models/Entity/Image.cs +++ b/webapp-net/Core/Models/Entity/Image.cs @@ -2,6 +2,7 @@ using System.Globalization; using System.Xml; using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; namespace Sdl.Web.Modules.Core.Models @@ -65,7 +66,7 @@ public override void ReadFromXhtmlElement(XmlElement xhtmlElement) /// /// This makes it possible possible to render "embedded" Image Models using the Html.DxaEntity method. /// - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Core:Image"); } diff --git a/webapp-net/Core/Models/Entity/ItemList.cs b/webapp-net/Core/Models/Entity/ItemList.cs index fedb9e80c..3f83b7cb7 100644 --- a/webapp-net/Core/Models/Entity/ItemList.cs +++ b/webapp-net/Core/Models/Entity/ItemList.cs @@ -1,8 +1,8 @@ using Sdl.Web.Common.Models; using System.Collections.Generic; using System.ServiceModel.Syndication; -using Sdl.Web.Common.Configuration; using System; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.Core.Models { @@ -21,7 +21,7 @@ public class ItemList : EntityModel, ISyndicationFeedItemProvider /// /// The context . /// The extracted syndication feed items; a concatentation of syndication feed items provided by (if any). - public virtual IEnumerable ExtractSyndicationFeedItems(Localization localization) + public virtual IEnumerable ExtractSyndicationFeedItems(ILocalization localization) { return ConcatenateSyndicationFeedItems(ItemListElements, localization); } diff --git a/webapp-net/Core/Models/Entity/Teaser.cs b/webapp-net/Core/Models/Entity/Teaser.cs index 846c579e3..6d8023961 100644 --- a/webapp-net/Core/Models/Entity/Teaser.cs +++ b/webapp-net/Core/Models/Entity/Teaser.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.ServiceModel.Syndication; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.Core.Models { @@ -94,7 +94,7 @@ public void SetFormatOption(string key, string value) /// /// The context . /// A single syndication feed item containing information extracted from this . - public IEnumerable ExtractSyndicationFeedItems(Localization localization) + public IEnumerable ExtractSyndicationFeedItems(ILocalization localization) { Link link = Link; if (link == null && Media != null) diff --git a/webapp-net/Core/Models/Entity/YouTubeVideo.cs b/webapp-net/Core/Models/Entity/YouTubeVideo.cs index b34e1b565..3b53b462c 100644 --- a/webapp-net/Core/Models/Entity/YouTubeVideo.cs +++ b/webapp-net/Core/Models/Entity/YouTubeVideo.cs @@ -2,6 +2,7 @@ using System.Xml; using Newtonsoft.Json; using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; namespace Sdl.Web.Modules.Core.Models @@ -72,7 +73,7 @@ public override void ReadFromXhtmlElement(XmlElement xhtmlElement) /// /// This makes it possible possible to render "embedded" YouTubeVideo Models using the Html.DxaEntity method. /// - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Core:YouTubeVideo"); } diff --git a/webapp-net/Core/Sdl.Web.Modules.Core.csproj b/webapp-net/Core/Sdl.Web.Modules.Core.csproj index 467468878..fe6af982d 100644 --- a/webapp-net/Core/Sdl.Web.Modules.Core.csproj +++ b/webapp-net/Core/Sdl.Web.Modules.Core.csproj @@ -27,7 +27,7 @@ true - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 4d08071a9..698210b5b 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ExperienceOptimization/Mapping/SmartTargetModelBuilder.cs b/webapp-net/ExperienceOptimization/Mapping/SmartTargetModelBuilder.cs index 2580b563a..050a75050 100644 --- a/webapp-net/ExperienceOptimization/Mapping/SmartTargetModelBuilder.cs +++ b/webapp-net/ExperienceOptimization/Mapping/SmartTargetModelBuilder.cs @@ -20,6 +20,7 @@ using MvcData = Sdl.Web.Common.Models.MvcData; using TcmUri = Tridion.SmartTarget.Utils.TcmUri; using System.Globalization; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.SmartTarget.Mapping { @@ -44,7 +45,7 @@ public class SmartTargetModelBuilder : IModelBuilder, IPageModelBuilder /// This implementation relies on the already having constructed Region Models of type . /// We "upgrade" the Page Model to type and populate the ST Regions Entities. /// - public void BuildPageModel(ref PageModel pageModel, IPage page, IEnumerable includes, Localization localization) + public void BuildPageModel(ref PageModel pageModel, IPage page, IEnumerable includes, ILocalization localization) { using (new Tracer(pageModel, page, includes, localization)) { @@ -99,12 +100,12 @@ public void BuildPageModel(ref PageModel pageModel, IPage page, IEnumerableThe DXA R2 Data Model. /// Indicates whether Include Page Regions should be included. /// The context . - public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, bool includePageRegions, Localization localization) + public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, bool includePageRegions, ILocalization localization) { using (new Tracer(pageModel, pageModelData, includePageRegions, localization)) { @@ -155,7 +156,7 @@ public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, } #endregion - private void PopulateSmartTargetRegions(SmartTargetPageModel smartTargetPageModel, Localization localization) + private void PopulateSmartTargetRegions(SmartTargetPageModel smartTargetPageModel, ILocalization localization) { // Execute a ST Query for all SmartTargetRegions on the Page. ResultSet resultSet = ExecuteSmartTargetQuery(smartTargetPageModel, localization); @@ -232,7 +233,7 @@ private void PopulateSmartTargetRegions(SmartTargetPageModel smartTargetPageMode } } - protected virtual SmartTargetPromotion CreatePromotionEntity(Promotion promotion, string viewName, string regionName, Localization localization, ExperimentDimensions experimentDimensions) + protected virtual SmartTargetPromotion CreatePromotionEntity(Promotion promotion, string viewName, string regionName, ILocalization localization, ExperimentDimensions experimentDimensions) { // In ST 2014 SP1 the ResultSet.FilterPromotions API represents Experiments as type Promotion, so we're not testing on type Experiment here. SmartTargetPromotion result = (experimentDimensions != null) ? new SmartTargetExperiment(experimentDimensions) : new SmartTargetPromotion(); @@ -251,13 +252,13 @@ protected virtual SmartTargetPromotion CreatePromotionEntity(Promotion promotion return result; } - protected virtual SmartTargetItem CreateSmartTargetItem(Item item, Localization localization) + protected virtual SmartTargetItem CreateSmartTargetItem(Item item, ILocalization localization) { string entityId = $"{item.ComponentUri.ItemId}-{item.TemplateUri.ItemId}"; return new SmartTargetItem(entityId, localization); } - private static ResultSet ExecuteSmartTargetQuery(SmartTargetPageModel smartTargetPageModel, Localization localization) + private static ResultSet ExecuteSmartTargetQuery(SmartTargetPageModel smartTargetPageModel, ILocalization localization) { using (new Tracer(smartTargetPageModel, localization)) { @@ -282,7 +283,7 @@ private static ResultSet ExecuteSmartTargetQuery(SmartTargetPageModel smartTarge } } - private static bool GetAllowDuplicatesFromConfig(Localization localization) + private static bool GetAllowDuplicatesFromConfig(ILocalization localization) { string configValue = localization.GetConfigValue("smarttarget.allowDuplicationOnSamePageConfig"); return Convert.ToBoolean(configValue); @@ -294,7 +295,7 @@ private static bool GetAllowDuplicatesFromConfig(Localization localization) /// /// Used in R2 Model Builder Pipeline. /// - private static bool GetAllowDuplicatesOnSamePage(PageModelData pageModelData, Localization localization) + private static bool GetAllowDuplicatesOnSamePage(PageModelData pageModelData, ILocalization localization) { object allowDups; if ((pageModelData.Metadata == null) || !pageModelData.Metadata.TryGetValue(AllowDuplicatesFieldName, out allowDups)) @@ -318,7 +319,7 @@ private static bool GetAllowDuplicatesOnSamePage(PageModelData pageModelData, Lo /// /// Used in Legacy Model Builder Pipeline (DD4T-based) /// - private static bool GetAllowDuplicatesOnSamePage(IPageTemplate pageTemplate, Localization localization) + private static bool GetAllowDuplicatesOnSamePage(IPageTemplate pageTemplate, ILocalization localization) { string allowDuplicates = null; if ((pageTemplate?.MetadataFields != null) && pageTemplate.MetadataFields.ContainsKey(AllowDuplicatesFieldName)) diff --git a/webapp-net/ExperienceOptimization/Models/SmartTargetItem.cs b/webapp-net/ExperienceOptimization/Models/SmartTargetItem.cs index 79f9e1a4f..bb22553fc 100644 --- a/webapp-net/ExperienceOptimization/Models/SmartTargetItem.cs +++ b/webapp-net/ExperienceOptimization/Models/SmartTargetItem.cs @@ -1,13 +1,14 @@ using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Models; using System; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.SmartTarget.Models { [Serializable] public class SmartTargetItem { - private readonly Localization _localization; + private readonly ILocalization _localization; private EntityModel _entity; public string EntityId { get; private set; } @@ -20,7 +21,7 @@ public class SmartTargetItem /// public EntityModel Entity => _entity ?? (_entity = SiteConfiguration.ContentProvider.GetEntityModel(EntityId, _localization)); - public SmartTargetItem(string entityId, Localization localization) + public SmartTargetItem(string entityId, ILocalization localization) { EntityId = entityId; _localization = localization; diff --git a/webapp-net/ExperienceOptimization/Models/SmartTargetPromotion.cs b/webapp-net/ExperienceOptimization/Models/SmartTargetPromotion.cs index 7d5eed7a1..b74da737e 100644 --- a/webapp-net/ExperienceOptimization/Models/SmartTargetPromotion.cs +++ b/webapp-net/ExperienceOptimization/Models/SmartTargetPromotion.cs @@ -1,8 +1,8 @@ using System; -using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Models; using System.Collections.Generic; using Sdl.Web.Common; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.SmartTarget.Models { @@ -19,7 +19,7 @@ public class SmartTargetPromotion : EntityModel public List Items { get; set; } - public override string GetXpmMarkup(Localization localization) + public override string GetXpmMarkup(ILocalization localization) { return (XpmMetadata == null) ? string.Empty : string.Format(XpmMarkupFormat, XpmMetadata["PromotionID"], XpmMetadata["RegionID"]); } diff --git a/webapp-net/ExperienceOptimization/Models/SmartTargetRegion.cs b/webapp-net/ExperienceOptimization/Models/SmartTargetRegion.cs index 16dc10baf..19a8ef044 100644 --- a/webapp-net/ExperienceOptimization/Models/SmartTargetRegion.cs +++ b/webapp-net/ExperienceOptimization/Models/SmartTargetRegion.cs @@ -1,5 +1,5 @@ using System; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; namespace Sdl.Web.Modules.SmartTarget.Models @@ -41,7 +41,7 @@ public SmartTargetRegion(string name, string qualifiedViewName) /// public string GetStartQueryXpmMarkup() { - return (XpmMetadata == null) ? String.Empty : (string) XpmMetadata["Query"]; + return (XpmMetadata == null) ? string.Empty : (string) XpmMetadata["Query"]; } /// @@ -49,7 +49,7 @@ public string GetStartQueryXpmMarkup() /// /// The context Localization. /// The XPM markup. - public override string GetXpmMarkup(Localization localization) + public override string GetXpmMarkup(ILocalization localization) { return $""; } diff --git a/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj b/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj index 75438fedb..93bbb7c10 100644 --- a/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj +++ b/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj @@ -16,7 +16,7 @@ 10.1.0 2.0.0 - 2.0.0 + 2.1.0-beta-201803161729 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 882483bf7..8c0a7c2fb 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj b/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj index c2dee1dad..172c40d41 100644 --- a/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj +++ b/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj @@ -14,7 +14,7 @@ - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index 2a6363325..7d82a6b77 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj b/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj index 86aa2aa7e..50d091a13 100644 --- a/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj +++ b/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj @@ -14,7 +14,7 @@ - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index 2a6363325..7d82a6b77 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/Models/MediaManagerDistribution.cs b/webapp-net/MediaManager/Models/MediaManagerDistribution.cs index adb0d83e2..3a25c0e35 100644 --- a/webapp-net/MediaManager/Models/MediaManagerDistribution.cs +++ b/webapp-net/MediaManager/Models/MediaManagerDistribution.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Xml; using Newtonsoft.Json; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; namespace Sdl.Web.Modules.MediaManager.Models @@ -134,7 +134,7 @@ public bool IsCustomVideoControls /// /// This makes it possible possible to render "embedded" MediaManagerDistribution Models using the Html.DxaEntity method. /// - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("MediaManager:" + EclDisplayTypeId); } diff --git a/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj b/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj index ec7ea85ef..56aefc799 100644 --- a/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj +++ b/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj @@ -14,7 +14,7 @@ - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index 2a6363325..7d82a6b77 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/Providers/AwsCloudSearchProvider.cs b/webapp-net/Search/Providers/AwsCloudSearchProvider.cs index cf6805371..0fce2c5ee 100644 --- a/webapp-net/Search/Providers/AwsCloudSearchProvider.cs +++ b/webapp-net/Search/Providers/AwsCloudSearchProvider.cs @@ -1,6 +1,6 @@ using System.Collections.Specialized; using System.Linq; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Modules.Search.Models; using SI4T.Query.Models; @@ -9,7 +9,7 @@ namespace Sdl.Web.Modules.Search.Providers { public class AwsCloudSearchProvider : SI4TSearchProvider { - protected override NameValueCollection SetupParameters(SearchQuery searchQuery, Localization localization) + protected override NameValueCollection SetupParameters(SearchQuery searchQuery, ILocalization localization) { NameValueCollection result = base.SetupParameters(searchQuery, localization); if (!result.AllKeys.Contains("q.options")) diff --git a/webapp-net/Search/Providers/ISearchProvider.cs b/webapp-net/Search/Providers/ISearchProvider.cs index 0a1ba5405..d7b60c847 100644 --- a/webapp-net/Search/Providers/ISearchProvider.cs +++ b/webapp-net/Search/Providers/ISearchProvider.cs @@ -1,11 +1,11 @@ using System; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Modules.Search.Models; namespace Sdl.Web.Modules.Search.Providers { public interface ISearchProvider { - void ExecuteQuery(SearchQuery searchQuery, Type resultType, Localization localization); + void ExecuteQuery(SearchQuery searchQuery, Type resultType, ILocalization localization); } } diff --git a/webapp-net/Search/Providers/SI4TSearchProvider.cs b/webapp-net/Search/Providers/SI4TSearchProvider.cs index 2c08e2637..b848e6f1a 100644 --- a/webapp-net/Search/Providers/SI4TSearchProvider.cs +++ b/webapp-net/Search/Providers/SI4TSearchProvider.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Specialized; using System.Globalization; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Common.Models; using Sdl.Web.Modules.Search.Models; @@ -15,7 +15,7 @@ namespace Sdl.Web.Modules.Search.Providers public abstract class SI4TSearchProvider : ISearchProvider { #region ISearchProvider members - public void ExecuteQuery(SearchQuery searchQuery, Type resultType, Localization localization) + public void ExecuteQuery(SearchQuery searchQuery, Type resultType, ILocalization localization) { using (new Tracer(searchQuery, resultType, localization)) { @@ -40,7 +40,7 @@ public void ExecuteQuery(SearchQuery searchQuery, Type resultType, Localization } #endregion - protected virtual string GetSearchIndexUrl(Localization localization) + protected virtual string GetSearchIndexUrl(ILocalization localization) { // First try the new search.queryURL setting provided by DXA 1.3 TBBs if the Search Query URL can be obtained from Topology Manager. string result = localization.GetConfigValue("search.queryURL"); @@ -66,7 +66,7 @@ protected virtual SearchItem MapResult(SearchResult result, Type modelType, stri return searchItem; } - protected virtual NameValueCollection SetupParameters(SearchQuery searchQuery, Localization localization) + protected virtual NameValueCollection SetupParameters(SearchQuery searchQuery, ILocalization localization) { NameValueCollection result = new NameValueCollection(searchQuery.QueryStringParameters); result["fq"] = "publicationid:" + localization.Id; // TODO: What about CM URI scheme? diff --git a/webapp-net/Search/Providers/SolrProvider.cs b/webapp-net/Search/Providers/SolrProvider.cs index a43a5b176..5d35bd80c 100644 --- a/webapp-net/Search/Providers/SolrProvider.cs +++ b/webapp-net/Search/Providers/SolrProvider.cs @@ -1,5 +1,5 @@ using System.Collections.Specialized; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Modules.Search.Models; using SI4T.Query.Models; @@ -8,7 +8,7 @@ namespace Sdl.Web.Modules.Search.Providers { public class SolrProvider : SI4TSearchProvider { - protected override NameValueCollection SetupParameters(SearchQuery searchQuery, Localization localization) + protected override NameValueCollection SetupParameters(SearchQuery searchQuery, ILocalization localization) { NameValueCollection parameters = base.SetupParameters(searchQuery, localization); // We use the highlighting feature to autogenerate a Summary if no Summary is present in the search index. diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index ba5a8f787..27ad8e2b2 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/Sdl.Web.Modules.Search.csproj b/webapp-net/Search/Sdl.Web.Modules.Search.csproj index a960b8013..05f8380cc 100644 --- a/webapp-net/Search/Sdl.Web.Modules.Search.csproj +++ b/webapp-net/Search/Sdl.Web.Modules.Search.csproj @@ -14,7 +14,7 @@ - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 58f450302..47a63a859 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/Models/TestFlickrImageModel.cs b/webapp-net/Test/Models/TestFlickrImageModel.cs index 8ec95a96d..4015f91d7 100644 --- a/webapp-net/Test/Models/TestFlickrImageModel.cs +++ b/webapp-net/Test/Models/TestFlickrImageModel.cs @@ -1,7 +1,7 @@ using System; using Sdl.Web.Common.Models; using System.Globalization; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; namespace Sdl.Web.Modules.Test.Models { @@ -36,7 +36,7 @@ public string TestProperty4 set; } - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Test:TestFlickrImage"); } diff --git a/webapp-net/Test/Models/Tsi1758TestEntity.cs b/webapp-net/Test/Models/Tsi1758TestEntity.cs index 3bbf937a7..757c67d06 100644 --- a/webapp-net/Test/Models/Tsi1758TestEntity.cs +++ b/webapp-net/Test/Models/Tsi1758TestEntity.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; namespace Sdl.Web.Modules.Test.Models @@ -18,7 +18,7 @@ public class Tsi1758TestEmbeddedEntity : EntityModel public Link EmbedField1 { get; set; } public Tsi1758TestEmbedded2Entity EmbedField2 { get; set; } - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Test:TSI1758TestEmbedded"); } @@ -30,7 +30,7 @@ public class Tsi1758TestEmbedded2Entity : EntityModel public string TextField { get; set; } public Link EmbedField2 { get; set; } - public override MvcData GetDefaultView(Localization localization) + public override MvcData GetDefaultView(ILocalization localization) { return new MvcData("Test:TSI1758TestEmbedded2"); } diff --git a/webapp-net/Test/Sdl.Web.Modules.Test.csproj b/webapp-net/Test/Sdl.Web.Modules.Test.csproj index 473e8e3ff..fe738a387 100644 --- a/webapp-net/Test/Sdl.Web.Modules.Test.csproj +++ b/webapp-net/Test/Sdl.Web.Modules.Test.csproj @@ -15,7 +15,7 @@ - 2.0.0 + 2.1.0-beta-201803161729 true diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index 2a6363325..7d82a6b77 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file From f1ad37210d294cec24594fe31c2052c928a74b24 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 23 Mar 2018 12:42:15 +0000 Subject: [PATCH 03/78] TSI-3129 : Initial DDWebApp module containing the IshModule --- .../Areas/DDWebApp/Views/IshPage/Home.cshtml | 31 ++++ .../DDWebApp/Areas/DDWebApp/Views/web.config | 37 +++++ .../DDWebApp/Controllers/BaseController.cs | 100 ++++++++++++ .../DDWebApp/Controllers/IshApiController.cs | 92 +++++++++++ .../DDWebApp/Controllers/IshPageController.cs | 84 ++++++++++ .../DDWebAppModuleAreaRegistration.cs | 24 +++ .../DDWebApp/Exceptions/IshApiException.cs | 18 +++ .../DDWebApp/Localization/IshLocalization.cs | 37 +++++ .../Localization/IshLocalizationResolver.cs | 19 +++ webapp-net/DDWebApp/Models/Publication.cs | 21 +++ .../DDWebApp/Models/PublicationSiteMap.cs | 14 ++ webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs | 10 ++ webapp-net/DDWebApp/Models/Topic.cs | 22 +++ .../Navigation/IshNavigationProvider.cs | 58 +++++++ .../DDWebApp/Properties/AssemblyInfo.cs | 5 + .../DDWebApp/Providers/ConditionProvider.cs | 39 +++++ .../DDWebApp/Providers/IshContentProvider.cs | 73 +++++++++ .../DDWebApp/Providers/PublicationProvider.cs | 151 ++++++++++++++++++ webapp-net/DDWebApp/Providers/TocProvider.cs | 40 +++++ .../DDWebApp/Sdl.Web.Modules.DDWebApp.csproj | 116 ++++++++++++++ webapp-net/DDWebApp/packages.config | 9 ++ webapp-net/DxaModules.sln | 8 +- 22 files changed, 1007 insertions(+), 1 deletion(-) create mode 100644 webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml create mode 100644 webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config create mode 100644 webapp-net/DDWebApp/Controllers/BaseController.cs create mode 100644 webapp-net/DDWebApp/Controllers/IshApiController.cs create mode 100644 webapp-net/DDWebApp/Controllers/IshPageController.cs create mode 100644 webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs create mode 100644 webapp-net/DDWebApp/Exceptions/IshApiException.cs create mode 100644 webapp-net/DDWebApp/Localization/IshLocalization.cs create mode 100644 webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs create mode 100644 webapp-net/DDWebApp/Models/Publication.cs create mode 100644 webapp-net/DDWebApp/Models/PublicationSiteMap.cs create mode 100644 webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs create mode 100644 webapp-net/DDWebApp/Models/Topic.cs create mode 100644 webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs create mode 100644 webapp-net/DDWebApp/Properties/AssemblyInfo.cs create mode 100644 webapp-net/DDWebApp/Providers/ConditionProvider.cs create mode 100644 webapp-net/DDWebApp/Providers/IshContentProvider.cs create mode 100644 webapp-net/DDWebApp/Providers/PublicationProvider.cs create mode 100644 webapp-net/DDWebApp/Providers/TocProvider.cs create mode 100644 webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj create mode 100644 webapp-net/DDWebApp/packages.config diff --git a/webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml b/webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml new file mode 100644 index 000000000..7309a6233 --- /dev/null +++ b/webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml @@ -0,0 +1,31 @@ + + + + + + SDL Documentation + + + + + + + + + + +
+ + + + + + + + + diff --git a/webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config b/webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config new file mode 100644 index 000000000..72d34296b --- /dev/null +++ b/webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config @@ -0,0 +1,37 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp-net/DDWebApp/Controllers/BaseController.cs b/webapp-net/DDWebApp/Controllers/BaseController.cs new file mode 100644 index 000000000..e1a8474ad --- /dev/null +++ b/webapp-net/DDWebApp/Controllers/BaseController.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using System.Web.Mvc; +using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.DDWebApp.Exceptions; +using Sdl.Web.Modules.DDWebApp.Navigation; +using Sdl.Web.Modules.DDWebApp.Providers; +using Sdl.Web.Mvc.Configuration; +using Tridion.ContentDelivery.Meta; + +namespace Sdl.Web.Modules.DDWebApp.Controllers +{ + [RouteArea("DDWebApp")] + public class BaseController : Mvc.Controllers.PageController + { + private static readonly string TocNaventriesMeta = "tocnaventries.generated.value"; + private static readonly string PageConditionsUsedMeta = "conditionsused.generated.value"; + private static readonly string PageLogicalRefObjectId = "ishlogicalref.object.id"; + + private IshContentProvider _contentProvider; + + protected ILocalization SetupLocalization(int publicationId) + { + PublicationProvider provider = new PublicationProvider(); + provider.CheckPublicationOnline(publicationId); + ILocalization localization = WebRequestContext.Localization; + localization.Id = publicationId.ToString(); + return localization; + } + + protected override ViewModel EnrichModel(ViewModel model) + { + PageModel pageModel = model as PageModel; + if (pageModel == null) + { + return model; + } + ILocalization localization = WebRequestContext.Localization; + PageMetaFactory pageMetaFactory = new PageMetaFactory(localization.Id); + var pageMeta = pageMetaFactory.GetMeta(pageModel.Id); + if (pageMeta != null) + { + var customMeta = pageMeta.CustomMeta; + + if (customMeta.GetFirstValue(TocNaventriesMeta) != null) + { + // Take the generated product family name from the metadata + NameValuePair tocNavEntries = (NameValuePair)customMeta.NameValues[TocNaventriesMeta]; + List values = (List) tocNavEntries?.MultipleValues; + if (values != null) + { + pageModel.Meta.Add(TocNaventriesMeta, string.Join(", ", values)); + } + } + + // Put the information about used conditions form page metadata + if (customMeta.GetFirstValue(PageConditionsUsedMeta) != null) + { + pageModel.Meta.Add(PageConditionsUsedMeta, (string)customMeta.GetFirstValue(PageConditionsUsedMeta)); + } + + // Add logical Ref ID information + if (customMeta.GetFirstValue(PageLogicalRefObjectId) != null) + { + pageModel.Meta.Add(PageLogicalRefObjectId, (string)customMeta.GetFirstValue(PageLogicalRefObjectId)); + } + } + return model; + } + + protected IshContentProvider IshContentProvider + { + get + { + if (!(ContentProvider is IshContentProvider)) + { + throw new IshApiException( + "IshContentProvider not configured. Please make sure you have the IshContentProvider specified in your Unity.config"); + } + return ContentProvider as IshContentProvider; + } + } + + protected IshNavigationProvider IshNavigationProvider + { + get + { + INavigationProvider navProvider = SiteConfiguration.NavigationProvider; + if (!(navProvider is IshNavigationProvider)) + { + throw new IshApiException( + "IshNavigationProvider not configured. Please make sure you have the IshNavigationProvider specified in your Unity.config"); + + } + return navProvider as IshNavigationProvider; + } + } + } +} diff --git a/webapp-net/DDWebApp/Controllers/IshApiController.cs b/webapp-net/DDWebApp/Controllers/IshApiController.cs new file mode 100644 index 000000000..a155f0c2a --- /dev/null +++ b/webapp-net/DDWebApp/Controllers/IshApiController.cs @@ -0,0 +1,92 @@ +using System.Web.Mvc; +using Sdl.Web.Common; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.DDWebApp.Providers; +using Sdl.Web.Mvc.Formats; + +namespace Sdl.Web.Modules.DDWebApp.Controllers +{ + /// + /// Ish Api Controller + /// + public class IshApiController : BaseController + { + [Route("~/api/page/{publicationId:int}/{pageId:int}")] + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*path}")] + [HttpGet] + [FormatData] + public virtual ActionResult Page(int publicationId, int pageId, string path, string conditions = "") + { + PageModel pageModel = IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + return Json(pageModel); + //return Content(JsonConvert.SerializeObject(pageModel), "application/json"); + } + + [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] + [Route("~/api/binary/{publicationId:int}/{binaryId:int}/{*content}")] + [HttpGet] + [FormatData] + public virtual ActionResult Binary(int publicationId, int binaryId) + { + StaticContentItem content = IshContentProvider.GetStaticContentItem(binaryId, SetupLocalization(publicationId)); + return new FileStreamResult(content.GetContentStream(), content.ContentType); + } + + [Route("~/api/publications")] + [HttpGet] + public virtual ActionResult Publications() + { + PublicationProvider provider = new PublicationProvider(); + return Json(provider.PublicationList); + } + + [Route("~/api/conditions/{publicationId:int}")] + public virtual ActionResult Conditions(int publicationId) + { + return Json(new ConditionProvider().GetConditions(publicationId)); + } + + [Route("~/api/sitemap.xml")] + public virtual ActionResult SitemapXml() + { + // Use the common SiteMapXml view for rendering out the xml of all the sitemap items. + return View("SiteMapXml", IshNavigationProvider.SiteMap); + } + + [Route("~/api/toc/{publicationId:int}")] + public virtual ActionResult RootToc(int publicationId, string conditions = "") + { + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(conditions)) + { + // todo: add claim URI.create("taf:ish:userconditions") with value 'conditions' + } + TocProvider tocProvider = new TocProvider(); + return Json(tocProvider.GetToc(publicationId)); + } + + [Route("~/api/toc/{publicationId:int}/{sitemapItemId}")] + public virtual ActionResult Toc(int publicationId, string sitemapItemId, string conditions = "", bool includeAncestors = false) + { + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(conditions)) + { + // todo: add claim URI.create("taf:ish:userconditions") with value 'conditions' + } + TocProvider tocProvider = new TocProvider(); + var sitemapItems = tocProvider.GetToc(publicationId, sitemapItemId, includeAncestors); + return Json(sitemapItems); + } + + [Route("~/api/pageIdByReference/{publicationId:int}/{ishFieldValue}")] + public virtual ActionResult TopicIdInTargetPublication(int publicationId, string ishFieldValue) + { + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(ishFieldValue)) + { + throw new DxaItemNotFoundException("Unable to use empty 'ishlogicalref.object.id' value as a search criteria."); + } + return Json(IshContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); + } + } +} diff --git a/webapp-net/DDWebApp/Controllers/IshPageController.cs b/webapp-net/DDWebApp/Controllers/IshPageController.cs new file mode 100644 index 000000000..b75029672 --- /dev/null +++ b/webapp-net/DDWebApp/Controllers/IshPageController.cs @@ -0,0 +1,84 @@ +using System; +using System.Web.Mvc; +using Sdl.Web.Common; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Logging; +using Sdl.Web.Common.Models; +using Sdl.Web.Mvc; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.DDWebApp.Controllers +{ + /// + /// Ish Page Controller + /// + public class IshPageController : BaseController + { + [Route("~/")] + [Route("~/home")] + [Route("~/publications/{*content}")] + public ActionResult Home() + { + return View("Home"); + } + + [Route("~/{publicationId:int}")] + public virtual ActionResult Page(int publicationId) + { + return GetPage(publicationId); + } + + [Route("~/{publicationId:int}/{pageId:int}")] + [Route("~/{publicationId:int}/{pageId:int}/{*path}")] + public virtual ActionResult Page(int publicationId, int pageId, string path = "") + { + return GetPage(publicationId, pageId); + } + + protected ActionResult GetPage(int publicationId) + { + SetupLocalization(publicationId); + return View("Home"); + } + + protected ActionResult GetPage(int publicationId, int pageId) + { + ILocalization localization = SetupLocalization(publicationId); + using (new Tracer(publicationId, pageId)) + { + try + { + bool addIncludes = true; + object addIncludesViewData; + if (ViewData.TryGetValue(DxaViewDataItems.AddIncludes, out addIncludesViewData)) + { + addIncludes = (bool)addIncludesViewData; + } + PageModel pageModel = null; + try + { + pageModel = IshContentProvider.GetPageModel(pageId, localization); + } + catch (DxaItemNotFoundException ex) + { + Log.Info(ex.Message); + return NotFound(); + } + + PageModelWithHttpResponseData pageModelWithHttpResponseData = + pageModel as PageModelWithHttpResponseData; + pageModelWithHttpResponseData?.SetHttpResponseData(System.Web.HttpContext.Current.Response); + SetupViewData(pageModel); + PageModel model = (EnrichModel(pageModel) as PageModel) ?? pageModel; + WebRequestContext.PageModel = model; + return View(model.MvcData.ViewName, model); + } + catch (Exception ex) + { + Log.Error(ex); + return ServerError(); + } + } + } + } +} diff --git a/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs b/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs new file mode 100644 index 000000000..72b71cfec --- /dev/null +++ b/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs @@ -0,0 +1,24 @@ +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.DDWebApp.Models; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.DDWebApp +{ + /// + /// DDWebApp module area registration + /// + public class DDWebAppModuleAreaRegistration : BaseAreaRegistration + { + public override string AreaName => "DDWebApp"; + + protected override void RegisterAllViewModels() + { + // Entity Views + RegisterViewModel("Topic", typeof(Topic)); + + // Page Views + RegisterViewModel("Home", typeof(PageModel)); + RegisterViewModel("GeneralPage", typeof(PageModel)); + } + } +} diff --git a/webapp-net/DDWebApp/Exceptions/IshApiException.cs b/webapp-net/DDWebApp/Exceptions/IshApiException.cs new file mode 100644 index 000000000..d84fee8fc --- /dev/null +++ b/webapp-net/DDWebApp/Exceptions/IshApiException.cs @@ -0,0 +1,18 @@ +using System; + +namespace Sdl.Web.Modules.DDWebApp.Exceptions +{ + /// + /// Ish Api Exception + /// + public class IshApiException : Exception + { + public IshApiException(string msg) : base(msg) + { + } + + public IshApiException(string msg, Exception innerException) : base(msg, innerException) + { + } + } +} diff --git a/webapp-net/DDWebApp/Localization/IshLocalization.cs b/webapp-net/DDWebApp/Localization/IshLocalization.cs new file mode 100644 index 000000000..b7e041f0e --- /dev/null +++ b/webapp-net/DDWebApp/Localization/IshLocalization.cs @@ -0,0 +1,37 @@ +using Sdl.Web.Common.Configuration; + +namespace Sdl.Web.Modules.DDWebApp.Localization +{ + /// + /// Ish Localization Implementation + /// + public class IshLocalization : Common.Configuration.Localization + { + public IshLocalization() + { + /* + List mediaPatterns = new List(); + + mediaPatterns.Add("^/favicon.ico"); + mediaPatterns.Add(String.Format("^{0}/{1}/assets/.*", Path, SiteConfiguration.SystemFolder)); + mediaPatterns.Add(String.Format("^{0}/{1}/.*\\.json$", Path, SiteConfiguration.SystemFolder)); + + StaticContentUrlPattern = String.Join("|", mediaPatterns); + _staticContentUrlRegex = new Regex(StaticContentUrlPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); + */ + } + + public override string Path { get; set; } = "/DDWebApp"; // content path + + public override string CmUriScheme { get; } = "ish"; + + public override bool IsXpmEnabled { get; set; } = false; // no xpm on dd-webapp + + public override string BinaryCacheFolder => $"{SiteConfiguration.StaticsFolder}\\DDWebApp"; + + //public override bool IsStaticContentUrl(string urlPath) + //{ + // return true; + //} + } +} \ No newline at end of file diff --git a/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs b/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs new file mode 100644 index 000000000..26d8291bb --- /dev/null +++ b/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs @@ -0,0 +1,19 @@ +using System; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Tridion; + +namespace Sdl.Web.Modules.DDWebApp.Localization +{ + /// + /// Ish Localization Resolver + /// + public class IshLocalizationResolver : LocalizationResolver + { + public override ILocalization ResolveLocalization(Uri url) + { + ILocalization localization = new IshLocalization(); + localization.EnsureInitialized(); + return localization; + } + } +} diff --git a/webapp-net/DDWebApp/Models/Publication.cs b/webapp-net/DDWebApp/Models/Publication.cs new file mode 100644 index 000000000..a43af0fa0 --- /dev/null +++ b/webapp-net/DDWebApp/Models/Publication.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Sdl.Web.Modules.DDWebApp.Models +{ + /// + /// Publication + /// + public class Publication + { + public string Id { get; set; } + public string Title { get; set; } + public List ProductFamily { get; set; } + public List ProductReleaseVersion { get; set; } + public string VersionRef { get; set; } + public string Language { get; set; } + public DateTime CreatedOn { get; set; } + public string Version { get; set; } + public string LogicalId { get; set; } + } +} diff --git a/webapp-net/DDWebApp/Models/PublicationSiteMap.cs b/webapp-net/DDWebApp/Models/PublicationSiteMap.cs new file mode 100644 index 000000000..8cbf1d8e4 --- /dev/null +++ b/webapp-net/DDWebApp/Models/PublicationSiteMap.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Sdl.Web.Common.Models; + +namespace Sdl.Web.Modules.DDWebApp.Models +{ + public class PublicationSiteMap : EntityModel + { + public int PublicationId { get; set; } + + public int NamespaceId { get; set; } + + public List Urls { get; set; } = new List(); + } +} diff --git a/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs b/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs new file mode 100644 index 000000000..e937112d1 --- /dev/null +++ b/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs @@ -0,0 +1,10 @@ +using System; + +namespace Sdl.Web.Modules.DDWebApp.Models +{ + public class SiteMapUrlEntry + { + public string Url { get; set; } + public DateTime LastModifiedDate { get; set; } + } +} diff --git a/webapp-net/DDWebApp/Models/Topic.cs b/webapp-net/DDWebApp/Models/Topic.cs new file mode 100644 index 000000000..0b054f206 --- /dev/null +++ b/webapp-net/DDWebApp/Models/Topic.cs @@ -0,0 +1,22 @@ +using System; +using Newtonsoft.Json; +using Sdl.Web.Common.Models; + +namespace Sdl.Web.Modules.DDWebApp.Models +{ + /// + /// Topic Entity + /// + [SemanticEntity(Vocab = SchemaOrgVocabulary, EntityName = "Topic", Prefix = "s", Public = true)] + [Serializable] + public class Topic : EntityModel + { + [SemanticProperty("topicBody")] + [JsonProperty(PropertyName = "topicBody")] + public RichText TopicBody { get; set; } + + [SemanticProperty("topicTitle")] + [JsonProperty(PropertyName = "topicTitle")] + public string TopicTitle { get; set; } + } +} diff --git a/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs b/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs new file mode 100644 index 000000000..e18266c1e --- /dev/null +++ b/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Newtonsoft.Json; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Models; +using Sdl.Web.Common.Models.Navigation; +using Sdl.Web.Modules.DDWebApp.Models; +using Sdl.Web.Tridion.ContentManager; +using Tridion.ContentDelivery.Meta; +using Tridion.ContentDelivery.Taxonomies; + +namespace Sdl.Web.Modules.DDWebApp.Navigation +{ + public class IshNavigationProvider : Tridion.Navigation.CILImpl.DynamicNavigationProvider + { + public string GetBaseUrl() + { + var request = HttpContext.Current.Request; + var appUrl = HttpRuntime.AppDomainAppVirtualPath; + + if (appUrl != "/") + appUrl = "/" + appUrl; + + var baseUrl = $"{request.Url.Scheme}://{request.Url.Authority}{appUrl}"; + + return baseUrl; + } + + protected override TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLevels, NavigationFilter filter, ILocalization localization) + { + TaxonomyNode node = base.CreateTaxonomyNode(keyword, expandLevels, filter, localization); + string ishRefUri = (string)keyword.KeywordMeta.GetFirstValue("ish.ref.uri"); + if (ishRefUri != null) + { + var ish = CmUri.FromString(ishRefUri); + node.Url = $"{GetBaseUrl()}/{ish.PublicationId}/{ish.ItemId}"; + } + return node; + } + + public SitemapItem SiteMap + { + get + { + SitemapItem root = new SitemapItem(); + PublicationMetaFactory factory = new PublicationMetaFactory(); + string json = factory.GetSiteMapForPublication(-1); + List siteMap = JsonConvert.DeserializeObject>(json); + foreach (var url in siteMap.SelectMany(x => x.Urls)) + { + root.Items.Add(new SitemapItem {Type = "Page", Url = $"/{url.Url.TrimStart('/')}", PublishedDate = url.LastModifiedDate}); + } + return root; + } + } + } +} diff --git a/webapp-net/DDWebApp/Properties/AssemblyInfo.cs b/webapp-net/DDWebApp/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..8d767c18b --- /dev/null +++ b/webapp-net/DDWebApp/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Reflection; + +[assembly: AssemblyTitle("SDL DXA DD Web App Module")] + +// NOTE: Common Assembly Info is generated by the build in CommonAssemblyInfo.cs diff --git a/webapp-net/DDWebApp/Providers/ConditionProvider.cs b/webapp-net/DDWebApp/Providers/ConditionProvider.cs new file mode 100644 index 000000000..6a30af669 --- /dev/null +++ b/webapp-net/DDWebApp/Providers/ConditionProvider.cs @@ -0,0 +1,39 @@ +using Sdl.Web.Common; +using Tridion.ContentDelivery.Meta; + +namespace Sdl.Web.Modules.DDWebApp.Providers +{ + /// + /// Condition Provider + /// + public class ConditionProvider + { + private static readonly string CONDITION_USED = "conditionsused.generated.value"; + private static readonly string CONDITION_METADATA = "conditionmetadata.generated.value"; + private static readonly string CONDITION_VALUES = "values"; + + public string GetConditions(int publicationId) + { + // TODO + var conditionUsed = GetMetadata(publicationId, CONDITION_USED); + var conditionMetadata = GetMetadata(publicationId, CONDITION_METADATA); + + return ""; + } + + private string GetMetadata(int publicationId, string metadataName) + { + PublicationMetaFactory factory = new PublicationMetaFactory(); + PublicationMeta meta = factory.GetMeta(publicationId); + if (meta?.CustomMeta == null) + { + throw new DxaItemNotFoundException( + $"Metadata '{metadataName}' is not found for publication {publicationId}."); + } + + object metadata = meta.CustomMeta.GetFirstValue(metadataName); + string metadataString = metadata != null ? (string)metadata : "{}"; + return metadataString; + } + } +} diff --git a/webapp-net/DDWebApp/Providers/IshContentProvider.cs b/webapp-net/DDWebApp/Providers/IshContentProvider.cs new file mode 100644 index 000000000..0c4233acc --- /dev/null +++ b/webapp-net/DDWebApp/Providers/IshContentProvider.cs @@ -0,0 +1,73 @@ +using System; +using Sdl.Web.Common; +using Sdl.Web.Modules.DDWebApp.Exceptions; +using Sdl.Web.Tridion.Mapping; +using Tridion.ContentDelivery.DynamicContent.Query; +using Tridion.ContentDelivery.Meta; +using Sdl.Web.Tridion.ContentManager; + +namespace Sdl.Web.Modules.DDWebApp.Providers +{ + /// + /// Ish Content Provider + /// + public class IshContentProvider : DefaultContentProvider + { + private static readonly string RefFieldName = "ishlogicalref.object.id"; + private static readonly string DefaultPublishData = "1900-01-01 00:00:00.000"; + + public class ItemImpl : IItem + { + public void Dispose() + { + } + + public Category[] GetCategories() + { + return null; + } + + public int Id { get; } + public string Title { get; } + public int MinorVersion { get; } + public int MajorVersion { get; } + public DateTime ModificationDate { get; } + public DateTime InitialPublicationDate { get; } + public DateTime LastPublicationDate { get; } + public DateTime CreationDate { get; } + public int PublicationId { get; } + public int OwningPublicationId { get; } + } + + public IItem GetPageIdByIshLogicalReference(int publicationId, string ishLogicalRefValue) + { + try + { + Criteria dateCriteria = new ItemLastPublishedDateCriteria(DefaultPublishData, Criteria.GreaterThanOrEqual); + CustomMetaKeyCriteria metaKeyCriteria = new CustomMetaKeyCriteria(RefFieldName); + Criteria refCriteria = new CustomMetaValueCriteria(metaKeyCriteria, ishLogicalRefValue); + Criteria pubCriteria = new PublicationCriteria(publicationId); + Criteria itemType = new ItemTypeCriteria((int)ItemType.Page); + Criteria composite = new AndCriteria(new Criteria[] { dateCriteria, refCriteria, itemType, pubCriteria}); + + global::Tridion.ContentDelivery.DynamicContent.Query.Query query = new global::Tridion.ContentDelivery.DynamicContent.Query.Query(composite); + IItem[] items = query.ExecuteEntityQuery(); + if (items == null || items.Length == 0) + { + return new ItemImpl(); + } + + if (items.Length > 1) + { + throw new IshApiException($"Too many page Ids found in publication with logical ref value {ishLogicalRefValue}"); + } + + return items[0]; + } + catch (Exception) + { + throw new DxaItemNotFoundException($"Page reference by ishlogicalref.object.id = {ishLogicalRefValue} not found in publication {publicationId}."); + } + } + } +} diff --git a/webapp-net/DDWebApp/Providers/PublicationProvider.cs b/webapp-net/DDWebApp/Providers/PublicationProvider.cs new file mode 100644 index 000000000..a7c42435d --- /dev/null +++ b/webapp-net/DDWebApp/Providers/PublicationProvider.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Sdl.Web.Common; +using Sdl.Web.Common.Logging; +using Sdl.Web.Modules.DDWebApp.Models; +using Tridion.ContentDelivery.Meta; +using Sdl.Web.Modules.DDWebApp.Exceptions; + +namespace Sdl.Web.Modules.DDWebApp.Providers +{ + /// + /// Publication Provider + /// + public class PublicationProvider + { + private static readonly string PublicationTitleMeta = "publicationtitle.generated.value"; + private static readonly string PublicationProductfamilynameMeta = "FISHPRODUCTFAMILYNAME.logical.value"; + private static readonly string PublicationProductreleasenameMeta = "FISHPRODUCTRELEASENAME.version.value"; + private static readonly string PublicationVersionrefMeta = "ishversionref.object.id"; + private static readonly string PublicationLangMeta = "FISHPUBLNGCOMBINATION.lng.value"; + private static readonly string PublicationOnlineStatusMeta = "FISHDITADLVRREMOTESTATUS.lng.element"; + private static readonly string PublicationOnlineValue = "VDITADLVRREMOTESTATUSONLINE"; + private static readonly string PublicationCratedonMeta = "CREATED-ON.version.value"; + private static readonly string PublicationVersionMeta = "VERSION.version.value"; + private static readonly string PublicationLogicalId = "ishref.object.value"; + + public List PublicationList + { + get + { + PublicationMetaFactory factory = new PublicationMetaFactory(); + List result = new List(); + try + { + PublicationMeta[] publicationMetas = factory.GetAllMeta(new List + { + PublicationTitleMeta, + PublicationProductfamilynameMeta, + PublicationProductreleasenameMeta, + PublicationVersionrefMeta, + PublicationLangMeta, + PublicationOnlineStatusMeta, + PublicationCratedonMeta, + PublicationVersionMeta, + PublicationLogicalId + }); + + result.AddRange(from meta in publicationMetas where IsPublicationOnline(meta) select BuildPublicationFrom(meta)); + return result; + } + catch (Exception e) + { + throw new IshApiException("Unable to fetch list of publications.", e); + } + } + } + + public void CheckPublicationOnline(int publicationId) + { + PublicationMeta meta = null; + PublicationMetaFactory factory = new PublicationMetaFactory(); + try + { + meta = factory.GetMeta(publicationId); + } + catch (Exception) + { + Log.Error("Couldn't find publication metadata for id: " + publicationId); + } + if (meta == null || !IsPublicationOnline(meta)) + { + throw new DxaItemNotFoundException($"Unable to find publication {publicationId}"); + } + } + + public bool IsPublicationOnline(PublicationMeta publicationMeta) + { + var customMeta = publicationMeta.CustomMeta; + if (customMeta == null) return false; + var status = customMeta.GetFirstValue(PublicationOnlineStatusMeta); + return status != null && PublicationOnlineValue.Equals(status.ToString()); + } + + private Publication BuildPublicationFrom(PublicationMeta publicationMeta) + { + Publication publication = new Publication(); + publication.Id = publicationMeta.Id.ToString(); + var customMeta = publicationMeta.CustomMeta; + if (customMeta == null) return publication; + if (customMeta.GetFirstValue(PublicationTitleMeta) != null) + { + publication.Title = (string)customMeta.GetFirstValue(PublicationTitleMeta); + } + else + { + publication.Title = publicationMeta.Title; + } + + if (customMeta.GetFirstValue(PublicationProductfamilynameMeta) != null) + { + // Take the generated product family name from the metadata + NameValuePair pair = (NameValuePair)customMeta.NameValues[PublicationProductfamilynameMeta]; + publication.ProductFamily = new List(); + foreach (var value in pair.MultipleValues) + { + publication.ProductFamily.Add(value?.ToString()); + } + } + + if (customMeta.GetFirstValue(PublicationProductreleasenameMeta) != null) + { + // Take the generated product release name from the metadata + NameValuePair pair = (NameValuePair)customMeta.NameValues[PublicationProductreleasenameMeta]; + publication.ProductReleaseVersion = new List(); + foreach (var value in pair.MultipleValues) + { + publication.ProductReleaseVersion.Add(value?.ToString()); + } + } + + if (customMeta.GetFirstValue(PublicationVersionrefMeta) != null) + { + string versionRef = (string)customMeta.GetFirstValue(PublicationVersionrefMeta); + // The value is stored as float on Content Service, so we need to get rid of fractional part + publication.VersionRef = versionRef.Split('\"', '[', '.', ']')[0]; + } + + if (customMeta.GetFirstValue(PublicationLangMeta) != null) + { + publication.Language = (string)customMeta.GetFirstValue(PublicationLangMeta); + } + + if (customMeta.GetFirstValue(PublicationCratedonMeta) != null) + { + publication.CreatedOn = DateTime.Parse((string)customMeta.GetFirstValue(PublicationCratedonMeta)); + } + + if (customMeta.GetFirstValue(PublicationVersionMeta) != null) + { + publication.Version = (string)customMeta.GetFirstValue(PublicationVersionMeta); + } + + if (customMeta.GetFirstValue(PublicationLogicalId) != null) + { + publication.LogicalId = (string)customMeta.GetFirstValue(PublicationLogicalId); + } + return publication; + } + } +} diff --git a/webapp-net/DDWebApp/Providers/TocProvider.cs b/webapp-net/DDWebApp/Providers/TocProvider.cs new file mode 100644 index 000000000..9c16786d1 --- /dev/null +++ b/webapp-net/DDWebApp/Providers/TocProvider.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Models; +using Sdl.Web.Common.Models.Navigation; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.DDWebApp.Providers +{ + /// + /// Table of Contents (TOC) Provider + /// + public class TocProvider + { + public IEnumerable GetToc(int publicationId) + => GetToc(publicationId, null, false, 1); + + public IEnumerable GetToc(int publicationId, string sitemapItemId) + => GetToc(publicationId, sitemapItemId, false, 1); + + public IEnumerable GetToc(int publicationId, string sitemapItemId, bool includeAncestors) + => GetToc(publicationId, sitemapItemId, includeAncestors, 1); + + public IEnumerable GetToc(int publicationId, string sitemapItemId, bool includeAncestors, + int descendantLevels) + { + IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; + NavigationFilter navigationFilter = new NavigationFilter + { + DescendantLevels = descendantLevels, + IncludeAncestors = includeAncestors + }; + + ILocalization localization = WebRequestContext.Localization; + localization.Id = publicationId.ToString(); + + return onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization); + } + } +} diff --git a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj new file mode 100644 index 000000000..1bc58bb95 --- /dev/null +++ b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj @@ -0,0 +1,116 @@ + + + + + Debug + AnyCPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5} + Library + Properties + Sdl.Web.Modules.DDWebApp + Sdl.Web.Modules.DDWebApp + v4.5.2 + 512 + 2.1.0-beta-201803191811 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + True + + + ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll + True + + + False + ..\..\..\web-application\Sdl.Web.Common\bin\Debug\Sdl.Web.Common.dll + + + False + ..\..\..\web-application\Sdl.Web.Mvc\bin\Debug\Sdl.Web.Mvc.dll + + + False + ..\..\..\web-application\Sdl.Web.Tridion\bin\Debug\Sdl.Web.Tridion.dll + + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll + True + + + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + True + + + + + + + + + ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Tridion.ContentDelivery.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp-net/DDWebApp/packages.config b/webapp-net/DDWebApp/packages.config new file mode 100644 index 000000000..d26d5f5aa --- /dev/null +++ b/webapp-net/DDWebApp/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/webapp-net/DxaModules.sln b/webapp-net/DxaModules.sln index fe81fc341..e4d52e7fc 100644 --- a/webapp-net/DxaModules.sln +++ b/webapp-net/DxaModules.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Search", "Search\Sdl.Web.Modules.Search.csproj", "{8FEFFF4C-0AE2-452F-89B1-36F7D2944032}" EndProject @@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Core", "Cor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.AudienceManager", "AudienceManager\Sdl.Web.Modules.AudienceManager.csproj", "{83EC18A4-831F-4939-9912-D8A93FA3998D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.DDWebApp", "DDWebApp\Sdl.Web.Modules.DDWebApp.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -86,6 +88,10 @@ Global {83EC18A4-831F-4939-9912-D8A93FA3998D}.Debug|Any CPU.Build.0 = Debug|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.ActiveCfg = Release|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.Build.0 = Release|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 0ec56650e993315343d523a4e2eb7238e16e232c Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 23 Mar 2018 15:14:29 +0000 Subject: [PATCH 04/78] TSI-3129 : Updated refs to latest framework --- .../DDWebApp/Sdl.Web.Modules.DDWebApp.csproj | 14 +++++++------- webapp-net/DDWebApp/packages.config | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj index 1bc58bb95..19ebd23f0 100644 --- a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj +++ b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj @@ -11,7 +11,7 @@ Sdl.Web.Modules.DDWebApp v4.5.2 512 - 2.1.0-beta-201803191811 + 2.1.0-beta-201803231551 true @@ -39,17 +39,17 @@ ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll True - + False - ..\..\..\web-application\Sdl.Web.Common\bin\Debug\Sdl.Web.Common.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll - + False - ..\..\..\web-application\Sdl.Web.Mvc\bin\Debug\Sdl.Web.Mvc.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll - + False - ..\..\..\web-application\Sdl.Web.Tridion\bin\Debug\Sdl.Web.Tridion.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Tridion.dll diff --git a/webapp-net/DDWebApp/packages.config b/webapp-net/DDWebApp/packages.config index d26d5f5aa..e928e7ece 100644 --- a/webapp-net/DDWebApp/packages.config +++ b/webapp-net/DDWebApp/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file From 2c22787afb69333ad7fe1583be513518fd061dca Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 23 Mar 2018 15:49:42 +0000 Subject: [PATCH 05/78] TSI-3129 : Added conditions --- .../DDWebApp/Controllers/IshApiController.cs | 14 +++++++++++--- .../DDWebApp/Providers/ConditionProvider.cs | 15 ++++++++++++--- .../DDWebApp/Sdl.Web.Modules.DDWebApp.csproj | 4 ++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/webapp-net/DDWebApp/Controllers/IshApiController.cs b/webapp-net/DDWebApp/Controllers/IshApiController.cs index a155f0c2a..9d33d686a 100644 --- a/webapp-net/DDWebApp/Controllers/IshApiController.cs +++ b/webapp-net/DDWebApp/Controllers/IshApiController.cs @@ -1,6 +1,8 @@ -using System.Web.Mvc; +using System; +using System.Web.Mvc; using Sdl.Web.Common; using Sdl.Web.Common.Models; +using Sdl.Web.Delivery.ServicesCore.ClaimStore; using Sdl.Web.Modules.DDWebApp.Providers; using Sdl.Web.Mvc.Formats; @@ -11,12 +13,18 @@ namespace Sdl.Web.Modules.DDWebApp.Controllers /// public class IshApiController : BaseController { + private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); + [Route("~/api/page/{publicationId:int}/{pageId:int}")] [Route("~/api/page/{publicationId:int}/{pageId:int}/{*path}")] [HttpGet] [FormatData] public virtual ActionResult Page(int publicationId, int pageId, string path, string conditions = "") { + if (!string.IsNullOrEmpty(conditions)) + { + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + } PageModel pageModel = IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); return Json(pageModel); //return Content(JsonConvert.SerializeObject(pageModel), "application/json"); @@ -59,7 +67,7 @@ public virtual ActionResult RootToc(int publicationId, string conditions = "") SetupLocalization(publicationId); if (!string.IsNullOrEmpty(conditions)) { - // todo: add claim URI.create("taf:ish:userconditions") with value 'conditions' + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } TocProvider tocProvider = new TocProvider(); return Json(tocProvider.GetToc(publicationId)); @@ -71,7 +79,7 @@ public virtual ActionResult Toc(int publicationId, string sitemapItemId, string SetupLocalization(publicationId); if (!string.IsNullOrEmpty(conditions)) { - // todo: add claim URI.create("taf:ish:userconditions") with value 'conditions' + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } TocProvider tocProvider = new TocProvider(); var sitemapItems = tocProvider.GetToc(publicationId, sitemapItemId, includeAncestors); diff --git a/webapp-net/DDWebApp/Providers/ConditionProvider.cs b/webapp-net/DDWebApp/Providers/ConditionProvider.cs index 6a30af669..25ed773df 100644 --- a/webapp-net/DDWebApp/Providers/ConditionProvider.cs +++ b/webapp-net/DDWebApp/Providers/ConditionProvider.cs @@ -1,4 +1,5 @@ -using Sdl.Web.Common; +using Newtonsoft.Json.Linq; +using Sdl.Web.Common; using Tridion.ContentDelivery.Meta; namespace Sdl.Web.Modules.DDWebApp.Providers @@ -14,11 +15,19 @@ public class ConditionProvider public string GetConditions(int publicationId) { - // TODO var conditionUsed = GetMetadata(publicationId, CONDITION_USED); var conditionMetadata = GetMetadata(publicationId, CONDITION_METADATA); - return ""; + JObject o1 = JObject.Parse(conditionUsed); + JObject o2 = JObject.Parse(conditionMetadata); + + o1.Merge(o2, new JsonMergeSettings + { + // union array values together to avoid duplicates + MergeArrayHandling = MergeArrayHandling.Union + }); + + return o1.ToString(); } private string GetMetadata(int publicationId, string metadataName) diff --git a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj index 19ebd23f0..fa7ccb378 100644 --- a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj +++ b/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj @@ -43,6 +43,10 @@ False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll + + False + ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Sdl.Web.Delivery.ServicesCore.dll + False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll From 8ecfc8ba345adef98d0bc792d44d462c1bedfb9d Mon Sep 17 00:00:00 2001 From: Alexey Zarakovskiy Date: Tue, 27 Mar 2018 16:02:17 +0200 Subject: [PATCH 06/78] TSI-3145 Moved SESSIOND ID initialization to DXA framework --- .../java/com/sdl/dxa/modules/cid/CidWebInitializer.java | 7 ++----- .../src/main/resources/dxa.modules.cid.properties | 3 ++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/webapp-java/dxa-module-cid/src/main/java/com/sdl/dxa/modules/cid/CidWebInitializer.java b/webapp-java/dxa-module-cid/src/main/java/com/sdl/dxa/modules/cid/CidWebInitializer.java index 6cc7d2afd..767711d94 100644 --- a/webapp-java/dxa-module-cid/src/main/java/com/sdl/dxa/modules/cid/CidWebInitializer.java +++ b/webapp-java/dxa-module-cid/src/main/java/com/sdl/dxa/modules/cid/CidWebInitializer.java @@ -7,13 +7,12 @@ import javax.servlet.Filter; import javax.servlet.Servlet; import javax.servlet.ServletContext; -import javax.servlet.ServletException; import java.util.Properties; @Slf4j public class CidWebInitializer implements WebApplicationInitializer { @Override - public void onStartup(ServletContext servletContext) throws ServletException { + public void onStartup(ServletContext servletContext) { log.debug("Trying to initialize servlet for CID module"); Properties properties = InitializationUtils.loadDxaProperties(); @@ -34,8 +33,6 @@ public void onStartup(ServletContext servletContext) throws ServletException { log.warn("Class {} for CID module is expected to be either Filter of Servlet but is", className); } - String sessionIdName = InitializationUtils.loadDxaProperties().getProperty("dxa.modules.cid.sessionid.name"); - servletContext.getSessionCookieConfig().setName(sessionIdName); - log.info("Set default SESSIONID to {}", sessionIdName); + // session id rename has moved to DXA Web Initialization } } diff --git a/webapp-java/dxa-module-cid/src/main/resources/dxa.modules.cid.properties b/webapp-java/dxa-module-cid/src/main/resources/dxa.modules.cid.properties index 8d6b1b5bf..9d01fbcc1 100644 --- a/webapp-java/dxa-module-cid/src/main/resources/dxa.modules.cid.properties +++ b/webapp-java/dxa-module-cid/src/main/resources/dxa.modules.cid.properties @@ -1,4 +1,5 @@ dxa.modules.cid.mapping=/cid/* -dxa.modules.cid.sessionid.name=DXA-SESSIONID +# need to rename it in DXA because of CID bug +dxa.web.sessionid.name=DXA-SESSIONID #dxa.modules.cid.className=should be configured it in dxa.properties file because if version-specific #dxa.modules.cid.appHostMapping=external path to the server which runs DXA for back-mapping for CID Service \ No newline at end of file From 3ec30a30d458c7416b4b1ae7a2e554feb831d8cf Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 29 Mar 2018 16:48:07 +0100 Subject: [PATCH 07/78] TSI-3068 : Initial Ugc Module --- .../Areas/Ugc/Views/Ugc/UgcCommentList.cshtml | 13 ++ .../Ugc/Views/Ugc/UgcPostCommentForm.cshtml | 33 +++++ webapp-net/Ugc/Areas/Ugc/Views/web.config | 37 ++++++ .../Ugc/Controllers/UgcApiController.cs | 76 +++++++++++ webapp-net/Ugc/Controllers/UgcController.cs | 30 +++++ webapp-net/Ugc/Data/Comment.cs | 18 +++ webapp-net/Ugc/Data/PostedComment.cs | 30 +++++ webapp-net/Ugc/Data/User.cs | 10 ++ webapp-net/Ugc/Models/UgcCommentList.cs | 15 +++ webapp-net/Ugc/Models/UgcPostCommentForm.cs | 68 ++++++++++ webapp-net/Ugc/Properties/AssemblyInfo.cs | 5 + webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 120 ++++++++++++++++++ webapp-net/Ugc/UgcAreaRegistration.cs | 18 +++ webapp-net/Ugc/UgcService.cs | 88 +++++++++++++ webapp-net/Ugc/packages.config | 10 ++ 15 files changed, 571 insertions(+) create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/web.config create mode 100644 webapp-net/Ugc/Controllers/UgcApiController.cs create mode 100644 webapp-net/Ugc/Controllers/UgcController.cs create mode 100644 webapp-net/Ugc/Data/Comment.cs create mode 100644 webapp-net/Ugc/Data/PostedComment.cs create mode 100644 webapp-net/Ugc/Data/User.cs create mode 100644 webapp-net/Ugc/Models/UgcCommentList.cs create mode 100644 webapp-net/Ugc/Models/UgcPostCommentForm.cs create mode 100644 webapp-net/Ugc/Properties/AssemblyInfo.cs create mode 100644 webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj create mode 100644 webapp-net/Ugc/UgcAreaRegistration.cs create mode 100644 webapp-net/Ugc/UgcService.cs create mode 100644 webapp-net/Ugc/packages.config diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml new file mode 100644 index 000000000..b4e990038 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml @@ -0,0 +1,13 @@ +@using Sdl.Web.Mvc.Html +@model Sdl.Web.Modules.Ugc.Models.UgcCommentList +
+ Showing @Model.Comments.Count comments +
+ @foreach(var comment in Model.Comments) + { +

@comment.User.Name

+ +

@comment.Content

+ } +
+
\ No newline at end of file diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml new file mode 100644 index 000000000..025a4dd9f --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml @@ -0,0 +1,33 @@ +@model UgcPostCommentForm + +
+

Model.Heading)>@Model.Heading

+ + @using (Html.BeginForm()) + { + if (!WebRequestContext.IsPreview) + { + @* If we put in an Anti Forgery Token, the Page can't be edited in XPM anymore *@ + @Html.AntiForgeryToken() + } + if (!Html.ViewData.ModelState.IsValid) + { +
+ @Html.ValidationSummary(excludePropertyErrors: false) +
+ } +
+ @Html.TextBoxFor(m => m.UserName, new {@class = "form-control", placeholder = @Model.UserNameLabel}) +
+
+ @Html.PasswordFor(m => m.EmailAddress, new {@class = "form-control", placeholder = @Model.EmailAddressLabel}) +
+
+ @Html.TextBoxFor(m => m.Content, new {@class = "form-control", placeholder = @Model.ContentLabel}) +
+
+ +
+ } +
+ diff --git a/webapp-net/Ugc/Areas/Ugc/Views/web.config b/webapp-net/Ugc/Areas/Ugc/Views/web.config new file mode 100644 index 000000000..5c5324b79 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/web.config @@ -0,0 +1,37 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs new file mode 100644 index 000000000..e39ac94c0 --- /dev/null +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using Sdl.Web.Mvc.Controllers; +using System.IO; +using System.Web.Mvc; +using Newtonsoft.Json; +using Sdl.Web.Modules.Ugc.Data; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.Ugc.Controllers +{ + /// + /// Ugc Api Controller + /// + public class UgcApiController : BaseController + { + [Route("{localization}/api/comments/{pageId:int}")] + [Route("~/api/comments/{publicationId:int}/{pageId:int}")] + [HttpGet] + public ActionResult GetComments(int? publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) + { + UgcService ugc = new UgcService(); + return Json(ugc.GetComments( + publicationId ?? int.Parse(WebRequestContext.Localization.Id), + pageId, descending, status ?? new int[] {}, top, skip)); + } + + [Route("~/api/comments/add")] + [Route("{localization}/api/comments/add")] + [HttpPost] + public ActionResult PostComment(int publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) + { + UgcService ugc = new UgcService(); + + Stream req = Request.InputStream; + req.Seek(0, System.IO.SeekOrigin.Begin); + string json = new StreamReader(req).ReadToEnd(); + + PostedComment posted = JsonConvert.DeserializeObject(json); + + + Dictionary metadata = new Dictionary(); + metadata.Add("publicationTitle", posted.PublicationTitle); + metadata.Add("publicationUrl", posted.PublicationUrl); + metadata.Add("itemTitle", posted.PageTitle); + metadata.Add("itemUrl", posted.PageUrl); + metadata.Add("language", posted.Language); + metadata.Add("status", "0"); + + // addPubIdTitleLangToCommentMetadata(input, metadata); + + Comment result = ugc.PostComment(posted.PublicationId, + posted.PageId, + posted.Username, + posted.Email, + posted.Content, + posted.ParentId, + metadata); + + return Json(result); + } + + private void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) + { + /* + PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); + pubIdTitleLang.setId(input.getPublicationId()); + pubIdTitleLang.setLang(input.getLanguage()); + pubIdTitleLang.setTitle(input.getPublicationTitle()); + + Gson gSon = new GsonBuilder().create(); + String pubIdTitleLangJson = gSon.toJson(pubIdTitleLang); + + metadata.Add("pubIdTitleLang", pubIdTitleLangJson);*/ + } + } +} diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs new file mode 100644 index 000000000..9cfc6ed5b --- /dev/null +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -0,0 +1,30 @@ +using System; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Mvc.Controllers; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Models; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.Ugc.Controllers +{ + /// + /// Ugc Controller + /// + public class UgcController : EntityController + { + protected override ViewModel EnrichModel(ViewModel sourceModel) + { + UgcService ugc = new UgcService(); + UgcCommentList model = base.EnrichModel(sourceModel) as UgcCommentList; + if(model == null) return sourceModel; + + // TODO: we should get page id + ILocalization localization = WebRequestContext.Localization; + model.Comments = ugc.GetComments(5960742, 5960654, false, new int[] {}, 0, 0); + + // model.Comments = ugc.GetComments(Int32.Parse(localization.Id), int.Parse(model.Id), false, new int[] { }, 0, 0); + + return model; + } + } +} diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs new file mode 100644 index 000000000..af75b533c --- /dev/null +++ b/webapp-net/Ugc/Data/Comment.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace Sdl.Web.Modules.Ugc.Data +{ + public class Comment + { + public long Id { get; set; } + public int ItemPublicationId { get; set; } + public int ItemId { get; set; } + public int ItemType { get; set; } + public DateTime CreationDate { get; set; } + public DateTime LastModifiedDate { get; set; } + public string Content { get; set; } + public User User { get; set; } + public List Children { get; set; } + } +} diff --git a/webapp-net/Ugc/Data/PostedComment.cs b/webapp-net/Ugc/Data/PostedComment.cs new file mode 100644 index 000000000..a15ca1694 --- /dev/null +++ b/webapp-net/Ugc/Data/PostedComment.cs @@ -0,0 +1,30 @@ +namespace Sdl.Web.Modules.Ugc.Data +{ + /// + /// Posted Comment + /// + public class PostedComment + { + public int PublicationId { get; set; } + + public int PageId { get; set; } + + public string Username { get; set; } + + public string Email { get; set; } + + public string Content { get; set; } + + public int ParentId { get; set; } = 0; + + public string PublicationTitle { get; set; } + + public string PublicationUrl { get; set; } + + public string PageTitle { get; set; } + + public string PageUrl { get; set; } + + public string Language { get; set; } + } +} diff --git a/webapp-net/Ugc/Data/User.cs b/webapp-net/Ugc/Data/User.cs new file mode 100644 index 000000000..c5bbdc193 --- /dev/null +++ b/webapp-net/Ugc/Data/User.cs @@ -0,0 +1,10 @@ +namespace Sdl.Web.Modules.Ugc.Data +{ + public class User + { + public string Id { get; set; } + public string Name { get; set; } + public string EmailAddress { get; set; } + public string ExternalId { get; set; } + } +} diff --git a/webapp-net/Ugc/Models/UgcCommentList.cs b/webapp-net/Ugc/Models/UgcCommentList.cs new file mode 100644 index 000000000..0453d3ad1 --- /dev/null +++ b/webapp-net/Ugc/Models/UgcCommentList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Data; + +namespace Sdl.Web.Modules.Ugc.Models +{ + [SemanticEntity("UgcCommentList")] + public class UgcCommentList : EntityModel + { + [SemanticProperty("headline")] + public string Headline { get; set; } + + public List Comments { get; set; } + } +} diff --git a/webapp-net/Ugc/Models/UgcPostCommentForm.cs b/webapp-net/Ugc/Models/UgcPostCommentForm.cs new file mode 100644 index 000000000..6d341f473 --- /dev/null +++ b/webapp-net/Ugc/Models/UgcPostCommentForm.cs @@ -0,0 +1,68 @@ +using System; +using Sdl.Web.Common; +using Sdl.Web.Common.Models; +using System.ComponentModel.DataAnnotations; + +namespace Sdl.Web.Modules.Ugc.Models +{ + [Serializable] + [DxaNoOutputCache] + public class UgcPostCommentForm : EntityModel + { + /// + /// Holds the form control value for username + /// + [Required(ErrorMessage = "@Model.NoUserNameMessage")] + [SemanticProperty(IgnoreMapping = true)] + public string UserName { get; set; } + + /// + /// Holds the form control value for email address + /// + [Required(ErrorMessage = "@Model.NoEmailAddressMessage")] + [SemanticProperty(IgnoreMapping = true)] + public string EmailAddress { get; set; } + + /// + /// Holds the form control value for email address + /// + [Required(ErrorMessage = "@Model.NoContentMessage")] + [SemanticProperty(IgnoreMapping = true)] + public string Content { get; set; } + + /// + /// Label text for username input control on view + /// + public string UserNameLabel { get; set; } + + /// + /// Label text for email address input control on view + /// + public string EmailAddressLabel { get; set; } + + /// + /// Label text for content input control on view + /// + public string ContentLabel { get; set; } + + /// + /// Label text for submit botton on view + /// + public string SubmitButtonLabel { get; set; } + + /// + /// User name not specified message + /// + public string NoUserNameMessage { get; set; } + + /// + /// Email not specified message + /// + public string NoEmailAddressMessage { get; set; } + + /// + /// Content not specified message + /// + public string NoContentMessage { get; set; } + } +} diff --git a/webapp-net/Ugc/Properties/AssemblyInfo.cs b/webapp-net/Ugc/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..aa7156741 --- /dev/null +++ b/webapp-net/Ugc/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Reflection; + +[assembly: AssemblyTitle("SDL DXA Ugc Module")] + +// NOTE: Common Assembly Info is generated by the build in CommonAssemblyInfo.cs diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj new file mode 100644 index 000000000..74a203ef8 --- /dev/null +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -0,0 +1,120 @@ + + + + + Debug + AnyCPU + {54DDEEE6-1F97-4E53-8018-5918F7D90A8B} + Library + Properties + Sdl.Web.Modules.Ugc + Sdl.Web.Modules.Ugc + v4.5.2 + true + 512 + 2.1.0-beta-201803281441 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll + + + False + ..\packages\Sdl.Dxa.Framework.Web8.2.1.0-beta-201803281441\lib\net452\Sdl.Web.Common.dll + + + False + ..\packages\Sdl.Dxa.Framework.Web8.2.1.0-beta-201803281441\lib\net452\Sdl.Web.DataModel.dll + + + False + ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Sdl.Web.Delivery.UGC.dll + + + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll + + + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Tridion.dll + + + False + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + $(CopyLocal) + + + False + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + $(CopyLocal) + + + False + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + $(CopyLocal) + + + False + ..\packages\Microsoft.AspNet.WebPages.Data.3.2.3\lib\net45\WebMatrix.Data.dll + + + False + ..\packages\Microsoft.AspNet.WebPages.WebData.3.2.3\lib\net45\WebMatrix.WebData.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + + + \ No newline at end of file diff --git a/webapp-net/Ugc/UgcAreaRegistration.cs b/webapp-net/Ugc/UgcAreaRegistration.cs new file mode 100644 index 000000000..b290157a3 --- /dev/null +++ b/webapp-net/Ugc/UgcAreaRegistration.cs @@ -0,0 +1,18 @@ +using Sdl.Web.Modules.Ugc.Models; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.Ugc +{ + public class UgcAreaRegistration : BaseAreaRegistration + { + public override string AreaName => "Ugc"; + + protected override void RegisterAllViewModels() + { + // Entity Views + RegisterViewModel("UgcCommentList", typeof(UgcCommentList), "Ugc"); + + RegisterViewModel("UgcPostCommentForm", typeof(UgcPostCommentForm), "Ugc"); + } + } +} diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs new file mode 100644 index 000000000..7504bf860 --- /dev/null +++ b/webapp-net/Ugc/UgcService.cs @@ -0,0 +1,88 @@ +using Sdl.Web.Tridion.ContentManager; +using System.Collections.Generic; +using System.Linq; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Delivery.UGC; +using Sdl.Web.Delivery.UGC.Model; +using Sdl.Web.Modules.Ugc.Data; +using Sdl.Web.Mvc.Configuration; + +namespace Sdl.Web.Modules.Ugc +{ + /// + /// Ugc Service + /// + public class UgcService + { + private static readonly int MaximumThreadsDepth = -1; + private readonly IUgcCommentsApi _api; + + public UgcService() + { + _api = UgcInstanceProvider.Instance.UgcCommunityClient(); + } + + public List GetComments(int publicationId, int pageId, bool descending, int[] status, int top, int skip) + { + SimpleCommentsFilter filter = new SimpleCommentsFilter + { + Top = top, + Skip = skip, + Depth = MaximumThreadsDepth, + Statuses = new List(new List(status).Select(x => (Status)x)) + }; + return Convert(_api.RetrieveFlatComments(CreateUri(publicationId, pageId), filter, descending, false)); + } + + public Comment PostComment(int publicationId, int pageId, string username, string email, string content, + int parentId, Dictionary metadata) + => Convert(_api.PostComment(CreateUri(publicationId, pageId), username, email, content, parentId, metadata).Result); + + private static CmUri CreateUri(int publicationId, int pageId) + { + ILocalization localization = WebRequestContext.Localization; + return CmUri.Create(localization.CmUriScheme, publicationId, pageId, ItemType.Page); + } + + private static List Convert(IEnumerable comments) + => comments?.Select(Convert).ToList(); + + private static Comment Convert(IComment comment) + { + Comment c = new Comment + { + Id = comment.Id, + ItemId = comment.ItemId, + ItemType = comment.ItemType, + ItemPublicationId = comment.ItemPublicationId, + Content = comment.Content + }; + + if (comment.User != null) + { + c.User = Convert(comment.User); + } + + if (comment.CreationDate.HasValue) + { + c.CreationDate = comment.CreationDate.Value; + } + + if (comment.LastModifiedDate.HasValue) + { + c.LastModifiedDate = comment.LastModifiedDate.Value; + } + + c.Children = Convert(comment.Children); + return c; + } + + private static User Convert(IUser user) => new User + { + Id = user.Id, + ExternalId = user.ExternalId, + Name = user.Name, + EmailAddress = user.EmailAddress, + }; + } +} diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config new file mode 100644 index 000000000..b980bf24f --- /dev/null +++ b/webapp-net/Ugc/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 3a15677597f54292f9c2fe4c5f1f436730f72164 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 29 Mar 2018 16:49:51 +0100 Subject: [PATCH 08/78] TSI-3068 : Updated sln --- webapp-net/DxaModules.sln | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/webapp-net/DxaModules.sln b/webapp-net/DxaModules.sln index fe81fc341..c76d80e7d 100644 --- a/webapp-net/DxaModules.sln +++ b/webapp-net/DxaModules.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Search", "Search\Sdl.Web.Modules.Search.csproj", "{8FEFFF4C-0AE2-452F-89B1-36F7D2944032}" EndProject @@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Core", "Cor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.AudienceManager", "AudienceManager\Sdl.Web.Modules.AudienceManager.csproj", "{83EC18A4-831F-4939-9912-D8A93FA3998D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ugc", "Ugc\Sdl.Web.Modules.Ugc.csproj", "{54DDEEE6-1F97-4E53-8018-5918F7D90A8B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,53 +41,46 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {8FEFFF4C-0AE2-452F-89B1-36F7D2944032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FEFFF4C-0AE2-452F-89B1-36F7D2944032}.Debug|Any CPU.Build.0 = Debug|Any CPU {8FEFFF4C-0AE2-452F-89B1-36F7D2944032}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FEFFF4C-0AE2-452F-89B1-36F7D2944032}.Release|Any CPU.Build.0 = Release|Any CPU {3B09C55C-6D2B-4F7A-BD94-1B948023D3AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B09C55C-6D2B-4F7A-BD94-1B948023D3AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B09C55C-6D2B-4F7A-BD94-1B948023D3AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {3B09C55C-6D2B-4F7A-BD94-1B948023D3AD}.Release|Any CPU.Build.0 = Release|Any CPU {40A64979-0221-4D96-9055-F723D11CA703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40A64979-0221-4D96-9055-F723D11CA703}.Debug|Any CPU.Build.0 = Debug|Any CPU {40A64979-0221-4D96-9055-F723D11CA703}.Release|Any CPU.ActiveCfg = Release|Any CPU {40A64979-0221-4D96-9055-F723D11CA703}.Release|Any CPU.Build.0 = Release|Any CPU {709998A6-7E5F-4619-9D70-18A6AB6EB8FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {709998A6-7E5F-4619-9D70-18A6AB6EB8FF}.Debug|Any CPU.Build.0 = Debug|Any CPU {709998A6-7E5F-4619-9D70-18A6AB6EB8FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {709998A6-7E5F-4619-9D70-18A6AB6EB8FF}.Release|Any CPU.Build.0 = Release|Any CPU {492157DE-3114-48E5-9A23-965D5FE4DA74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {492157DE-3114-48E5-9A23-965D5FE4DA74}.Debug|Any CPU.Build.0 = Debug|Any CPU {492157DE-3114-48E5-9A23-965D5FE4DA74}.Release|Any CPU.ActiveCfg = Release|Any CPU {492157DE-3114-48E5-9A23-965D5FE4DA74}.Release|Any CPU.Build.0 = Release|Any CPU {4060565E-55F3-4C52-AF6F-6FC4868C27A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4060565E-55F3-4C52-AF6F-6FC4868C27A3}.Debug|Any CPU.Build.0 = Debug|Any CPU {4060565E-55F3-4C52-AF6F-6FC4868C27A3}.Release|Any CPU.ActiveCfg = Release|Any CPU {4060565E-55F3-4C52-AF6F-6FC4868C27A3}.Release|Any CPU.Build.0 = Release|Any CPU {490799B2-F577-4638-9644-8369BDBD56C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {490799B2-F577-4638-9644-8369BDBD56C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {490799B2-F577-4638-9644-8369BDBD56C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {490799B2-F577-4638-9644-8369BDBD56C4}.Release|Any CPU.Build.0 = Release|Any CPU {49273FF5-DF29-43E4-A667-A441A8A8057C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49273FF5-DF29-43E4-A667-A441A8A8057C}.Debug|Any CPU.Build.0 = Debug|Any CPU {49273FF5-DF29-43E4-A667-A441A8A8057C}.Release|Any CPU.ActiveCfg = Release|Any CPU {49273FF5-DF29-43E4-A667-A441A8A8057C}.Release|Any CPU.Build.0 = Release|Any CPU {38F7139B-5A93-4485-9BA6-83593F3D973D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38F7139B-5A93-4485-9BA6-83593F3D973D}.Debug|Any CPU.Build.0 = Debug|Any CPU {38F7139B-5A93-4485-9BA6-83593F3D973D}.Release|Any CPU.ActiveCfg = Release|Any CPU {38F7139B-5A93-4485-9BA6-83593F3D973D}.Release|Any CPU.Build.0 = Release|Any CPU {EAF4C682-E10E-4178-9131-1F7AF16287DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EAF4C682-E10E-4178-9131-1F7AF16287DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {EAF4C682-E10E-4178-9131-1F7AF16287DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {EAF4C682-E10E-4178-9131-1F7AF16287DB}.Release|Any CPU.Build.0 = Release|Any CPU {32943BD1-4891-4B03-AFCD-296658F61581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32943BD1-4891-4B03-AFCD-296658F61581}.Debug|Any CPU.Build.0 = Debug|Any CPU {32943BD1-4891-4B03-AFCD-296658F61581}.Release|Any CPU.ActiveCfg = Release|Any CPU {32943BD1-4891-4B03-AFCD-296658F61581}.Release|Any CPU.Build.0 = Release|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Debug|Any CPU.Build.0 = Debug|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.ActiveCfg = Release|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.Build.0 = Release|Any CPU + {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From ce8069b688be4e8691dd060420a20ddd8bb4e9d0 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 3 Apr 2018 11:58:38 +0100 Subject: [PATCH 09/78] TSI-3068 : Implemented post --- .../Ugc/Views/Ugc/UgcPostCommentForm.cshtml | 9 ++---- .../Ugc/Controllers/UgcApiController.cs | 17 ++++------- webapp-net/Ugc/Controllers/UgcController.cs | 30 +++++++++++++------ webapp-net/Ugc/Data/PubIdTitleLang.cs | 9 ++++++ webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 19 +++++++----- webapp-net/Ugc/UgcService.cs | 20 ++++++++++--- 6 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 webapp-net/Ugc/Data/PubIdTitleLang.cs diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml index 025a4dd9f..12665323f 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml @@ -1,8 +1,6 @@ @model UgcPostCommentForm
-

Model.Heading)>@Model.Heading

- @using (Html.BeginForm()) { if (!WebRequestContext.IsPreview) @@ -17,17 +15,16 @@
}
- @Html.TextBoxFor(m => m.UserName, new {@class = "form-control", placeholder = @Model.UserNameLabel}) + @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", placeholder = @Model.UserNameLabel })
- @Html.PasswordFor(m => m.EmailAddress, new {@class = "form-control", placeholder = @Model.EmailAddressLabel}) + @Html.TextBoxFor(m => m.EmailAddress, new { @class = "form-control", placeholder = @Model.EmailAddressLabel })
- @Html.TextBoxFor(m => m.Content, new {@class = "form-control", placeholder = @Model.ContentLabel}) + @Html.TextAreaFor(m => m.Content, new { @class = "form-control", placeholder = @Model.ContentLabel })
} - diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index e39ac94c0..79b37c910 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -36,7 +36,6 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = string json = new StreamReader(req).ReadToEnd(); PostedComment posted = JsonConvert.DeserializeObject(json); - Dictionary metadata = new Dictionary(); metadata.Add("publicationTitle", posted.PublicationTitle); @@ -46,7 +45,7 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = metadata.Add("language", posted.Language); metadata.Add("status", "0"); - // addPubIdTitleLangToCommentMetadata(input, metadata); + AddPubIdTitleLangToCommentMetadata(posted, metadata); Comment result = ugc.PostComment(posted.PublicationId, posted.PageId, @@ -61,16 +60,12 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = private void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) { - /* PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); - pubIdTitleLang.setId(input.getPublicationId()); - pubIdTitleLang.setLang(input.getLanguage()); - pubIdTitleLang.setTitle(input.getPublicationTitle()); - - Gson gSon = new GsonBuilder().create(); - String pubIdTitleLangJson = gSon.toJson(pubIdTitleLang); - - metadata.Add("pubIdTitleLang", pubIdTitleLangJson);*/ + pubIdTitleLang.Id = comment.PublicationId; + pubIdTitleLang.Lang = comment.Language; + pubIdTitleLang.Title = comment.PublicationTitle; + string pubIdTitleLangJson = JsonConvert.SerializeObject(pubIdTitleLang); + metadata.Add("pubIdTitleLang", pubIdTitleLangJson); } } } diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index 9cfc6ed5b..02c777652 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Web.Mvc; using Sdl.Web.Common.Interfaces; using Sdl.Web.Mvc.Controllers; using Sdl.Web.Common.Models; @@ -11,20 +13,30 @@ namespace Sdl.Web.Modules.Ugc.Controllers /// Ugc Controller /// public class UgcController : EntityController - { + { protected override ViewModel EnrichModel(ViewModel sourceModel) { UgcService ugc = new UgcService(); - UgcCommentList model = base.EnrichModel(sourceModel) as UgcCommentList; - if(model == null) return sourceModel; - - // TODO: we should get page id ILocalization localization = WebRequestContext.Localization; - model.Comments = ugc.GetComments(5960742, 5960654, false, new int[] {}, 0, 0); - - // model.Comments = ugc.GetComments(Int32.Parse(localization.Id), int.Parse(model.Id), false, new int[] { }, 0, 0); + int pubId = int.Parse(localization.Id); + UgcCommentList model = base.EnrichModel(sourceModel) as UgcCommentList; + if (model != null) + { + int pageId = int.Parse(model.Id); + model.Comments = ugc.GetComments(pubId, pageId, false, new int[] {}, + 0, 0); + return model; + } - return model; + UgcPostCommentForm postForm = base.EnrichModel(sourceModel) as UgcPostCommentForm; + if(postForm != null && MapRequestFormData(postForm) && ModelState.IsValid) + { + int pageId = int.Parse(postForm.Id); + ugc.PostComment(pubId, pageId, postForm.UserName, + postForm.EmailAddress, postForm.Content, 0, new Dictionary()); + return new RedirectModel(WebRequestContext.RequestUrl); + } + return sourceModel; } } } diff --git a/webapp-net/Ugc/Data/PubIdTitleLang.cs b/webapp-net/Ugc/Data/PubIdTitleLang.cs new file mode 100644 index 000000000..35f42f496 --- /dev/null +++ b/webapp-net/Ugc/Data/PubIdTitleLang.cs @@ -0,0 +1,9 @@ +namespace Sdl.Web.Modules.Ugc.Data +{ + public class PubIdTitleLang + { + public int Id { get; set; } + public string Title { get; set; } + public string Lang { get; set; } + } +} diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj index 74a203ef8..67259dd33 100644 --- a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -13,6 +13,7 @@ true 512 2.1.0-beta-201803281441 + 10.1.0 true @@ -38,17 +39,17 @@ ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll - + False - ..\packages\Sdl.Dxa.Framework.Web8.2.1.0-beta-201803281441\lib\net452\Sdl.Web.Common.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll - + False - ..\packages\Sdl.Dxa.Framework.Web8.2.1.0-beta-201803281441\lib\net452\Sdl.Web.DataModel.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.DataModel.dll - + False - ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Sdl.Web.Delivery.UGC.dll + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.UGC.dll ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll @@ -71,7 +72,10 @@ ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll $(CopyLocal) - + + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Tridion.ContentDelivery.AmbientData.dll + + False ..\packages\Microsoft.AspNet.WebPages.Data.3.2.3\lib\net45\WebMatrix.Data.dll @@ -93,6 +97,7 @@ + diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs index 7504bf860..177057231 100644 --- a/webapp-net/Ugc/UgcService.cs +++ b/webapp-net/Ugc/UgcService.cs @@ -1,4 +1,5 @@ -using Sdl.Web.Tridion.ContentManager; +using System; +using Sdl.Web.Tridion.ContentManager; using System.Collections.Generic; using System.Linq; using Sdl.Web.Common.Interfaces; @@ -6,6 +7,7 @@ using Sdl.Web.Delivery.UGC.Model; using Sdl.Web.Modules.Ugc.Data; using Sdl.Web.Mvc.Configuration; +using Tridion.ContentDelivery.AmbientData; namespace Sdl.Web.Modules.Ugc { @@ -33,10 +35,19 @@ public List GetComments(int publicationId, int pageId, bool descending, }; return Convert(_api.RetrieveFlatComments(CreateUri(publicationId, pageId), filter, descending, false)); } - + public Comment PostComment(int publicationId, int pageId, string username, string email, string content, - int parentId, Dictionary metadata) - => Convert(_api.PostComment(CreateUri(publicationId, pageId), username, email, content, parentId, metadata).Result); + int parentId, Dictionary metadata) + { + var claimStore = AmbientDataContext.CurrentClaimStore; + if (claimStore != null) + { + claimStore.Put(new Uri("taf:claim:contentdelivery:webservice:user"), username); + claimStore.Put(new Uri("taf:claim:contentdelivery:webservice:post:allowed"), true); + } + return Convert( + _api.PostComment(CreateUri(publicationId, pageId), username, email, content, parentId, metadata).Result); + } private static CmUri CreateUri(int publicationId, int pageId) { @@ -49,6 +60,7 @@ private static List Convert(IEnumerable comments) private static Comment Convert(IComment comment) { + if (comment == null) return null; Comment c = new Comment { Id = comment.Id, From 2b20f9dbb898feacd371b366a23ee588b0e5bd3a Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 4 Apr 2018 13:11:04 +0100 Subject: [PATCH 10/78] TSI-3129 : Tweaks --- .../Views/IshPage/GeneralPage.cshtml} | 0 .../Areas/{DDWebApp => Ish}/Views/web.config | 4 +- .../DDWebApp/Controllers/BaseController.cs | 10 ++-- .../DDWebApp/Controllers/IshApiController.cs | 14 ++++- .../DDWebApp/Controllers/IshPageController.cs | 9 ++-- .../DDWebAppModuleAreaRegistration.cs | 8 +-- .../DDWebApp/Exceptions/IshApiException.cs | 2 +- .../DDWebApp/Localization/IshLocalization.cs | 54 +++++++++++-------- .../Localization/IshLocalizationResolver.cs | 16 ++++-- webapp-net/DDWebApp/Models/Publication.cs | 2 +- .../DDWebApp/Models/PublicationSiteMap.cs | 2 +- webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs | 2 +- webapp-net/DDWebApp/Models/Topic.cs | 2 +- .../Navigation/IshNavigationProvider.cs | 4 +- .../DDWebApp/Providers/ConditionProvider.cs | 12 ++--- .../DDWebApp/Providers/IshContentProvider.cs | 8 +-- .../DDWebApp/Providers/PublicationProvider.cs | 6 +-- webapp-net/DDWebApp/Providers/TocProvider.cs | 2 +- ...bApp.csproj => Sdl.Web.Modules.Ish.csproj} | 8 +-- webapp-net/DxaModules.sln | 2 +- 20 files changed, 97 insertions(+), 70 deletions(-) rename webapp-net/DDWebApp/Areas/{DDWebApp/Views/IshPage/Home.cshtml => Ish/Views/IshPage/GeneralPage.cshtml} (100%) rename webapp-net/DDWebApp/Areas/{DDWebApp => Ish}/Views/web.config (93%) rename webapp-net/DDWebApp/{Sdl.Web.Modules.DDWebApp.csproj => Sdl.Web.Modules.Ish.csproj} (96%) diff --git a/webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml b/webapp-net/DDWebApp/Areas/Ish/Views/IshPage/GeneralPage.cshtml similarity index 100% rename from webapp-net/DDWebApp/Areas/DDWebApp/Views/IshPage/Home.cshtml rename to webapp-net/DDWebApp/Areas/Ish/Views/IshPage/GeneralPage.cshtml diff --git a/webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config b/webapp-net/DDWebApp/Areas/Ish/Views/web.config similarity index 93% rename from webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config rename to webapp-net/DDWebApp/Areas/Ish/Views/web.config index 72d34296b..a554e3e0c 100644 --- a/webapp-net/DDWebApp/Areas/DDWebApp/Views/web.config +++ b/webapp-net/DDWebApp/Areas/Ish/Views/web.config @@ -20,8 +20,8 @@ - - + + diff --git a/webapp-net/DDWebApp/Controllers/BaseController.cs b/webapp-net/DDWebApp/Controllers/BaseController.cs index e1a8474ad..bc2bbd07d 100644 --- a/webapp-net/DDWebApp/Controllers/BaseController.cs +++ b/webapp-net/DDWebApp/Controllers/BaseController.cs @@ -3,15 +3,15 @@ using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; -using Sdl.Web.Modules.DDWebApp.Exceptions; -using Sdl.Web.Modules.DDWebApp.Navigation; -using Sdl.Web.Modules.DDWebApp.Providers; +using Sdl.Web.Modules.Ish.Exceptions; +using Sdl.Web.Modules.Ish.Navigation; +using Sdl.Web.Modules.Ish.Providers; using Sdl.Web.Mvc.Configuration; using Tridion.ContentDelivery.Meta; -namespace Sdl.Web.Modules.DDWebApp.Controllers +namespace Sdl.Web.Modules.Ish.Controllers { - [RouteArea("DDWebApp")] + [RouteArea("Ish")] public class BaseController : Mvc.Controllers.PageController { private static readonly string TocNaventriesMeta = "tocnaventries.generated.value"; diff --git a/webapp-net/DDWebApp/Controllers/IshApiController.cs b/webapp-net/DDWebApp/Controllers/IshApiController.cs index 9d33d686a..66477da5f 100644 --- a/webapp-net/DDWebApp/Controllers/IshApiController.cs +++ b/webapp-net/DDWebApp/Controllers/IshApiController.cs @@ -3,10 +3,13 @@ using Sdl.Web.Common; using Sdl.Web.Common.Models; using Sdl.Web.Delivery.ServicesCore.ClaimStore; -using Sdl.Web.Modules.DDWebApp.Providers; +using Sdl.Web.Modules.Ish.Providers; using Sdl.Web.Mvc.Formats; +using System.Web; +using System.Web.Configuration; +using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.DDWebApp.Controllers +namespace Sdl.Web.Modules.Ish.Controllers { /// /// Ish Api Controller @@ -15,6 +18,12 @@ public class IshApiController : BaseController { private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); + private void HandleResponseAttribs() + { + System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; + System.Web.HttpContext.Current.Items["ContentIsEvaluable"] = false; + } + [Route("~/api/page/{publicationId:int}/{pageId:int}")] [Route("~/api/page/{publicationId:int}/{pageId:int}/{*path}")] [HttpGet] @@ -26,6 +35,7 @@ public virtual ActionResult Page(int publicationId, int pageId, string path, str AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } PageModel pageModel = IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + HandleResponseAttribs(); return Json(pageModel); //return Content(JsonConvert.SerializeObject(pageModel), "application/json"); } diff --git a/webapp-net/DDWebApp/Controllers/IshPageController.cs b/webapp-net/DDWebApp/Controllers/IshPageController.cs index b75029672..6c36f4f3a 100644 --- a/webapp-net/DDWebApp/Controllers/IshPageController.cs +++ b/webapp-net/DDWebApp/Controllers/IshPageController.cs @@ -7,7 +7,7 @@ using Sdl.Web.Mvc; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.DDWebApp.Controllers +namespace Sdl.Web.Modules.Ish.Controllers { /// /// Ish Page Controller @@ -19,7 +19,8 @@ public class IshPageController : BaseController [Route("~/publications/{*content}")] public ActionResult Home() { - return View("Home"); + System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; + return View("GeneralPage"); } [Route("~/{publicationId:int}")] @@ -37,8 +38,9 @@ public virtual ActionResult Page(int publicationId, int pageId, string path = "" protected ActionResult GetPage(int publicationId) { + System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; SetupLocalization(publicationId); - return View("Home"); + return View("GeneralPage"); } protected ActionResult GetPage(int publicationId, int pageId) @@ -71,6 +73,7 @@ protected ActionResult GetPage(int publicationId, int pageId) SetupViewData(pageModel); PageModel model = (EnrichModel(pageModel) as PageModel) ?? pageModel; WebRequestContext.PageModel = model; + System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; return View(model.MvcData.ViewName, model); } catch (Exception ex) diff --git a/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs b/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs index 72b71cfec..738a0a836 100644 --- a/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs +++ b/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs @@ -1,15 +1,15 @@ using Sdl.Web.Common.Models; -using Sdl.Web.Modules.DDWebApp.Models; +using Sdl.Web.Modules.Ish.Models; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.DDWebApp +namespace Sdl.Web.Modules.Ish { /// /// DDWebApp module area registration /// public class DDWebAppModuleAreaRegistration : BaseAreaRegistration { - public override string AreaName => "DDWebApp"; + public override string AreaName => "Ish"; protected override void RegisterAllViewModels() { @@ -17,7 +17,7 @@ protected override void RegisterAllViewModels() RegisterViewModel("Topic", typeof(Topic)); // Page Views - RegisterViewModel("Home", typeof(PageModel)); + //RegisterViewModel("Home", typeof(PageModel)); RegisterViewModel("GeneralPage", typeof(PageModel)); } } diff --git a/webapp-net/DDWebApp/Exceptions/IshApiException.cs b/webapp-net/DDWebApp/Exceptions/IshApiException.cs index d84fee8fc..b9430aa7b 100644 --- a/webapp-net/DDWebApp/Exceptions/IshApiException.cs +++ b/webapp-net/DDWebApp/Exceptions/IshApiException.cs @@ -1,6 +1,6 @@ using System; -namespace Sdl.Web.Modules.DDWebApp.Exceptions +namespace Sdl.Web.Modules.Ish.Exceptions { /// /// Ish Api Exception diff --git a/webapp-net/DDWebApp/Localization/IshLocalization.cs b/webapp-net/DDWebApp/Localization/IshLocalization.cs index b7e041f0e..f86985d36 100644 --- a/webapp-net/DDWebApp/Localization/IshLocalization.cs +++ b/webapp-net/DDWebApp/Localization/IshLocalization.cs @@ -1,27 +1,21 @@ -using Sdl.Web.Common.Configuration; - -namespace Sdl.Web.Modules.DDWebApp.Localization +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Sdl.Web.Common; +using Sdl.Web.Common.Configuration; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Logging; + +namespace Sdl.Web.Modules.Ish.Localization { /// /// Ish Localization Implementation /// public class IshLocalization : Common.Configuration.Localization - { - public IshLocalization() - { - /* - List mediaPatterns = new List(); - - mediaPatterns.Add("^/favicon.ico"); - mediaPatterns.Add(String.Format("^{0}/{1}/assets/.*", Path, SiteConfiguration.SystemFolder)); - mediaPatterns.Add(String.Format("^{0}/{1}/.*\\.json$", Path, SiteConfiguration.SystemFolder)); - - StaticContentUrlPattern = String.Join("|", mediaPatterns); - _staticContentUrlRegex = new Regex(StaticContentUrlPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); - */ - } - - public override string Path { get; set; } = "/DDWebApp"; // content path + { + public override string Path { get; set; } = "/"; // content path public override string CmUriScheme { get; } = "ish"; @@ -29,9 +23,23 @@ public IshLocalization() public override string BinaryCacheFolder => $"{SiteConfiguration.StaticsFolder}\\DDWebApp"; - //public override bool IsStaticContentUrl(string urlPath) - //{ - // return true; - //} + protected override void Load() + { + using (new Tracer(this)) + { + LastRefresh = DateTime.Now; + } + } + + public override bool IsStaticContentUrl(string urlPath) + { + List mediaPatterns = new List(); + mediaPatterns.Add("^/favicon.ico"); + mediaPatterns.Add($"^{Path}/{SiteConfiguration.SystemFolder}/assets/.*"); + mediaPatterns.Add($"^{Path}/{SiteConfiguration.SystemFolder}/.*\\.json$"); + StaticContentUrlPattern = string.Join("|", mediaPatterns); + Regex staticContentUrlRegex = new Regex(StaticContentUrlPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); + return staticContentUrlRegex.IsMatch(urlPath); + } } } \ No newline at end of file diff --git a/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs b/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs index 26d8291bb..c144a598c 100644 --- a/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs +++ b/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs @@ -2,18 +2,24 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Tridion; -namespace Sdl.Web.Modules.DDWebApp.Localization +namespace Sdl.Web.Modules.Ish.Localization { /// /// Ish Localization Resolver /// public class IshLocalizationResolver : LocalizationResolver { - public override ILocalization ResolveLocalization(Uri url) + private readonly ILocalization _localization; + + public IshLocalizationResolver() { - ILocalization localization = new IshLocalization(); - localization.EnsureInitialized(); - return localization; + _localization = new IshLocalization(); + _localization.EnsureInitialized(); + } + + public override ILocalization ResolveLocalization(Uri url) + { + return _localization; } } } diff --git a/webapp-net/DDWebApp/Models/Publication.cs b/webapp-net/DDWebApp/Models/Publication.cs index a43af0fa0..589748b8c 100644 --- a/webapp-net/DDWebApp/Models/Publication.cs +++ b/webapp-net/DDWebApp/Models/Publication.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Sdl.Web.Modules.DDWebApp.Models +namespace Sdl.Web.Modules.Ish.Models { /// /// Publication diff --git a/webapp-net/DDWebApp/Models/PublicationSiteMap.cs b/webapp-net/DDWebApp/Models/PublicationSiteMap.cs index 8cbf1d8e4..0e8c843c7 100644 --- a/webapp-net/DDWebApp/Models/PublicationSiteMap.cs +++ b/webapp-net/DDWebApp/Models/PublicationSiteMap.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Sdl.Web.Common.Models; -namespace Sdl.Web.Modules.DDWebApp.Models +namespace Sdl.Web.Modules.Ish.Models { public class PublicationSiteMap : EntityModel { diff --git a/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs b/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs index e937112d1..e7fe4b645 100644 --- a/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs +++ b/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs @@ -1,6 +1,6 @@ using System; -namespace Sdl.Web.Modules.DDWebApp.Models +namespace Sdl.Web.Modules.Ish.Models { public class SiteMapUrlEntry { diff --git a/webapp-net/DDWebApp/Models/Topic.cs b/webapp-net/DDWebApp/Models/Topic.cs index 0b054f206..075f166fa 100644 --- a/webapp-net/DDWebApp/Models/Topic.cs +++ b/webapp-net/DDWebApp/Models/Topic.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Sdl.Web.Common.Models; -namespace Sdl.Web.Modules.DDWebApp.Models +namespace Sdl.Web.Modules.Ish.Models { /// /// Topic Entity diff --git a/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs b/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs index e18266c1e..3ea4f73f2 100644 --- a/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs +++ b/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs @@ -5,12 +5,12 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; using Sdl.Web.Common.Models.Navigation; -using Sdl.Web.Modules.DDWebApp.Models; +using Sdl.Web.Modules.Ish.Models; using Sdl.Web.Tridion.ContentManager; using Tridion.ContentDelivery.Meta; using Tridion.ContentDelivery.Taxonomies; -namespace Sdl.Web.Modules.DDWebApp.Navigation +namespace Sdl.Web.Modules.Ish.Navigation { public class IshNavigationProvider : Tridion.Navigation.CILImpl.DynamicNavigationProvider { diff --git a/webapp-net/DDWebApp/Providers/ConditionProvider.cs b/webapp-net/DDWebApp/Providers/ConditionProvider.cs index 25ed773df..15ad77e0d 100644 --- a/webapp-net/DDWebApp/Providers/ConditionProvider.cs +++ b/webapp-net/DDWebApp/Providers/ConditionProvider.cs @@ -2,21 +2,21 @@ using Sdl.Web.Common; using Tridion.ContentDelivery.Meta; -namespace Sdl.Web.Modules.DDWebApp.Providers +namespace Sdl.Web.Modules.Ish.Providers { /// /// Condition Provider /// public class ConditionProvider { - private static readonly string CONDITION_USED = "conditionsused.generated.value"; - private static readonly string CONDITION_METADATA = "conditionmetadata.generated.value"; - private static readonly string CONDITION_VALUES = "values"; + private static readonly string ConditionUsed = "conditionsused.generated.value"; + private static readonly string ConditionMetadata = "conditionmetadata.generated.value"; + private static readonly string ConditionValues = "values"; public string GetConditions(int publicationId) { - var conditionUsed = GetMetadata(publicationId, CONDITION_USED); - var conditionMetadata = GetMetadata(publicationId, CONDITION_METADATA); + var conditionUsed = GetMetadata(publicationId, ConditionUsed); + var conditionMetadata = GetMetadata(publicationId, ConditionMetadata); JObject o1 = JObject.Parse(conditionUsed); JObject o2 = JObject.Parse(conditionMetadata); diff --git a/webapp-net/DDWebApp/Providers/IshContentProvider.cs b/webapp-net/DDWebApp/Providers/IshContentProvider.cs index 0c4233acc..1338e1e18 100644 --- a/webapp-net/DDWebApp/Providers/IshContentProvider.cs +++ b/webapp-net/DDWebApp/Providers/IshContentProvider.cs @@ -1,12 +1,12 @@ using System; using Sdl.Web.Common; -using Sdl.Web.Modules.DDWebApp.Exceptions; +using Sdl.Web.Modules.Ish.Exceptions; using Sdl.Web.Tridion.Mapping; using Tridion.ContentDelivery.DynamicContent.Query; using Tridion.ContentDelivery.Meta; using Sdl.Web.Tridion.ContentManager; -namespace Sdl.Web.Modules.DDWebApp.Providers +namespace Sdl.Web.Modules.Ish.Providers { /// /// Ish Content Provider @@ -48,9 +48,9 @@ public IItem GetPageIdByIshLogicalReference(int publicationId, string ishLogical Criteria refCriteria = new CustomMetaValueCriteria(metaKeyCriteria, ishLogicalRefValue); Criteria pubCriteria = new PublicationCriteria(publicationId); Criteria itemType = new ItemTypeCriteria((int)ItemType.Page); - Criteria composite = new AndCriteria(new Criteria[] { dateCriteria, refCriteria, itemType, pubCriteria}); + Criteria composite = new AndCriteria(new[] { dateCriteria, refCriteria, itemType, pubCriteria}); - global::Tridion.ContentDelivery.DynamicContent.Query.Query query = new global::Tridion.ContentDelivery.DynamicContent.Query.Query(composite); + Query query = new Query(composite); IItem[] items = query.ExecuteEntityQuery(); if (items == null || items.Length == 0) { diff --git a/webapp-net/DDWebApp/Providers/PublicationProvider.cs b/webapp-net/DDWebApp/Providers/PublicationProvider.cs index a7c42435d..ca8a5822b 100644 --- a/webapp-net/DDWebApp/Providers/PublicationProvider.cs +++ b/webapp-net/DDWebApp/Providers/PublicationProvider.cs @@ -3,11 +3,11 @@ using System.Linq; using Sdl.Web.Common; using Sdl.Web.Common.Logging; -using Sdl.Web.Modules.DDWebApp.Models; +using Sdl.Web.Modules.Ish.Models; using Tridion.ContentDelivery.Meta; -using Sdl.Web.Modules.DDWebApp.Exceptions; +using Sdl.Web.Modules.Ish.Exceptions; -namespace Sdl.Web.Modules.DDWebApp.Providers +namespace Sdl.Web.Modules.Ish.Providers { /// /// Publication Provider diff --git a/webapp-net/DDWebApp/Providers/TocProvider.cs b/webapp-net/DDWebApp/Providers/TocProvider.cs index 9c16786d1..48d2fc858 100644 --- a/webapp-net/DDWebApp/Providers/TocProvider.cs +++ b/webapp-net/DDWebApp/Providers/TocProvider.cs @@ -5,7 +5,7 @@ using Sdl.Web.Common.Models.Navigation; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.DDWebApp.Providers +namespace Sdl.Web.Modules.Ish.Providers { /// /// Table of Contents (TOC) Provider diff --git a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj b/webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj similarity index 96% rename from webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj rename to webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj index fa7ccb378..86f1af863 100644 --- a/webapp-net/DDWebApp/Sdl.Web.Modules.DDWebApp.csproj +++ b/webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj @@ -7,8 +7,8 @@ {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5} Library Properties - Sdl.Web.Modules.DDWebApp - Sdl.Web.Modules.DDWebApp + Sdl.Web.Modules.Ish + Sdl.Web.Modules.Ish v4.5.2 512 2.1.0-beta-201803231551 @@ -104,8 +104,8 @@ - - + + diff --git a/webapp-net/DxaModules.sln b/webapp-net/DxaModules.sln index a5acd2dc2..1b9c6906b 100644 --- a/webapp-net/DxaModules.sln +++ b/webapp-net/DxaModules.sln @@ -32,7 +32,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Core", "Cor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.AudienceManager", "AudienceManager\Sdl.Web.Modules.AudienceManager.csproj", "{83EC18A4-831F-4939-9912-D8A93FA3998D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.DDWebApp", "DDWebApp\Sdl.Web.Modules.DDWebApp.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ish", "DDWebApp\Sdl.Web.Modules.Ish.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ugc", "Ugc\Sdl.Web.Modules.Ugc.csproj", "{54DDEEE6-1F97-4E53-8018-5918F7D90A8B}" EndProject From ba88016050a23bc6ad4d2b8f907a79bda46bf13b Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 4 Apr 2018 13:38:33 +0100 Subject: [PATCH 11/78] TSI-3068 : Tweaks to UGC to support DDWebApp --- .../Areas/Ugc/Views/Ugc/UgcCommentList.cshtml | 2 +- .../Ugc/Controllers/UgcApiController.cs | 30 +++++++++++++++---- webapp-net/Ugc/Controllers/UgcController.cs | 4 +-- webapp-net/Ugc/Data/Comment.cs | 22 ++++++++++++-- webapp-net/Ugc/UgcService.cs | 20 +++++++++++-- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml index b4e990038..8782c9349 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml @@ -6,7 +6,7 @@ @foreach(var comment in Model.Comments) {

@comment.User.Name

- +

@comment.Content

} diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index 79b37c910..343eef921 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using Sdl.Web.Mvc.Controllers; using System.IO; +using System.Text; using System.Web.Mvc; using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using Sdl.Web.Modules.Ugc.Data; using Sdl.Web.Mvc.Configuration; @@ -17,11 +19,19 @@ public class UgcApiController : BaseController [Route("~/api/comments/{publicationId:int}/{pageId:int}")] [HttpGet] public ActionResult GetComments(int? publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) - { + { UgcService ugc = new UgcService(); - return Json(ugc.GetComments( - publicationId ?? int.Parse(WebRequestContext.Localization.Id), - pageId, descending, status ?? new int[] {}, top, skip)); + + var comments = ugc.GetComments( + publicationId ?? int.Parse(WebRequestContext.Localization.Id), + pageId, descending, status ?? new int[] {}, top, skip); + + return new ContentResult + { + ContentType = "application/json", + Content = JsonConvert.SerializeObject(comments, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), + ContentEncoding = Encoding.UTF8 + }; } [Route("~/api/comments/add")] @@ -38,6 +48,9 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = PostedComment posted = JsonConvert.DeserializeObject(json); Dictionary metadata = new Dictionary(); + /* + * TODO: Issue in CIL at the moment when posting metadata so commenting this out until + * CIL is upgraded. metadata.Add("publicationTitle", posted.PublicationTitle); metadata.Add("publicationUrl", posted.PublicationUrl); metadata.Add("itemTitle", posted.PageTitle); @@ -46,7 +59,7 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = metadata.Add("status", "0"); AddPubIdTitleLangToCommentMetadata(posted, metadata); - + */ Comment result = ugc.PostComment(posted.PublicationId, posted.PageId, posted.Username, @@ -55,7 +68,12 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = posted.ParentId, metadata); - return Json(result); + return new ContentResult + { + ContentType = "application/json", + Content = JsonConvert.SerializeObject(result, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), + ContentEncoding = Encoding.UTF8 + }; } private void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index 02c777652..c2bf3f49f 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Web.Mvc; +using System.Collections.Generic; using Sdl.Web.Common.Interfaces; using Sdl.Web.Mvc.Controllers; using Sdl.Web.Common.Models; diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs index af75b533c..0d9e904af 100644 --- a/webapp-net/Ugc/Data/Comment.cs +++ b/webapp-net/Ugc/Data/Comment.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Newtonsoft.Json; namespace Sdl.Web.Modules.Ugc.Data { @@ -9,10 +10,27 @@ public class Comment public int ItemPublicationId { get; set; } public int ItemId { get; set; } public int ItemType { get; set; } - public DateTime CreationDate { get; set; } - public DateTime LastModifiedDate { get; set; } + public CommentDate CreationDate { get; set; } + public CommentDate LastModifiedDate { get; set; } public string Content { get; set; } public User User { get; set; } public List Children { get; set; } } + + public class CommentDate + { + [JsonIgnore] + public DateTime DateTime { get; set; } + + public int DayOfMonth { get; set; } + public string DayOfWeek { get; set; } + public int DayOfYear { get; set; } + public int Hour { get; set; } + public int Minute { get; set; } + public string Month { get; set; } + public int MonthValue { get; set; } + public int Nano { get; set; } + public int Second { get; set; } + public int Year { get; set; } + } } diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs index 177057231..048340437 100644 --- a/webapp-net/Ugc/UgcService.cs +++ b/webapp-net/Ugc/UgcService.cs @@ -1,6 +1,7 @@ using System; using Sdl.Web.Tridion.ContentManager; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Sdl.Web.Common.Interfaces; using Sdl.Web.Delivery.UGC; @@ -77,12 +78,12 @@ private static Comment Convert(IComment comment) if (comment.CreationDate.HasValue) { - c.CreationDate = comment.CreationDate.Value; + c.CreationDate = Convert(comment.CreationDate.Value); } if (comment.LastModifiedDate.HasValue) { - c.LastModifiedDate = comment.LastModifiedDate.Value; + c.LastModifiedDate = Convert(comment.LastModifiedDate.Value); } c.Children = Convert(comment.Children); @@ -96,5 +97,20 @@ private static Comment Convert(IComment comment) Name = user.Name, EmailAddress = user.EmailAddress, }; + + private static CommentDate Convert(DateTime dt) => new CommentDate + { + DateTime = dt, + DayOfMonth = dt.Month, + DayOfWeek = dt.DayOfWeek.ToString(), + DayOfYear = dt.DayOfYear, + Month = new DateTimeFormatInfo().GetMonthName(dt.Month), + MonthValue = dt.Month, + Year = dt.Year, + Hour = dt.Hour, + Minute = dt.Minute, + Second = dt.Second, + Nano = dt.Millisecond + }; } } From a123776dae2b3525528d1ca0f8655741dbb9f8a2 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 4 Apr 2018 14:13:07 +0100 Subject: [PATCH 12/78] TSI-3129 : Renamed module --- webapp-net/DxaModules.sln | 12 ++++++------ .../Areas/Ish/Views/IshPage/GeneralPage.cshtml | 0 .../{DDWebApp => Ish}/Areas/Ish/Views/web.config | 0 .../{DDWebApp => Ish}/Controllers/BaseController.cs | 0 .../Controllers/IshApiController.cs | 0 .../Controllers/IshPageController.cs | 0 .../{DDWebApp => Ish}/Exceptions/IshApiException.cs | 0 .../IshModuleAreaRegistration.cs} | 3 +-- .../Localization/IshLocalization.cs | 0 .../Localization/IshLocalizationResolver.cs | 0 webapp-net/{DDWebApp => Ish}/Models/Publication.cs | 0 .../{DDWebApp => Ish}/Models/PublicationSiteMap.cs | 0 .../{DDWebApp => Ish}/Models/SiteMapUrlEntry.cs | 0 webapp-net/{DDWebApp => Ish}/Models/Topic.cs | 0 .../Navigation/IshNavigationProvider.cs | 0 .../{DDWebApp => Ish}/Properties/AssemblyInfo.cs | 0 .../{DDWebApp => Ish}/Providers/ConditionProvider.cs | 0 .../Providers/IshContentProvider.cs | 0 .../Providers/PublicationProvider.cs | 0 .../{DDWebApp => Ish}/Providers/TocProvider.cs | 0 .../{DDWebApp => Ish}/Sdl.Web.Modules.Ish.csproj | 2 +- webapp-net/{DDWebApp => Ish}/packages.config | 0 22 files changed, 8 insertions(+), 9 deletions(-) rename webapp-net/{DDWebApp => Ish}/Areas/Ish/Views/IshPage/GeneralPage.cshtml (100%) rename webapp-net/{DDWebApp => Ish}/Areas/Ish/Views/web.config (100%) rename webapp-net/{DDWebApp => Ish}/Controllers/BaseController.cs (100%) rename webapp-net/{DDWebApp => Ish}/Controllers/IshApiController.cs (100%) rename webapp-net/{DDWebApp => Ish}/Controllers/IshPageController.cs (100%) rename webapp-net/{DDWebApp => Ish}/Exceptions/IshApiException.cs (100%) rename webapp-net/{DDWebApp/DDWebAppModuleAreaRegistration.cs => Ish/IshModuleAreaRegistration.cs} (80%) rename webapp-net/{DDWebApp => Ish}/Localization/IshLocalization.cs (100%) rename webapp-net/{DDWebApp => Ish}/Localization/IshLocalizationResolver.cs (100%) rename webapp-net/{DDWebApp => Ish}/Models/Publication.cs (100%) rename webapp-net/{DDWebApp => Ish}/Models/PublicationSiteMap.cs (100%) rename webapp-net/{DDWebApp => Ish}/Models/SiteMapUrlEntry.cs (100%) rename webapp-net/{DDWebApp => Ish}/Models/Topic.cs (100%) rename webapp-net/{DDWebApp => Ish}/Navigation/IshNavigationProvider.cs (100%) rename webapp-net/{DDWebApp => Ish}/Properties/AssemblyInfo.cs (100%) rename webapp-net/{DDWebApp => Ish}/Providers/ConditionProvider.cs (100%) rename webapp-net/{DDWebApp => Ish}/Providers/IshContentProvider.cs (100%) rename webapp-net/{DDWebApp => Ish}/Providers/PublicationProvider.cs (100%) rename webapp-net/{DDWebApp => Ish}/Providers/TocProvider.cs (100%) rename webapp-net/{DDWebApp => Ish}/Sdl.Web.Modules.Ish.csproj (98%) rename webapp-net/{DDWebApp => Ish}/packages.config (100%) diff --git a/webapp-net/DxaModules.sln b/webapp-net/DxaModules.sln index 1b9c6906b..b73843ed6 100644 --- a/webapp-net/DxaModules.sln +++ b/webapp-net/DxaModules.sln @@ -32,10 +32,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Core", "Cor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.AudienceManager", "AudienceManager\Sdl.Web.Modules.AudienceManager.csproj", "{83EC18A4-831F-4939-9912-D8A93FA3998D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ish", "DDWebApp\Sdl.Web.Modules.Ish.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ugc", "Ugc\Sdl.Web.Modules.Ugc.csproj", "{54DDEEE6-1F97-4E53-8018-5918F7D90A8B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ish", "Ish\Sdl.Web.Modules.Ish.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -90,14 +90,14 @@ Global {83EC18A4-831F-4939-9912-D8A93FA3998D}.Debug|Any CPU.Build.0 = Debug|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.ActiveCfg = Release|Any CPU {83EC18A4-831F-4939-9912-D8A93FA3998D}.Release|Any CPU.Build.0 = Release|Any CPU - {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.Build.0 = Release|Any CPU {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU {54DDEEE6-1F97-4E53-8018-5918F7D90A8B}.Release|Any CPU.Build.0 = Release|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/webapp-net/DDWebApp/Areas/Ish/Views/IshPage/GeneralPage.cshtml b/webapp-net/Ish/Areas/Ish/Views/IshPage/GeneralPage.cshtml similarity index 100% rename from webapp-net/DDWebApp/Areas/Ish/Views/IshPage/GeneralPage.cshtml rename to webapp-net/Ish/Areas/Ish/Views/IshPage/GeneralPage.cshtml diff --git a/webapp-net/DDWebApp/Areas/Ish/Views/web.config b/webapp-net/Ish/Areas/Ish/Views/web.config similarity index 100% rename from webapp-net/DDWebApp/Areas/Ish/Views/web.config rename to webapp-net/Ish/Areas/Ish/Views/web.config diff --git a/webapp-net/DDWebApp/Controllers/BaseController.cs b/webapp-net/Ish/Controllers/BaseController.cs similarity index 100% rename from webapp-net/DDWebApp/Controllers/BaseController.cs rename to webapp-net/Ish/Controllers/BaseController.cs diff --git a/webapp-net/DDWebApp/Controllers/IshApiController.cs b/webapp-net/Ish/Controllers/IshApiController.cs similarity index 100% rename from webapp-net/DDWebApp/Controllers/IshApiController.cs rename to webapp-net/Ish/Controllers/IshApiController.cs diff --git a/webapp-net/DDWebApp/Controllers/IshPageController.cs b/webapp-net/Ish/Controllers/IshPageController.cs similarity index 100% rename from webapp-net/DDWebApp/Controllers/IshPageController.cs rename to webapp-net/Ish/Controllers/IshPageController.cs diff --git a/webapp-net/DDWebApp/Exceptions/IshApiException.cs b/webapp-net/Ish/Exceptions/IshApiException.cs similarity index 100% rename from webapp-net/DDWebApp/Exceptions/IshApiException.cs rename to webapp-net/Ish/Exceptions/IshApiException.cs diff --git a/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs b/webapp-net/Ish/IshModuleAreaRegistration.cs similarity index 80% rename from webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs rename to webapp-net/Ish/IshModuleAreaRegistration.cs index 738a0a836..d4fee4c21 100644 --- a/webapp-net/DDWebApp/DDWebAppModuleAreaRegistration.cs +++ b/webapp-net/Ish/IshModuleAreaRegistration.cs @@ -7,7 +7,7 @@ namespace Sdl.Web.Modules.Ish /// /// DDWebApp module area registration /// - public class DDWebAppModuleAreaRegistration : BaseAreaRegistration + public class IshModuleAreaRegistration : BaseAreaRegistration { public override string AreaName => "Ish"; @@ -17,7 +17,6 @@ protected override void RegisterAllViewModels() RegisterViewModel("Topic", typeof(Topic)); // Page Views - //RegisterViewModel("Home", typeof(PageModel)); RegisterViewModel("GeneralPage", typeof(PageModel)); } } diff --git a/webapp-net/DDWebApp/Localization/IshLocalization.cs b/webapp-net/Ish/Localization/IshLocalization.cs similarity index 100% rename from webapp-net/DDWebApp/Localization/IshLocalization.cs rename to webapp-net/Ish/Localization/IshLocalization.cs diff --git a/webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs b/webapp-net/Ish/Localization/IshLocalizationResolver.cs similarity index 100% rename from webapp-net/DDWebApp/Localization/IshLocalizationResolver.cs rename to webapp-net/Ish/Localization/IshLocalizationResolver.cs diff --git a/webapp-net/DDWebApp/Models/Publication.cs b/webapp-net/Ish/Models/Publication.cs similarity index 100% rename from webapp-net/DDWebApp/Models/Publication.cs rename to webapp-net/Ish/Models/Publication.cs diff --git a/webapp-net/DDWebApp/Models/PublicationSiteMap.cs b/webapp-net/Ish/Models/PublicationSiteMap.cs similarity index 100% rename from webapp-net/DDWebApp/Models/PublicationSiteMap.cs rename to webapp-net/Ish/Models/PublicationSiteMap.cs diff --git a/webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs b/webapp-net/Ish/Models/SiteMapUrlEntry.cs similarity index 100% rename from webapp-net/DDWebApp/Models/SiteMapUrlEntry.cs rename to webapp-net/Ish/Models/SiteMapUrlEntry.cs diff --git a/webapp-net/DDWebApp/Models/Topic.cs b/webapp-net/Ish/Models/Topic.cs similarity index 100% rename from webapp-net/DDWebApp/Models/Topic.cs rename to webapp-net/Ish/Models/Topic.cs diff --git a/webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs b/webapp-net/Ish/Navigation/IshNavigationProvider.cs similarity index 100% rename from webapp-net/DDWebApp/Navigation/IshNavigationProvider.cs rename to webapp-net/Ish/Navigation/IshNavigationProvider.cs diff --git a/webapp-net/DDWebApp/Properties/AssemblyInfo.cs b/webapp-net/Ish/Properties/AssemblyInfo.cs similarity index 100% rename from webapp-net/DDWebApp/Properties/AssemblyInfo.cs rename to webapp-net/Ish/Properties/AssemblyInfo.cs diff --git a/webapp-net/DDWebApp/Providers/ConditionProvider.cs b/webapp-net/Ish/Providers/ConditionProvider.cs similarity index 100% rename from webapp-net/DDWebApp/Providers/ConditionProvider.cs rename to webapp-net/Ish/Providers/ConditionProvider.cs diff --git a/webapp-net/DDWebApp/Providers/IshContentProvider.cs b/webapp-net/Ish/Providers/IshContentProvider.cs similarity index 100% rename from webapp-net/DDWebApp/Providers/IshContentProvider.cs rename to webapp-net/Ish/Providers/IshContentProvider.cs diff --git a/webapp-net/DDWebApp/Providers/PublicationProvider.cs b/webapp-net/Ish/Providers/PublicationProvider.cs similarity index 100% rename from webapp-net/DDWebApp/Providers/PublicationProvider.cs rename to webapp-net/Ish/Providers/PublicationProvider.cs diff --git a/webapp-net/DDWebApp/Providers/TocProvider.cs b/webapp-net/Ish/Providers/TocProvider.cs similarity index 100% rename from webapp-net/DDWebApp/Providers/TocProvider.cs rename to webapp-net/Ish/Providers/TocProvider.cs diff --git a/webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj b/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj similarity index 98% rename from webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj rename to webapp-net/Ish/Sdl.Web.Modules.Ish.csproj index 86f1af863..62958a52b 100644 --- a/webapp-net/DDWebApp/Sdl.Web.Modules.Ish.csproj +++ b/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj @@ -88,7 +88,7 @@ - + diff --git a/webapp-net/DDWebApp/packages.config b/webapp-net/Ish/packages.config similarity index 100% rename from webapp-net/DDWebApp/packages.config rename to webapp-net/Ish/packages.config From 90bd125a7d79935c35a5f314ebc39c8d73b9ebe2 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 5 Apr 2018 15:22:07 +0100 Subject: [PATCH 13/78] TSI-3129 : fixed path --- webapp-net/Ish/Localization/IshLocalization.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-net/Ish/Localization/IshLocalization.cs b/webapp-net/Ish/Localization/IshLocalization.cs index f86985d36..c35fe4af3 100644 --- a/webapp-net/Ish/Localization/IshLocalization.cs +++ b/webapp-net/Ish/Localization/IshLocalization.cs @@ -15,7 +15,7 @@ namespace Sdl.Web.Modules.Ish.Localization ///
public class IshLocalization : Common.Configuration.Localization { - public override string Path { get; set; } = "/"; // content path + public override string Path { get; set; } = ""; // content path public override string CmUriScheme { get; } = "ish"; From 56c2d6e8d1853726fc0ef8cdef72bb9be628b344 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 6 Apr 2018 11:36:07 +0100 Subject: [PATCH 14/78] TSI-3129 : Updated framework reference and added common csproj properties file for easier upgrading --- .../Sdl.Web.Modules.Degrees51.csproj | 5 ++-- webapp-net/51Degrees/packages.config | 2 +- .../Sdl.Web.Modules.AudienceManager.csproj | 6 ++-- webapp-net/AudienceManager/packages.config | 2 +- .../Sdl.Web.Modules.AzureWebApp.csproj | 4 ++- webapp-net/AzureWebApp/packages.config | 2 +- .../Sdl.Web.Modules.ContextExpressions.csproj | 7 +++-- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/Sdl.Web.Modules.Core.csproj | 4 ++- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 20 +++++++++++++ .../SDL.Web.Modules.SmartTarget.csproj | 9 +++--- .../ExperienceOptimization/packages.config | 2 +- .../Sdl.Web.Modules.GoogleAnalytics.csproj | 4 ++- webapp-net/GoogleAnalytics/packages.config | 2 +- .../Impress/Sdl.Web.Modules.Impress.csproj | 4 ++- webapp-net/Impress/packages.config | 2 +- webapp-net/Ish/Sdl.Web.Modules.Ish.csproj | 28 ++++++++++--------- webapp-net/Ish/packages.config | 2 +- .../Sdl.Web.Modules.MediaManager.csproj | 6 ++-- webapp-net/MediaManager/packages.config | 2 +- .../SI4T.Query.CloudSearch/packages.config | 2 +- .../Search/Sdl.Web.Modules.Search.csproj | 4 ++- webapp-net/Search/packages.config | 2 +- webapp-net/Test/Sdl.Web.Modules.Test.csproj | 4 ++- webapp-net/Test/packages.config | 2 +- webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 5 ++-- webapp-net/Ugc/packages.config | 2 +- 28 files changed, 88 insertions(+), 50 deletions(-) create mode 100644 webapp-net/DxaModulesCommon.Props diff --git a/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj b/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj index 198f43d7e..e9cb46579 100644 --- a/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj +++ b/webapp-net/51Degrees/Sdl.Web.Modules.Degrees51.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -13,8 +16,6 @@ 512 - 2.1.0-beta-201803161729 - 10.1.0 true diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 618d05f3c..1e718b0e1 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj index 520f72cb0..110104cfa 100644 --- a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj +++ b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -18,9 +21,6 @@ 12.0 - 2.1.0-beta-201803161729 - 10.1.0 - 8.5.0 true diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 275336d95..6132148a7 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj b/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj index 9f19f55ee..6d29c20d4 100644 --- a/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj +++ b/webapp-net/AzureWebApp/Sdl.Web.Modules.AzureWebApp.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -13,7 +16,6 @@ 512 - 2.1.0-beta-201803161729 true diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 9b7bf27d0..53b37e75c 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj b/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj index 3d0189957..c4bf826f2 100644 --- a/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj +++ b/webapp-net/ContextExpressions/Sdl.Web.Modules.ContextExpressions.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -13,8 +16,6 @@ 512 - 2.0.0 - 2.1.0-beta-201803161729 true @@ -39,7 +40,7 @@ False - ..\packages\Sdl.Dxa.DataModel.$(SdlDxaDataModelPackageVersion)\lib\net452\Sdl.Web.DataModel.dll + ..\packages\Sdl.Dxa.DataModel.$(DxaDataModelVersion)\lib\net452\Sdl.Web.DataModel.dll False diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 8e0b286f1..58d2f30f6 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/Sdl.Web.Modules.Core.csproj b/webapp-net/Core/Sdl.Web.Modules.Core.csproj index fe6af982d..5db9f9719 100644 --- a/webapp-net/Core/Sdl.Web.Modules.Core.csproj +++ b/webapp-net/Core/Sdl.Web.Modules.Core.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -27,7 +30,6 @@ true - 2.1.0-beta-201803161729 true diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 698210b5b..356a7fd51 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props new file mode 100644 index 000000000..0c6c99812 --- /dev/null +++ b/webapp-net/DxaModulesCommon.Props @@ -0,0 +1,20 @@ + + + + + + 2.0.0 + 2.1.0-beta-201804051636 + 10.1.0 + 8.5.0 + 8.5.0 + 10.1.0 + + + \ No newline at end of file diff --git a/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj b/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj index 93bbb7c10..cba404461 100644 --- a/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj +++ b/webapp-net/ExperienceOptimization/SDL.Web.Modules.SmartTarget.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -14,10 +17,6 @@ - 10.1.0 - 2.0.0 - 2.1.0-beta-201803161729 - 8.5.0 true @@ -46,7 +45,7 @@ False - ..\packages\Sdl.Dxa.DataModel.$(SdlDxaDataModelPackageVersion)\lib\net452\Sdl.Web.DataModel.dll + ..\packages\Sdl.Dxa.DataModel.$(DxaDataModelVersion)\lib\net452\Sdl.Web.DataModel.dll False diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 8c0a7c2fb..18b43da47 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj b/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj index 172c40d41..296ac14a9 100644 --- a/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj +++ b/webapp-net/GoogleAnalytics/Sdl.Web.Modules.GoogleAnalytics.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -14,7 +17,6 @@ - 2.1.0-beta-201803161729 true diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index 7d82a6b77..e189b9fde 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj b/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj index 50d091a13..5e5fe76f9 100644 --- a/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj +++ b/webapp-net/Impress/Sdl.Web.Modules.Impress.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -14,7 +17,6 @@ - 2.1.0-beta-201803161729 true diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index 7d82a6b77..e189b9fde 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj b/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj index 62958a52b..f266df313 100644 --- a/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj +++ b/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -11,7 +14,6 @@ Sdl.Web.Modules.Ish v4.5.2 512 - 2.1.0-beta-201803231551 true @@ -31,46 +33,46 @@ 4 - + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll True - + ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll True - + False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll - + False - ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Sdl.Web.Delivery.ServicesCore.dll + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.ServicesCore.dll - + False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll - + False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Tridion.dll - + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll True - + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll True - + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll True - + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll True @@ -81,7 +83,7 @@ - ..\packages\Sdl.Web.Delivery.10.1.0\lib\net452\Tridion.ContentDelivery.dll + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Tridion.ContentDelivery.dll diff --git a/webapp-net/Ish/packages.config b/webapp-net/Ish/packages.config index e928e7ece..c77e164a9 100644 --- a/webapp-net/Ish/packages.config +++ b/webapp-net/Ish/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj b/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj index 56aefc799..05866c5fb 100644 --- a/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj +++ b/webapp-net/MediaManager/Sdl.Web.Modules.MediaManager.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -13,8 +16,7 @@ 512 - - 2.1.0-beta-201803161729 + true diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index 7d82a6b77..e189b9fde 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 27ad8e2b2..baa6bc5b4 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/Sdl.Web.Modules.Search.csproj b/webapp-net/Search/Sdl.Web.Modules.Search.csproj index 05f8380cc..fc0d8c1f6 100644 --- a/webapp-net/Search/Sdl.Web.Modules.Search.csproj +++ b/webapp-net/Search/Sdl.Web.Modules.Search.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -14,7 +17,6 @@ - 2.1.0-beta-201803161729 true diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 47a63a859..266a86c45 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/Sdl.Web.Modules.Test.csproj b/webapp-net/Test/Sdl.Web.Modules.Test.csproj index fe738a387..2afa70997 100644 --- a/webapp-net/Test/Sdl.Web.Modules.Test.csproj +++ b/webapp-net/Test/Sdl.Web.Modules.Test.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -15,7 +18,6 @@ - 2.1.0-beta-201803161729 true diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index 7d82a6b77..e189b9fde 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj index 67259dd33..7f6495c9b 100644 --- a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -1,6 +1,9 @@  + + + Debug AnyCPU @@ -12,8 +15,6 @@ v4.5.2 true 512 - 2.1.0-beta-201803281441 - 10.1.0 true diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index b980bf24f..47b877ff4 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From 2c1244db0970846f67d99d31bbee6f32ef9984e5 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 6 Apr 2018 11:43:10 +0100 Subject: [PATCH 15/78] TSI-3129 : Removed unused stuff --- webapp-net/Ish/Controllers/IshApiController.cs | 14 +------------- webapp-net/Ish/Controllers/IshPageController.cs | 12 ++---------- webapp-net/Ish/Localization/IshLocalization.cs | 4 ---- webapp-net/Ish/Models/PublicationSiteMap.cs | 2 -- 4 files changed, 3 insertions(+), 29 deletions(-) diff --git a/webapp-net/Ish/Controllers/IshApiController.cs b/webapp-net/Ish/Controllers/IshApiController.cs index 66477da5f..0470b611f 100644 --- a/webapp-net/Ish/Controllers/IshApiController.cs +++ b/webapp-net/Ish/Controllers/IshApiController.cs @@ -5,9 +5,6 @@ using Sdl.Web.Delivery.ServicesCore.ClaimStore; using Sdl.Web.Modules.Ish.Providers; using Sdl.Web.Mvc.Formats; -using System.Web; -using System.Web.Configuration; -using Sdl.Web.Mvc.Configuration; namespace Sdl.Web.Modules.Ish.Controllers { @@ -18,12 +15,6 @@ public class IshApiController : BaseController { private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); - private void HandleResponseAttribs() - { - System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; - System.Web.HttpContext.Current.Items["ContentIsEvaluable"] = false; - } - [Route("~/api/page/{publicationId:int}/{pageId:int}")] [Route("~/api/page/{publicationId:int}/{pageId:int}/{*path}")] [HttpGet] @@ -34,10 +25,7 @@ public virtual ActionResult Page(int publicationId, int pageId, string path, str { AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } - PageModel pageModel = IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); - HandleResponseAttribs(); - return Json(pageModel); - //return Content(JsonConvert.SerializeObject(pageModel), "application/json"); + return Json(IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId))); } [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] diff --git a/webapp-net/Ish/Controllers/IshPageController.cs b/webapp-net/Ish/Controllers/IshPageController.cs index 6c36f4f3a..8392929a0 100644 --- a/webapp-net/Ish/Controllers/IshPageController.cs +++ b/webapp-net/Ish/Controllers/IshPageController.cs @@ -4,7 +4,6 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; using Sdl.Web.Common.Models; -using Sdl.Web.Mvc; using Sdl.Web.Mvc.Configuration; namespace Sdl.Web.Modules.Ish.Controllers @@ -49,14 +48,8 @@ protected ActionResult GetPage(int publicationId, int pageId) using (new Tracer(publicationId, pageId)) { try - { - bool addIncludes = true; - object addIncludesViewData; - if (ViewData.TryGetValue(DxaViewDataItems.AddIncludes, out addIncludesViewData)) - { - addIncludes = (bool)addIncludesViewData; - } - PageModel pageModel = null; + { + PageModel pageModel; try { pageModel = IshContentProvider.GetPageModel(pageId, localization); @@ -73,7 +66,6 @@ protected ActionResult GetPage(int publicationId, int pageId) SetupViewData(pageModel); PageModel model = (EnrichModel(pageModel) as PageModel) ?? pageModel; WebRequestContext.PageModel = model; - System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; return View(model.MvcData.ViewName, model); } catch (Exception ex) diff --git a/webapp-net/Ish/Localization/IshLocalization.cs b/webapp-net/Ish/Localization/IshLocalization.cs index c35fe4af3..478e5e5ae 100644 --- a/webapp-net/Ish/Localization/IshLocalization.cs +++ b/webapp-net/Ish/Localization/IshLocalization.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text.RegularExpressions; -using Newtonsoft.Json; -using Sdl.Web.Common; using Sdl.Web.Common.Configuration; -using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; namespace Sdl.Web.Modules.Ish.Localization diff --git a/webapp-net/Ish/Models/PublicationSiteMap.cs b/webapp-net/Ish/Models/PublicationSiteMap.cs index 0e8c843c7..7490a0669 100644 --- a/webapp-net/Ish/Models/PublicationSiteMap.cs +++ b/webapp-net/Ish/Models/PublicationSiteMap.cs @@ -6,9 +6,7 @@ namespace Sdl.Web.Modules.Ish.Models public class PublicationSiteMap : EntityModel { public int PublicationId { get; set; } - public int NamespaceId { get; set; } - public List Urls { get; set; } = new List(); } } From cfdba1593585587d185734027c438efa8d6376db Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 13 Apr 2018 15:30:19 +0100 Subject: [PATCH 16/78] TSI-3161 : Improved Ugc module so it can show & post comments per page/component --- .../Areas/Ugc/Views/Region/Comments.cshtml | 6 + ...cCommentList.cshtml => UgcComments.cshtml} | 3 +- .../Ugc/Views/Ugc/UgcPostCommentForm.cshtml | 7 +- webapp-net/Ugc/Controllers/UgcController.cs | 21 +-- webapp-net/Ugc/Mapping/UgcModelBuilder.cs | 146 ++++++++++++++++++ webapp-net/Ugc/Models/UgcCommentList.cs | 15 -- webapp-net/Ugc/Models/UgcComments.cs | 16 ++ webapp-net/Ugc/Models/UgcPostCommentForm.cs | 9 +- webapp-net/Ugc/Models/UgcRegion.cs | 19 +++ webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 13 +- webapp-net/Ugc/UgcAreaRegistration.cs | 6 +- 11 files changed, 219 insertions(+), 42 deletions(-) create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Region/Comments.cshtml rename webapp-net/Ugc/Areas/Ugc/Views/Ugc/{UgcCommentList.cshtml => UgcComments.cshtml} (80%) create mode 100644 webapp-net/Ugc/Mapping/UgcModelBuilder.cs delete mode 100644 webapp-net/Ugc/Models/UgcCommentList.cs create mode 100644 webapp-net/Ugc/Models/UgcComments.cs create mode 100644 webapp-net/Ugc/Models/UgcRegion.cs diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Region/Comments.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Region/Comments.cshtml new file mode 100644 index 000000000..20fd0f0e9 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Region/Comments.cshtml @@ -0,0 +1,6 @@ +@model UgcRegion +
+
+ @Html.DxaEntities() +
+
\ No newline at end of file diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml similarity index 80% rename from webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml rename to webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml index 8782c9349..52e549ff7 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcCommentList.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml @@ -1,5 +1,4 @@ -@using Sdl.Web.Mvc.Html -@model Sdl.Web.Modules.Ugc.Models.UgcCommentList +@model UgcComments
Showing @Model.Comments.Count comments
diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml index 12665323f..88df0648f 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml @@ -1,4 +1,4 @@ -@model UgcPostCommentForm +@model UgcPostCommentForm
@using (Html.BeginForm()) @@ -24,7 +24,8 @@ @Html.TextAreaFor(m => m.Content, new { @class = "form-control", placeholder = @Model.ContentLabel })
- + +
} -
+
\ No newline at end of file diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index c2bf3f49f..ae57bf677 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using Sdl.Web.Common.Interfaces; using Sdl.Web.Mvc.Controllers; using Sdl.Web.Common.Models; using Sdl.Web.Modules.Ugc.Models; @@ -14,26 +13,22 @@ public class UgcController : EntityController { protected override ViewModel EnrichModel(ViewModel sourceModel) { - UgcService ugc = new UgcService(); - ILocalization localization = WebRequestContext.Localization; - int pubId = int.Parse(localization.Id); - UgcCommentList model = base.EnrichModel(sourceModel) as UgcCommentList; + UgcComments model = base.EnrichModel(sourceModel) as UgcComments; if (model != null) { - int pageId = int.Parse(model.Id); - model.Comments = ugc.GetComments(pubId, pageId, false, new int[] {}, - 0, 0); + UgcService ugc = new UgcService(); + model.Comments = ugc.GetComments(model.Target.PublicationId, model.Target.ItemId, false, new int[] { }, 0, 0); return model; } - + UgcPostCommentForm postForm = base.EnrichModel(sourceModel) as UgcPostCommentForm; - if(postForm != null && MapRequestFormData(postForm) && ModelState.IsValid) + if (postForm != null && MapRequestFormData(postForm) && ModelState.IsValid) { - int pageId = int.Parse(postForm.Id); - ugc.PostComment(pubId, pageId, postForm.UserName, - postForm.EmailAddress, postForm.Content, 0, new Dictionary()); + UgcService ugc = new UgcService(); + ugc.PostComment(postForm.Target.PublicationId, postForm.Target.ItemId, postForm.UserName, postForm.EmailAddress, postForm.Content, 0, new Dictionary()); return new RedirectModel(WebRequestContext.RequestUrl); } + return sourceModel; } } diff --git a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs new file mode 100644 index 000000000..37b2569b3 --- /dev/null +++ b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs @@ -0,0 +1,146 @@ +using System; +using System.Linq; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Logging; +using Sdl.Web.Common.Models; +using Sdl.Web.DataModel; +using Sdl.Web.Modules.Ugc.Models; +using Sdl.Web.Tridion.ContentManager; +using Sdl.Web.Tridion.Mapping; + +namespace Sdl.Web.Modules.Ugc.Mapping +{ + public class UgcModelBuilder : IPageModelBuilder, IEntityModelBuilder + { + private static readonly string ShowCommentsExtData = "UgcShowComments"; + private static readonly string PostCommentsExtData = "UgcPostComments"; + + public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, bool includePageRegions, + ILocalization localization) + { + using (new Tracer(pageModel, pageModelData, localization)) + { + UgcRegion ugcRegion = GetRegion(pageModel); + + foreach (var region in pageModel.Regions) + { + AddCommentsToRegion(ugcRegion, region, localization); + } + + var ugcMetadata = UgcMetadata(pageModelData.PageTemplate.Metadata); + if (ShowComments(ugcMetadata)) + { + ugcRegion.Entities.Add(CreateUgcCommentsEntity(localization, pageModel.Id, ItemType.Page)); + } + if (PostComments(ugcMetadata)) + { + ugcRegion.Entities.Add(CreateUgcPostCommentEntity(localization, pageModel.Id, ItemType.Page, UgcPostFormMetadata(ugcMetadata))); + } + } + } + + private static void AddCommentsToRegion(UgcRegion ugcRegion, RegionModel region, ILocalization localization) + { + if (ugcRegion == region) return; + foreach (var entity in region.Entities.Where(e => e.ExtensionData != null)) + { + if (entity.ExtensionData.ContainsKey(ShowCommentsExtData) && + (bool) entity.ExtensionData[ShowCommentsExtData]) + { + ugcRegion.Entities.Add(CreateUgcCommentsEntity(localization, entity.Id, ItemType.Component)); + } + if (entity.ExtensionData.ContainsKey(PostCommentsExtData) && entity.ExtensionData[PostCommentsExtData] != null) + { + ugcRegion.Entities.Add(CreateUgcPostCommentEntity(localization, entity.Id, ItemType.Component, (ContentModelData)entity.ExtensionData[PostCommentsExtData])); + } + } + + foreach (var childRegion in region.Regions) + { + AddCommentsToRegion(ugcRegion, childRegion, localization); + } + } + + public void BuildEntityModel(ref EntityModel entityModel, EntityModelData entityModelData, Type baseModelType, + ILocalization localization) + { + var ugcMetadata = UgcMetadata(entityModelData.ComponentTemplate.Metadata); + entityModel.SetExtensionData(ShowCommentsExtData, ShowComments(ugcMetadata)); + entityModel.SetExtensionData(PostCommentsExtData, PostComments(ugcMetadata) ? UgcPostFormMetadata(ugcMetadata) : null); + } + + private static UgcRegion GetRegion(PageModel pageModel) + { + UgcRegion ugcRegion; + if (!pageModel.Regions.OfType().Any()) + { + const string areaName = "Ugc"; + const string regionName = "Comments"; + ugcRegion = new UgcRegion(regionName); + ugcRegion.MvcData = new Common.Models.MvcData($"{areaName}:{regionName}"); + pageModel.Regions.Add(ugcRegion); + } + else + { + ugcRegion = pageModel.Regions.OfType().First(); + } + return ugcRegion; + } + + private static UgcComments CreateUgcCommentsEntity(ILocalization localization, string modelId, ItemType itemType) + { + var mvcData = new Common.Models.MvcData("Ugc:Ugc:UgcComments"); + mvcData.ControllerAreaName = "Ugc"; + return new UgcComments + { + Target = + CmUri.FromString( + $"{localization.CmUriScheme}:{localization.Id}-{modelId}-{(int)itemType}"), + MvcData = mvcData + }; + } + + private static UgcPostCommentForm CreateUgcPostCommentEntity(ILocalization localization, string modelId, ItemType itemType, ContentModelData postFormConfig) + { + var mvcData = new Common.Models.MvcData("Ugc:Ugc:UgcPostCommentForm"); + mvcData.ControllerAreaName = "Ugc"; + return new UgcPostCommentForm + { + Target = + CmUri.FromString( + $"{localization.CmUriScheme}:{localization.Id}-{modelId}-{(int)itemType}"), + MvcData = mvcData, + UserNameLabel = GetValue(postFormConfig, "userNameLabel"), + EmailAddressLabel = GetValue(postFormConfig, "emailAddressLabel"), + ContentLabel = GetValue(postFormConfig, "contentLabel"), + SubmitButtonLabel = GetValue(postFormConfig, "submitButtonLabel"), + NoContentMessage = GetValue(postFormConfig, "noContentMessage"), + NoEmailAddressMessage = GetValue(postFormConfig, "noEmailAddressMessage"), + NoUserNameMessage = GetValue(postFormConfig, "noUserNameMessage"), + }; + } + + private static ContentModelData UgcMetadata(ContentModelData metadata) => metadata != null && metadata.ContainsKey("ugcConfig") + ? (ContentModelData) metadata["ugcConfig"] + : null; + + private static ContentModelData UgcPostFormMetadata(ContentModelData metadata) => metadata != null && metadata.ContainsKey("postFormConfig") + ? (ContentModelData)metadata["postFormConfig"] + : null; + + private static T GetValue(ContentModelData metadata, string name) + { + if (metadata == null || !metadata.ContainsKey(name)) return default(T); + var v = metadata[name]; + if (v == null) return default(T); + if (typeof(T) == typeof(bool)) + { + return (T) Convert.ChangeType(v.Equals("Yes"), typeof (T)); + } + return (T) Convert.ChangeType(v, typeof (T)); + } + + private static bool ShowComments(ContentModelData metadata) => GetValue(metadata, "showComments"); + private static bool PostComments(ContentModelData metadata) => GetValue(metadata, "allowPost"); + } +} diff --git a/webapp-net/Ugc/Models/UgcCommentList.cs b/webapp-net/Ugc/Models/UgcCommentList.cs deleted file mode 100644 index 0453d3ad1..000000000 --- a/webapp-net/Ugc/Models/UgcCommentList.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using Sdl.Web.Common.Models; -using Sdl.Web.Modules.Ugc.Data; - -namespace Sdl.Web.Modules.Ugc.Models -{ - [SemanticEntity("UgcCommentList")] - public class UgcCommentList : EntityModel - { - [SemanticProperty("headline")] - public string Headline { get; set; } - - public List Comments { get; set; } - } -} diff --git a/webapp-net/Ugc/Models/UgcComments.cs b/webapp-net/Ugc/Models/UgcComments.cs new file mode 100644 index 000000000..60c94e63d --- /dev/null +++ b/webapp-net/Ugc/Models/UgcComments.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Data; +using Sdl.Web.Tridion.ContentManager; + +namespace Sdl.Web.Modules.Ugc.Models +{ + public class UgcComments : EntityModel + { + [SemanticProperty(IgnoreMapping = true)] + public CmUri Target { get; set; } + + [SemanticProperty(IgnoreMapping = true)] + public List Comments { get; set; } + } +} diff --git a/webapp-net/Ugc/Models/UgcPostCommentForm.cs b/webapp-net/Ugc/Models/UgcPostCommentForm.cs index 6d341f473..a17f0a17c 100644 --- a/webapp-net/Ugc/Models/UgcPostCommentForm.cs +++ b/webapp-net/Ugc/Models/UgcPostCommentForm.cs @@ -1,7 +1,8 @@ using System; +using System.ComponentModel.DataAnnotations; using Sdl.Web.Common; using Sdl.Web.Common.Models; -using System.ComponentModel.DataAnnotations; +using Sdl.Web.Tridion.ContentManager; namespace Sdl.Web.Modules.Ugc.Models { @@ -64,5 +65,11 @@ public class UgcPostCommentForm : EntityModel /// Content not specified message ///
public string NoContentMessage { get; set; } + + /// + /// Target CmUri for comments + /// + [SemanticProperty(IgnoreMapping = true)] + public CmUri Target { get; set; } } } diff --git a/webapp-net/Ugc/Models/UgcRegion.cs b/webapp-net/Ugc/Models/UgcRegion.cs new file mode 100644 index 000000000..b0db27e46 --- /dev/null +++ b/webapp-net/Ugc/Models/UgcRegion.cs @@ -0,0 +1,19 @@ +using System; +using Sdl.Web.Common.Models; + +namespace Sdl.Web.Modules.Ugc.Models +{ + [Serializable] + public class UgcRegion : RegionModel + { + public UgcRegion(string name) + : base(name) + { + } + + public UgcRegion(string name, string qualifiedViewName) + : base(name, qualifiedViewName) + { + } + } +} diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj index 7f6495c9b..c75e15e6c 100644 --- a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -1,9 +1,7 @@  - - - + Debug AnyCPU @@ -99,16 +97,19 @@ - + - + + + - + + diff --git a/webapp-net/Ugc/UgcAreaRegistration.cs b/webapp-net/Ugc/UgcAreaRegistration.cs index b290157a3..86252b937 100644 --- a/webapp-net/Ugc/UgcAreaRegistration.cs +++ b/webapp-net/Ugc/UgcAreaRegistration.cs @@ -9,9 +9,11 @@ public class UgcAreaRegistration : BaseAreaRegistration protected override void RegisterAllViewModels() { - // Entity Views - RegisterViewModel("UgcCommentList", typeof(UgcCommentList), "Ugc"); + // Region + RegisterViewModel("Comments", typeof(UgcRegion)); + // Entity + RegisterViewModel("UgcComments", typeof(UgcComments), "Ugc"); RegisterViewModel("UgcPostCommentForm", typeof(UgcPostCommentForm), "Ugc"); } } From 74fa2a4559beebd6a56c9e230bcff07695adc096 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 16 Apr 2018 11:10:20 +0100 Subject: [PATCH 17/78] TSI-3161 : Added example page rendering Comments region --- .../Areas/Ugc/Views/Page/GeneralPage.cshtml | 29 +++++++++++++++++++ .../Areas/Ugc/Views/Page/_ViewStart.cshtml | 3 ++ .../Ugc/Views/Ugc/UgcPostCommentForm.cshtml | 11 +++---- webapp-net/Ugc/UgcAreaRegistration.cs | 6 +++- 4 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Page/GeneralPage.cshtml create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Page/_ViewStart.cshtml diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Page/GeneralPage.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Page/GeneralPage.cshtml new file mode 100644 index 000000000..69360da37 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Page/GeneralPage.cshtml @@ -0,0 +1,29 @@ +@model PageModel +@{ + bool hasLeftBar = Model.Regions.ContainsKey("Left Navigation") || Model.Regions.ContainsKey("Left"); + int mainContainerSize = hasLeftBar ? 9 : 12; +} +@Html.DxaRegion("Header") +
+ +
+ @Html.DxaRegion("Hero") + @Html.DxaRegion("Content Tools") +
+ @if (hasLeftBar) + { +
+ @Html.DxaRegion("Left Navigation", containerSize: 3) + @Html.DxaRegion("Left", containerSize: 3) +
+ } +
+ @Html.DxaRegions(exclude: "Header,Footer,Hero,Content Tools,Left Navigation,Left,Comments", containerSize: mainContainerSize) +
+
+ @Html.DxaRegion("Comments", containerSize: mainContainerSize) +
+
+
+
+@Html.DxaRegion("Footer") diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Page/_ViewStart.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Page/_ViewStart.cshtml new file mode 100644 index 000000000..efda124b1 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Page/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; +} \ No newline at end of file diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml index 88df0648f..d8cfd84c9 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml @@ -1,6 +1,7 @@ @model UgcPostCommentForm
+ @using (Html.BeginForm()) { if (!WebRequestContext.IsPreview) @@ -15,17 +16,17 @@
}
- @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", placeholder = @Model.UserNameLabel }) + @Html.TextBoxFor(m => m.UserName, new {@class = "form-control", placeholder = @Model.UserNameLabel})
- @Html.TextBoxFor(m => m.EmailAddress, new { @class = "form-control", placeholder = @Model.EmailAddressLabel }) + @Html.TextBoxFor(m => m.EmailAddress, new {@class = "form-control", placeholder = @Model.EmailAddressLabel})
- @Html.TextAreaFor(m => m.Content, new { @class = "form-control", placeholder = @Model.ContentLabel }) + @Html.TextAreaFor(m => m.Content, new {@class = "form-control", placeholder = @Model.ContentLabel})
- - + +
} \ No newline at end of file diff --git a/webapp-net/Ugc/UgcAreaRegistration.cs b/webapp-net/Ugc/UgcAreaRegistration.cs index 86252b937..a7992d380 100644 --- a/webapp-net/Ugc/UgcAreaRegistration.cs +++ b/webapp-net/Ugc/UgcAreaRegistration.cs @@ -1,4 +1,5 @@ -using Sdl.Web.Modules.Ugc.Models; +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Models; using Sdl.Web.Mvc.Configuration; namespace Sdl.Web.Modules.Ugc @@ -15,6 +16,9 @@ protected override void RegisterAllViewModels() // Entity RegisterViewModel("UgcComments", typeof(UgcComments), "Ugc"); RegisterViewModel("UgcPostCommentForm", typeof(UgcPostCommentForm), "Ugc"); + + // Page + RegisterViewModel("GeneralPage", typeof(PageModel)); } } } From 949d393143c0873b32845c1f0c84fc248eceabcc Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 16 Apr 2018 12:20:25 +0100 Subject: [PATCH 18/78] TSI-3161 : Tweak to view rendering --- .../Areas/Ugc/Views/Ugc/UgcComments.cshtml | 29 ++++++++++++++++--- .../Ugc/Views/Ugc/UgcPostCommentForm.cshtml | 2 +- .../Ugc/Controllers/UgcApiController.cs | 8 +++++ webapp-net/Ugc/Data/Comment.cs | 2 ++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml index 52e549ff7..0c0f45a00 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml @@ -4,9 +4,30 @@
@foreach(var comment in Model.Comments) { -

@comment.User.Name

- -

@comment.Content

+
+
+ +
+
+
+ @comment.User.Name + - + +
+
+

@comment.Content

+
+
+ + @comment.Rating + + - + Reply +
+
+
}
- \ No newline at end of file + + + diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml index d8cfd84c9..d50ad3d5f 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcPostCommentForm.cshtml @@ -24,7 +24,7 @@
@Html.TextAreaFor(m => m.Content, new {@class = "form-control", placeholder = @Model.ContentLabel})
-
+
diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index 343eef921..66ae1f95b 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -76,6 +76,14 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = }; } + + [Route("~/api/comments/upvote")] + [Route("{localization}/api/comments/upvote")] + public ActionResult UpVoteComment(int commentId) + { + return Redirect(Request.UrlReferrer?.AbsolutePath); + } + private void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) { PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs index 0d9e904af..24429752e 100644 --- a/webapp-net/Ugc/Data/Comment.cs +++ b/webapp-net/Ugc/Data/Comment.cs @@ -15,6 +15,8 @@ public class Comment public string Content { get; set; } public User User { get; set; } public List Children { get; set; } + + public int Rating { get; set; } = 0; } public class CommentDate From c3e83d7093c14ba5a11e5520714130df65a649ac Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 16 Apr 2018 14:22:20 +0100 Subject: [PATCH 19/78] TSI-3161 : Update to CIL 11.0 --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 4 ++-- webapp-net/AzureWebApp/Web.config | 22 +++++++++---------- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 4 ++-- .../ExperienceOptimization/packages.config | 4 ++-- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/Ish/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- .../SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/App.config | 22 +++++++++---------- webapp-net/Test/packages.config | 2 +- .../Areas/Ugc/Views/Ugc/UgcComments.cshtml | 3 ++- .../Ugc/Controllers/UgcApiController.cs | 2 ++ webapp-net/Ugc/Data/Comment.cs | 1 + webapp-net/Ugc/UgcService.cs | 15 ++++++++++++- webapp-net/Ugc/packages.config | 4 ++-- 21 files changed, 60 insertions(+), 43 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 1e718b0e1..2f4804074 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 6132148a7..09b71d51e 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - - + + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/Web.config b/webapp-net/AzureWebApp/Web.config index 38665117c..742f0ae97 100644 --- a/webapp-net/AzureWebApp/Web.config +++ b/webapp-net/AzureWebApp/Web.config @@ -164,48 +164,48 @@ - + - + - + - + - + - + - + - + - + - + - + diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 53b37e75c..a2039b6c8 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 58d2f30f6..e0785fcb7 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 356a7fd51..507f9f272 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 0c6c99812..8fca84125 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,8 +10,8 @@ 2.0.0 - 2.1.0-beta-201804051636 - 10.1.0 + 2.1.0-beta-201804161500 + 11.0.0-beta-201804142151 8.5.0 8.5.0 10.1.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 18b43da47..b1452eb1d 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -7,7 +7,7 @@ - + - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index e189b9fde..5ffb5015f 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index e189b9fde..5ffb5015f 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ish/packages.config b/webapp-net/Ish/packages.config index c77e164a9..0bdecbf02 100644 --- a/webapp-net/Ish/packages.config +++ b/webapp-net/Ish/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index e189b9fde..5ffb5015f 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index baa6bc5b4..cefe26de4 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 266a86c45..59c3a89f8 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/App.config b/webapp-net/Test/App.config index f780a1d05..c7c9fd1fc 100644 --- a/webapp-net/Test/App.config +++ b/webapp-net/Test/App.config @@ -46,48 +46,48 @@ - + - + - + - + - + - + - + - + - + - + - + diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index e189b9fde..5ffb5015f 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml index 0c0f45a00..0ed640834 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml @@ -1,6 +1,7 @@ @model UgcComments
- Showing @Model.Comments.Count comments +

Comments (@Model.Comments.Count)

+
@foreach(var comment in Model.Comments) { diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index 66ae1f95b..a0534ba73 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -81,6 +81,8 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = [Route("{localization}/api/comments/upvote")] public ActionResult UpVoteComment(int commentId) { + UgcService ugc = new UgcService(); + ugc.UpVoteComment(commentId); return Redirect(Request.UrlReferrer?.AbsolutePath); } diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs index 24429752e..09f590cb0 100644 --- a/webapp-net/Ugc/Data/Comment.cs +++ b/webapp-net/Ugc/Data/Comment.cs @@ -16,6 +16,7 @@ public class Comment public User User { get; set; } public List Children { get; set; } + [JsonIgnore] public int Rating { get; set; } = 0; } diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs index 048340437..ee3101af0 100644 --- a/webapp-net/Ugc/UgcService.cs +++ b/webapp-net/Ugc/UgcService.cs @@ -19,10 +19,12 @@ public class UgcService { private static readonly int MaximumThreadsDepth = -1; private readonly IUgcCommentsApi _api; + private readonly IUgcVoteCommentApi _votingApi; public UgcService() { _api = UgcInstanceProvider.Instance.UgcCommunityClient(); + _votingApi = (IUgcVoteCommentApi) _api; } public List GetComments(int publicationId, int pageId, bool descending, int[] status, int top, int skip) @@ -50,6 +52,16 @@ public List GetComments(int publicationId, int pageId, bool descending, _api.PostComment(CreateUri(publicationId, pageId), username, email, content, parentId, metadata).Result); } + public void UpVoteComment(long commentId) + { + _votingApi.VoteCommentUp(commentId); + } + + public void DownVoteComment(long commentId) + { + _votingApi.VoteCommentDown(commentId); + } + private static CmUri CreateUri(int publicationId, int pageId) { ILocalization localization = WebRequestContext.Localization; @@ -68,7 +80,8 @@ private static Comment Convert(IComment comment) ItemId = comment.ItemId, ItemType = comment.ItemType, ItemPublicationId = comment.ItemPublicationId, - Content = comment.Content + Content = comment.Content, + Rating = comment.Score }; if (comment.User != null) diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 47b877ff4..bf40e848e 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - - + + \ No newline at end of file From e08caa7567d99fd77f27c2d4bee2c61dc3f8382b Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 16 Apr 2018 14:35:35 +0100 Subject: [PATCH 20/78] TSI-3161 : Added missing views to project --- webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj index c75e15e6c..e8c4e546a 100644 --- a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -108,6 +108,8 @@ + + From ff1f705e839b886f1bfe1f18b20f60098550007c Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 16 Apr 2018 16:54:13 +0100 Subject: [PATCH 21/78] TSI-3161 : Updated refs --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 4 ++-- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 4 ++-- webapp-net/ExperienceOptimization/packages.config | 4 ++-- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/Ish/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- webapp-net/Search/SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- webapp-net/Ugc/packages.config | 4 ++-- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 2f4804074..de5a0e3df 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 09b71d51e..24bd56334 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - - + + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index a2039b6c8..7c9c383b8 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index e0785fcb7..5ea9450c5 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 507f9f272..d85565f2e 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 8fca84125..66bf10d19 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,8 +10,8 @@ 2.0.0 - 2.1.0-beta-201804161500 - 11.0.0-beta-201804142151 + 2.1.0-beta-201804161747 + 11.0.0-beta-201804161522 8.5.0 8.5.0 10.1.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index b1452eb1d..97f76e300 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -7,7 +7,7 @@ - + - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index 5ffb5015f..f5b279017 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index 5ffb5015f..f5b279017 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ish/packages.config b/webapp-net/Ish/packages.config index 0bdecbf02..238077a87 100644 --- a/webapp-net/Ish/packages.config +++ b/webapp-net/Ish/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index 5ffb5015f..f5b279017 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index cefe26de4..64c81beb7 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 59c3a89f8..992ef5385 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index 5ffb5015f..f5b279017 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index bf40e848e..03b35d372 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - - + + \ No newline at end of file From cbed5d325cec521fee33852c90999c49c0cbd8c2 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 17 Apr 2018 13:19:19 +0100 Subject: [PATCH 22/78] TSI-3165 : Rename Ish to TridionDocs --- webapp-net/DxaModules.sln | 2 +- webapp-net/Ish/Exceptions/IshApiException.cs | 18 -------- .../Views/TridionDocsPage}/GeneralPage.cshtml | 0 .../Areas/TridionDocs}/Views/web.config | 4 +- .../Controllers/BaseController.cs | 32 ++++++------- .../Controllers/TridionDocsApiController.cs} | 16 +++---- .../Controllers/TridionDocsPageController.cs} | 8 ++-- .../Exceptions/TridionDocsApiException.cs | 18 ++++++++ .../Localization/TridionDocsLocalization.cs} | 8 ++-- .../TridionDocsLocalizationResolver.cs} | 10 ++-- .../Mapping/TridionDocsModelBuilder.cs | 46 +++++++++++++++++++ .../Models/Publication.cs | 2 +- .../Models/PublicationSiteMap.cs | 2 +- .../Models/SiteMapUrlEntry.cs | 2 +- .../{Ish => TridionDocs}/Models/Topic.cs | 2 +- .../TridionDocsNavigationProvider.cs} | 6 +-- .../Properties/AssemblyInfo.cs | 0 .../Providers/ConditionProvider.cs | 2 +- .../Providers/PublicationProvider.cs | 8 ++-- .../Providers/TocProvider.cs | 2 +- .../Providers/TridionDocsContentProvider.cs} | 10 ++-- .../Sdl.Web.Modules.TridionDocs.csproj} | 33 +++++++------ .../TridionDocsModuleAreaRegistration.cs} | 12 ++--- .../{Ish => TridionDocs}/packages.config | 1 + 24 files changed, 147 insertions(+), 97 deletions(-) delete mode 100644 webapp-net/Ish/Exceptions/IshApiException.cs rename webapp-net/{Ish/Areas/Ish/Views/IshPage => TridionDocs/Areas/TridionDocs/Views/TridionDocsPage}/GeneralPage.cshtml (100%) rename webapp-net/{Ish/Areas/Ish => TridionDocs/Areas/TridionDocs}/Views/web.config (93%) rename webapp-net/{Ish => TridionDocs}/Controllers/BaseController.cs (72%) rename webapp-net/{Ish/Controllers/IshApiController.cs => TridionDocs/Controllers/TridionDocsApiController.cs} (84%) rename webapp-net/{Ish/Controllers/IshPageController.cs => TridionDocs/Controllers/TridionDocsPageController.cs} (91%) create mode 100644 webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs rename webapp-net/{Ish/Localization/IshLocalization.cs => TridionDocs/Localization/TridionDocsLocalization.cs} (85%) rename webapp-net/{Ish/Localization/IshLocalizationResolver.cs => TridionDocs/Localization/TridionDocsLocalizationResolver.cs} (58%) create mode 100644 webapp-net/TridionDocs/Mapping/TridionDocsModelBuilder.cs rename webapp-net/{Ish => TridionDocs}/Models/Publication.cs (92%) rename webapp-net/{Ish => TridionDocs}/Models/PublicationSiteMap.cs (87%) rename webapp-net/{Ish => TridionDocs}/Models/SiteMapUrlEntry.cs (78%) rename webapp-net/{Ish => TridionDocs}/Models/Topic.cs (92%) rename webapp-net/{Ish/Navigation/IshNavigationProvider.cs => TridionDocs/Navigation/TridionDocsNavigationProvider.cs} (91%) rename webapp-net/{Ish => TridionDocs}/Properties/AssemblyInfo.cs (100%) rename webapp-net/{Ish => TridionDocs}/Providers/ConditionProvider.cs (97%) rename webapp-net/{Ish => TridionDocs}/Providers/PublicationProvider.cs (96%) rename webapp-net/{Ish => TridionDocs}/Providers/TocProvider.cs (96%) rename webapp-net/{Ish/Providers/IshContentProvider.cs => TridionDocs/Providers/TridionDocsContentProvider.cs} (87%) rename webapp-net/{Ish/Sdl.Web.Modules.Ish.csproj => TridionDocs/Sdl.Web.Modules.TridionDocs.csproj} (80%) rename webapp-net/{Ish/IshModuleAreaRegistration.cs => TridionDocs/TridionDocsModuleAreaRegistration.cs} (55%) rename webapp-net/{Ish => TridionDocs}/packages.config (84%) diff --git a/webapp-net/DxaModules.sln b/webapp-net/DxaModules.sln index b73843ed6..2a0d03705 100644 --- a/webapp-net/DxaModules.sln +++ b/webapp-net/DxaModules.sln @@ -34,7 +34,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.AudienceMan EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ugc", "Ugc\Sdl.Web.Modules.Ugc.csproj", "{54DDEEE6-1F97-4E53-8018-5918F7D90A8B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.Ish", "Ish\Sdl.Web.Modules.Ish.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sdl.Web.Modules.TridionDocs", "TridionDocs\Sdl.Web.Modules.TridionDocs.csproj", "{EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/webapp-net/Ish/Exceptions/IshApiException.cs b/webapp-net/Ish/Exceptions/IshApiException.cs deleted file mode 100644 index b9430aa7b..000000000 --- a/webapp-net/Ish/Exceptions/IshApiException.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Sdl.Web.Modules.Ish.Exceptions -{ - /// - /// Ish Api Exception - /// - public class IshApiException : Exception - { - public IshApiException(string msg) : base(msg) - { - } - - public IshApiException(string msg, Exception innerException) : base(msg, innerException) - { - } - } -} diff --git a/webapp-net/Ish/Areas/Ish/Views/IshPage/GeneralPage.cshtml b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/GeneralPage.cshtml similarity index 100% rename from webapp-net/Ish/Areas/Ish/Views/IshPage/GeneralPage.cshtml rename to webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/GeneralPage.cshtml diff --git a/webapp-net/Ish/Areas/Ish/Views/web.config b/webapp-net/TridionDocs/Areas/TridionDocs/Views/web.config similarity index 93% rename from webapp-net/Ish/Areas/Ish/Views/web.config rename to webapp-net/TridionDocs/Areas/TridionDocs/Views/web.config index a554e3e0c..c17eb43b6 100644 --- a/webapp-net/Ish/Areas/Ish/Views/web.config +++ b/webapp-net/TridionDocs/Areas/TridionDocs/Views/web.config @@ -20,8 +20,8 @@ - - + + diff --git a/webapp-net/Ish/Controllers/BaseController.cs b/webapp-net/TridionDocs/Controllers/BaseController.cs similarity index 72% rename from webapp-net/Ish/Controllers/BaseController.cs rename to webapp-net/TridionDocs/Controllers/BaseController.cs index bc2bbd07d..876813411 100644 --- a/webapp-net/Ish/Controllers/BaseController.cs +++ b/webapp-net/TridionDocs/Controllers/BaseController.cs @@ -3,22 +3,22 @@ using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; -using Sdl.Web.Modules.Ish.Exceptions; -using Sdl.Web.Modules.Ish.Navigation; -using Sdl.Web.Modules.Ish.Providers; +using Sdl.Web.Modules.TridionDocs.Exceptions; +using Sdl.Web.Modules.TridionDocs.Navigation; +using Sdl.Web.Modules.TridionDocs.Providers; using Sdl.Web.Mvc.Configuration; using Tridion.ContentDelivery.Meta; -namespace Sdl.Web.Modules.Ish.Controllers +namespace Sdl.Web.Modules.TridionDocs.Controllers { - [RouteArea("Ish")] + [RouteArea("TridionDocs")] public class BaseController : Mvc.Controllers.PageController { private static readonly string TocNaventriesMeta = "tocnaventries.generated.value"; private static readonly string PageConditionsUsedMeta = "conditionsused.generated.value"; private static readonly string PageLogicalRefObjectId = "ishlogicalref.object.id"; - private IshContentProvider _contentProvider; + private TridionDocsContentProvider _contentProvider; protected ILocalization SetupLocalization(int publicationId) { @@ -69,31 +69,31 @@ protected override ViewModel EnrichModel(ViewModel model) return model; } - protected IshContentProvider IshContentProvider + protected TridionDocsContentProvider TridionDocsContentProvider { get { - if (!(ContentProvider is IshContentProvider)) + if (!(ContentProvider is TridionDocsContentProvider)) { - throw new IshApiException( - "IshContentProvider not configured. Please make sure you have the IshContentProvider specified in your Unity.config"); + throw new TridionDocsApiException( + "TridionDocsContentProvider not configured. Please make sure you have the TridionDocsContentProvider specified in your Unity.config"); } - return ContentProvider as IshContentProvider; + return ContentProvider as TridionDocsContentProvider; } } - protected IshNavigationProvider IshNavigationProvider + protected TridionDocsNavigationProvider TridionDocsNavigationProvider { get { INavigationProvider navProvider = SiteConfiguration.NavigationProvider; - if (!(navProvider is IshNavigationProvider)) + if (!(navProvider is TridionDocsNavigationProvider)) { - throw new IshApiException( - "IshNavigationProvider not configured. Please make sure you have the IshNavigationProvider specified in your Unity.config"); + throw new TridionDocsApiException( + "TridionDocsNavigationProvider not configured. Please make sure you have the TridionDocsNavigationProvider specified in your Unity.config"); } - return navProvider as IshNavigationProvider; + return navProvider as TridionDocsNavigationProvider; } } } diff --git a/webapp-net/Ish/Controllers/IshApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs similarity index 84% rename from webapp-net/Ish/Controllers/IshApiController.cs rename to webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index 0470b611f..c3569de4e 100644 --- a/webapp-net/Ish/Controllers/IshApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -3,15 +3,15 @@ using Sdl.Web.Common; using Sdl.Web.Common.Models; using Sdl.Web.Delivery.ServicesCore.ClaimStore; -using Sdl.Web.Modules.Ish.Providers; +using Sdl.Web.Modules.TridionDocs.Providers; using Sdl.Web.Mvc.Formats; -namespace Sdl.Web.Modules.Ish.Controllers +namespace Sdl.Web.Modules.TridionDocs.Controllers { /// - /// Ish Api Controller + /// TridionDocs Api Controller /// - public class IshApiController : BaseController + public class TridionDocsApiController : BaseController { private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); @@ -25,7 +25,7 @@ public virtual ActionResult Page(int publicationId, int pageId, string path, str { AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } - return Json(IshContentProvider.GetPageModel(pageId, SetupLocalization(publicationId))); + return Json(TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId))); } [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] @@ -34,7 +34,7 @@ public virtual ActionResult Page(int publicationId, int pageId, string path, str [FormatData] public virtual ActionResult Binary(int publicationId, int binaryId) { - StaticContentItem content = IshContentProvider.GetStaticContentItem(binaryId, SetupLocalization(publicationId)); + StaticContentItem content = TridionDocsContentProvider.GetStaticContentItem(binaryId, SetupLocalization(publicationId)); return new FileStreamResult(content.GetContentStream(), content.ContentType); } @@ -56,7 +56,7 @@ public virtual ActionResult Conditions(int publicationId) public virtual ActionResult SitemapXml() { // Use the common SiteMapXml view for rendering out the xml of all the sitemap items. - return View("SiteMapXml", IshNavigationProvider.SiteMap); + return View("SiteMapXml", TridionDocsNavigationProvider.SiteMap); } [Route("~/api/toc/{publicationId:int}")] @@ -92,7 +92,7 @@ public virtual ActionResult TopicIdInTargetPublication(int publicationId, string { throw new DxaItemNotFoundException("Unable to use empty 'ishlogicalref.object.id' value as a search criteria."); } - return Json(IshContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); + return Json(TridionDocsContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); } } } diff --git a/webapp-net/Ish/Controllers/IshPageController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs similarity index 91% rename from webapp-net/Ish/Controllers/IshPageController.cs rename to webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs index 8392929a0..c551659ca 100644 --- a/webapp-net/Ish/Controllers/IshPageController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs @@ -6,12 +6,12 @@ using Sdl.Web.Common.Models; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.Ish.Controllers +namespace Sdl.Web.Modules.TridionDocs.Controllers { /// - /// Ish Page Controller + /// TridionDocs Page Controller /// - public class IshPageController : BaseController + public class TridionDocsPageController : BaseController { [Route("~/")] [Route("~/home")] @@ -52,7 +52,7 @@ protected ActionResult GetPage(int publicationId, int pageId) PageModel pageModel; try { - pageModel = IshContentProvider.GetPageModel(pageId, localization); + pageModel = TridionDocsContentProvider.GetPageModel(pageId, localization); } catch (DxaItemNotFoundException ex) { diff --git a/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs b/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs new file mode 100644 index 000000000..fa5922ff2 --- /dev/null +++ b/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs @@ -0,0 +1,18 @@ +using System; + +namespace Sdl.Web.Modules.TridionDocs.Exceptions +{ + /// + /// TridionDocs Api Exception + /// + public class TridionDocsApiException : Exception + { + public TridionDocsApiException(string msg) : base(msg) + { + } + + public TridionDocsApiException(string msg, Exception innerException) : base(msg, innerException) + { + } + } +} diff --git a/webapp-net/Ish/Localization/IshLocalization.cs b/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs similarity index 85% rename from webapp-net/Ish/Localization/IshLocalization.cs rename to webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs index 478e5e5ae..23d905c6d 100644 --- a/webapp-net/Ish/Localization/IshLocalization.cs +++ b/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs @@ -4,12 +4,12 @@ using Sdl.Web.Common.Configuration; using Sdl.Web.Common.Logging; -namespace Sdl.Web.Modules.Ish.Localization +namespace Sdl.Web.Modules.TridionDocs.Localization { /// - /// Ish Localization Implementation + /// TridionDocs Localization Implementation /// - public class IshLocalization : Common.Configuration.Localization + public class TridionDocsLocalization : Common.Configuration.Localization { public override string Path { get; set; } = ""; // content path @@ -17,7 +17,7 @@ public class IshLocalization : Common.Configuration.Localization public override bool IsXpmEnabled { get; set; } = false; // no xpm on dd-webapp - public override string BinaryCacheFolder => $"{SiteConfiguration.StaticsFolder}\\DDWebApp"; + public override string BinaryCacheFolder => $"{SiteConfiguration.StaticsFolder}\\TridionDocs"; protected override void Load() { diff --git a/webapp-net/Ish/Localization/IshLocalizationResolver.cs b/webapp-net/TridionDocs/Localization/TridionDocsLocalizationResolver.cs similarity index 58% rename from webapp-net/Ish/Localization/IshLocalizationResolver.cs rename to webapp-net/TridionDocs/Localization/TridionDocsLocalizationResolver.cs index c144a598c..e9681ef45 100644 --- a/webapp-net/Ish/Localization/IshLocalizationResolver.cs +++ b/webapp-net/TridionDocs/Localization/TridionDocsLocalizationResolver.cs @@ -2,18 +2,18 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Tridion; -namespace Sdl.Web.Modules.Ish.Localization +namespace Sdl.Web.Modules.TridionDocs.Localization { /// - /// Ish Localization Resolver + /// TridionDocs Localization Resolver /// - public class IshLocalizationResolver : LocalizationResolver + public class TridionDocsLocalizationResolver : LocalizationResolver { private readonly ILocalization _localization; - public IshLocalizationResolver() + public TridionDocsLocalizationResolver() { - _localization = new IshLocalization(); + _localization = new TridionDocsLocalization(); _localization.EnsureInitialized(); } diff --git a/webapp-net/TridionDocs/Mapping/TridionDocsModelBuilder.cs b/webapp-net/TridionDocs/Mapping/TridionDocsModelBuilder.cs new file mode 100644 index 000000000..0cd547608 --- /dev/null +++ b/webapp-net/TridionDocs/Mapping/TridionDocsModelBuilder.cs @@ -0,0 +1,46 @@ +using System; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Models; +using Sdl.Web.DataModel; +using Sdl.Web.Tridion.Mapping; + +namespace Sdl.Web.Modules.TridionDocs.Mapping +{ + /// + /// Tridion Docs Model Builder + /// + /// Remaps 'Ish' mvc area to TridionDocs + /// + /// Add to Web.Config: + /// + /// + /// + /// ... + /// + /// + public class TridionDocsModelBuilder : IPageModelBuilder, IEntityModelBuilder + { + public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, bool includePageRegions, + ILocalization localization) + { + DataModel.MvcData mvcData = pageModelData.MvcData; + RemapMvcAreaName(ref mvcData); + } + + public void BuildEntityModel(ref EntityModel entityModel, EntityModelData entityModelData, Type baseModelType, + ILocalization localization) + { + DataModel.MvcData mvcData = entityModelData.MvcData; + RemapMvcAreaName(ref mvcData); + } + + private void RemapMvcAreaName(ref DataModel.MvcData mvcData) + { + if (mvcData != null && mvcData.AreaName != null && + mvcData.AreaName.Equals("Ish")) + { + mvcData.AreaName = TridionDocsModuleAreaRegistration.AREA_NAME; + } + } + } +} diff --git a/webapp-net/Ish/Models/Publication.cs b/webapp-net/TridionDocs/Models/Publication.cs similarity index 92% rename from webapp-net/Ish/Models/Publication.cs rename to webapp-net/TridionDocs/Models/Publication.cs index 589748b8c..6b09b8a3a 100644 --- a/webapp-net/Ish/Models/Publication.cs +++ b/webapp-net/TridionDocs/Models/Publication.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Sdl.Web.Modules.Ish.Models +namespace Sdl.Web.Modules.TridionDocs.Models { /// /// Publication diff --git a/webapp-net/Ish/Models/PublicationSiteMap.cs b/webapp-net/TridionDocs/Models/PublicationSiteMap.cs similarity index 87% rename from webapp-net/Ish/Models/PublicationSiteMap.cs rename to webapp-net/TridionDocs/Models/PublicationSiteMap.cs index 7490a0669..aa58b8655 100644 --- a/webapp-net/Ish/Models/PublicationSiteMap.cs +++ b/webapp-net/TridionDocs/Models/PublicationSiteMap.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Sdl.Web.Common.Models; -namespace Sdl.Web.Modules.Ish.Models +namespace Sdl.Web.Modules.TridionDocs.Models { public class PublicationSiteMap : EntityModel { diff --git a/webapp-net/Ish/Models/SiteMapUrlEntry.cs b/webapp-net/TridionDocs/Models/SiteMapUrlEntry.cs similarity index 78% rename from webapp-net/Ish/Models/SiteMapUrlEntry.cs rename to webapp-net/TridionDocs/Models/SiteMapUrlEntry.cs index e7fe4b645..1de08fe71 100644 --- a/webapp-net/Ish/Models/SiteMapUrlEntry.cs +++ b/webapp-net/TridionDocs/Models/SiteMapUrlEntry.cs @@ -1,6 +1,6 @@ using System; -namespace Sdl.Web.Modules.Ish.Models +namespace Sdl.Web.Modules.TridionDocs.Models { public class SiteMapUrlEntry { diff --git a/webapp-net/Ish/Models/Topic.cs b/webapp-net/TridionDocs/Models/Topic.cs similarity index 92% rename from webapp-net/Ish/Models/Topic.cs rename to webapp-net/TridionDocs/Models/Topic.cs index 075f166fa..55868dab2 100644 --- a/webapp-net/Ish/Models/Topic.cs +++ b/webapp-net/TridionDocs/Models/Topic.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Sdl.Web.Common.Models; -namespace Sdl.Web.Modules.Ish.Models +namespace Sdl.Web.Modules.TridionDocs.Models { /// /// Topic Entity diff --git a/webapp-net/Ish/Navigation/IshNavigationProvider.cs b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs similarity index 91% rename from webapp-net/Ish/Navigation/IshNavigationProvider.cs rename to webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs index 3ea4f73f2..930139919 100644 --- a/webapp-net/Ish/Navigation/IshNavigationProvider.cs +++ b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs @@ -5,14 +5,14 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; using Sdl.Web.Common.Models.Navigation; -using Sdl.Web.Modules.Ish.Models; +using Sdl.Web.Modules.TridionDocs.Models; using Sdl.Web.Tridion.ContentManager; using Tridion.ContentDelivery.Meta; using Tridion.ContentDelivery.Taxonomies; -namespace Sdl.Web.Modules.Ish.Navigation +namespace Sdl.Web.Modules.TridionDocs.Navigation { - public class IshNavigationProvider : Tridion.Navigation.CILImpl.DynamicNavigationProvider + public class TridionDocsNavigationProvider : Tridion.Navigation.CILImpl.DynamicNavigationProvider { public string GetBaseUrl() { diff --git a/webapp-net/Ish/Properties/AssemblyInfo.cs b/webapp-net/TridionDocs/Properties/AssemblyInfo.cs similarity index 100% rename from webapp-net/Ish/Properties/AssemblyInfo.cs rename to webapp-net/TridionDocs/Properties/AssemblyInfo.cs diff --git a/webapp-net/Ish/Providers/ConditionProvider.cs b/webapp-net/TridionDocs/Providers/ConditionProvider.cs similarity index 97% rename from webapp-net/Ish/Providers/ConditionProvider.cs rename to webapp-net/TridionDocs/Providers/ConditionProvider.cs index 15ad77e0d..a40108e1b 100644 --- a/webapp-net/Ish/Providers/ConditionProvider.cs +++ b/webapp-net/TridionDocs/Providers/ConditionProvider.cs @@ -2,7 +2,7 @@ using Sdl.Web.Common; using Tridion.ContentDelivery.Meta; -namespace Sdl.Web.Modules.Ish.Providers +namespace Sdl.Web.Modules.TridionDocs.Providers { /// /// Condition Provider diff --git a/webapp-net/Ish/Providers/PublicationProvider.cs b/webapp-net/TridionDocs/Providers/PublicationProvider.cs similarity index 96% rename from webapp-net/Ish/Providers/PublicationProvider.cs rename to webapp-net/TridionDocs/Providers/PublicationProvider.cs index ca8a5822b..71c601ea0 100644 --- a/webapp-net/Ish/Providers/PublicationProvider.cs +++ b/webapp-net/TridionDocs/Providers/PublicationProvider.cs @@ -3,11 +3,11 @@ using System.Linq; using Sdl.Web.Common; using Sdl.Web.Common.Logging; -using Sdl.Web.Modules.Ish.Models; +using Sdl.Web.Modules.TridionDocs.Models; using Tridion.ContentDelivery.Meta; -using Sdl.Web.Modules.Ish.Exceptions; +using Sdl.Web.Modules.TridionDocs.Exceptions; -namespace Sdl.Web.Modules.Ish.Providers +namespace Sdl.Web.Modules.TridionDocs.Providers { /// /// Publication Provider @@ -51,7 +51,7 @@ public List PublicationList } catch (Exception e) { - throw new IshApiException("Unable to fetch list of publications.", e); + throw new TridionDocsApiException("Unable to fetch list of publications.", e); } } } diff --git a/webapp-net/Ish/Providers/TocProvider.cs b/webapp-net/TridionDocs/Providers/TocProvider.cs similarity index 96% rename from webapp-net/Ish/Providers/TocProvider.cs rename to webapp-net/TridionDocs/Providers/TocProvider.cs index 48d2fc858..85ac4c9fa 100644 --- a/webapp-net/Ish/Providers/TocProvider.cs +++ b/webapp-net/TridionDocs/Providers/TocProvider.cs @@ -5,7 +5,7 @@ using Sdl.Web.Common.Models.Navigation; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.Ish.Providers +namespace Sdl.Web.Modules.TridionDocs.Providers { /// /// Table of Contents (TOC) Provider diff --git a/webapp-net/Ish/Providers/IshContentProvider.cs b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs similarity index 87% rename from webapp-net/Ish/Providers/IshContentProvider.cs rename to webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs index 1338e1e18..2e0516182 100644 --- a/webapp-net/Ish/Providers/IshContentProvider.cs +++ b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs @@ -1,17 +1,17 @@ using System; using Sdl.Web.Common; -using Sdl.Web.Modules.Ish.Exceptions; +using Sdl.Web.Modules.TridionDocs.Exceptions; using Sdl.Web.Tridion.Mapping; using Tridion.ContentDelivery.DynamicContent.Query; using Tridion.ContentDelivery.Meta; using Sdl.Web.Tridion.ContentManager; -namespace Sdl.Web.Modules.Ish.Providers +namespace Sdl.Web.Modules.TridionDocs.Providers { /// - /// Ish Content Provider + /// TridionDocs Content Provider /// - public class IshContentProvider : DefaultContentProvider + public class TridionDocsContentProvider : DefaultContentProvider { private static readonly string RefFieldName = "ishlogicalref.object.id"; private static readonly string DefaultPublishData = "1900-01-01 00:00:00.000"; @@ -59,7 +59,7 @@ public IItem GetPageIdByIshLogicalReference(int publicationId, string ishLogical if (items.Length > 1) { - throw new IshApiException($"Too many page Ids found in publication with logical ref value {ishLogicalRefValue}"); + throw new TridionDocsApiException($"Too many page Ids found in publication with logical ref value {ishLogicalRefValue}"); } return items[0]; diff --git a/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj similarity index 80% rename from webapp-net/Ish/Sdl.Web.Modules.Ish.csproj rename to webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj index f266df313..73f2e2589 100644 --- a/webapp-net/Ish/Sdl.Web.Modules.Ish.csproj +++ b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj @@ -1,17 +1,15 @@  - - - + Debug AnyCPU {EE523D3E-4A5D-4E01-9FB2-7BF4352F6CE5} Library Properties - Sdl.Web.Modules.Ish - Sdl.Web.Modules.Ish + Sdl.Web.Modules.TridionDocs + Sdl.Web.Modules.TridionDocs v4.5.2 512 @@ -45,6 +43,10 @@ False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll + + False + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\\lib\net452\Sdl.Web.DataModel.dll + False ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.ServicesCore.dll @@ -88,26 +90,27 @@ - - - - - - + + + + + + + - + - + - - + + diff --git a/webapp-net/Ish/IshModuleAreaRegistration.cs b/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs similarity index 55% rename from webapp-net/Ish/IshModuleAreaRegistration.cs rename to webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs index d4fee4c21..d98476e13 100644 --- a/webapp-net/Ish/IshModuleAreaRegistration.cs +++ b/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs @@ -1,16 +1,16 @@ using Sdl.Web.Common.Models; -using Sdl.Web.Modules.Ish.Models; +using Sdl.Web.Modules.TridionDocs.Models; using Sdl.Web.Mvc.Configuration; -namespace Sdl.Web.Modules.Ish +namespace Sdl.Web.Modules.TridionDocs { /// - /// DDWebApp module area registration + /// Tridion Docs module area registration /// - public class IshModuleAreaRegistration : BaseAreaRegistration + public class TridionDocsModuleAreaRegistration : BaseAreaRegistration { - public override string AreaName => "Ish"; - + public static string AREA_NAME = "TridionDocs"; + public override string AreaName => AREA_NAME; protected override void RegisterAllViewModels() { // Entity Views diff --git a/webapp-net/Ish/packages.config b/webapp-net/TridionDocs/packages.config similarity index 84% rename from webapp-net/Ish/packages.config rename to webapp-net/TridionDocs/packages.config index 238077a87..1d8724af3 100644 --- a/webapp-net/Ish/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -6,4 +6,5 @@ + \ No newline at end of file From 611be8d02015ce606436539ec434e0475722dc5a Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 17 Apr 2018 13:52:56 +0100 Subject: [PATCH 23/78] TSI-3165 : Updated refs --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- webapp-net/ExperienceOptimization/packages.config | 2 +- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- webapp-net/Search/SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/packages.config | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index de5a0e3df..571ff319c 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 24bd56334..86e58e92b 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 7c9c383b8..7b2951324 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 5ea9450c5..9c79bbdc0 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index d85565f2e..ba6365c9d 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 66bf10d19..870608264 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,7 +10,7 @@ 2.0.0 - 2.1.0-beta-201804161747 + 2.1.0-beta-201804171440 11.0.0-beta-201804161522 8.5.0 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 97f76e300..7ca111515 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index f5b279017..b6789b5e2 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index f5b279017..b6789b5e2 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index f5b279017..b6789b5e2 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 64c81beb7..7f7226339 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 992ef5385..29b7ac81b 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index f5b279017..b6789b5e2 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index 1d8724af3..18457c8c7 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 03b35d372..b738ab744 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From c359cfc4a1788accfbc1368a1d5c5fbdb4a4feca Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 19 Apr 2018 14:09:46 +0100 Subject: [PATCH 24/78] TSI-3165 : Fixed issue with upvoting in API and tweaked module to split out comment rendering into partial view --- .../Ugc/Views/Ugc/Partials/UgcComment.cshtml | 39 +++++++++++++++++++ .../Areas/Ugc/Views/Ugc/UgcComments.cshtml | 29 +++----------- .../Ugc/Controllers/UgcApiController.cs | 32 +++++++++++---- webapp-net/Ugc/Controllers/UgcController.cs | 18 ++++++--- webapp-net/Ugc/Data/Comment.cs | 7 ++++ webapp-net/Ugc/Mapping/UgcModelBuilder.cs | 4 +- webapp-net/Ugc/Models/UgcComment.cs | 13 +++++++ webapp-net/Ugc/Models/UgcComments.cs | 2 +- webapp-net/Ugc/Models/UgcPostCommentForm.cs | 13 +++++++ webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj | 2 + webapp-net/Ugc/UgcService.cs | 31 ++++++++++++--- 11 files changed, 145 insertions(+), 45 deletions(-) create mode 100644 webapp-net/Ugc/Areas/Ugc/Views/Ugc/Partials/UgcComment.cshtml create mode 100644 webapp-net/Ugc/Models/UgcComment.cs diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/Partials/UgcComment.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/Partials/UgcComment.cshtml new file mode 100644 index 000000000..56401e279 --- /dev/null +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/Partials/UgcComment.cshtml @@ -0,0 +1,39 @@ +@model UgcComment +
+
+ +
+
+ +
+
+
+ @Model.CommentData.User.Name + - + +
+
+

@Model.CommentData.Content

+
+
+ + @Model.CommentData.Rating + + +
+
+
+ + + @foreach (var comment in Model.Comments) + { +
    +
  • + @Html.Partial("Partials/UgcComment", comment) +
  • +
+ } +
+
+ + diff --git a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml index 0ed640834..6cf611202 100644 --- a/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml +++ b/webapp-net/Ugc/Areas/Ugc/Views/Ugc/UgcComments.cshtml @@ -1,32 +1,13 @@ @model UgcComments

Comments (@Model.Comments.Count)

-
+
- @foreach(var comment in Model.Comments) + @foreach (var comment in Model.Comments) { -
-
- -
-
-
- @comment.User.Name - - - -
-
-

@comment.Content

-
-
- - @comment.Rating - - - - Reply -
-
-
+
+ @Html.Partial("Partials/UgcComment", comment) +
}
diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index a0534ba73..f06dbb066 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -2,6 +2,7 @@ using Sdl.Web.Mvc.Controllers; using System.IO; using System.Text; +using System.Threading.Tasks; using System.Web.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; @@ -42,15 +43,13 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = UgcService ugc = new UgcService(); Stream req = Request.InputStream; - req.Seek(0, System.IO.SeekOrigin.Begin); + req.Seek(0, SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); PostedComment posted = JsonConvert.DeserializeObject(json); Dictionary metadata = new Dictionary(); - /* - * TODO: Issue in CIL at the moment when posting metadata so commenting this out until - * CIL is upgraded. + metadata.Add("publicationTitle", posted.PublicationTitle); metadata.Add("publicationUrl", posted.PublicationUrl); metadata.Add("itemTitle", posted.PageTitle); @@ -59,7 +58,7 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = metadata.Add("status", "0"); AddPubIdTitleLangToCommentMetadata(posted, metadata); - */ + Comment result = ugc.PostComment(posted.PublicationId, posted.PageId, posted.Username, @@ -76,13 +75,30 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = }; } - [Route("~/api/comments/upvote")] [Route("{localization}/api/comments/upvote")] - public ActionResult UpVoteComment(int commentId) + public async Task UpVoteComment(int commentId) + { + UgcService ugc = new UgcService(); + await ugc.UpVoteComment(commentId); + return Redirect(Request.UrlReferrer?.AbsolutePath); + } + + [Route("~/api/comments/downvote")] + [Route("{localization}/api/comments/downvote")] + public async Task DownVoteComment(int commentId) + { + UgcService ugc = new UgcService(); + await ugc.DownVoteComment(commentId); + return Redirect(Request.UrlReferrer?.AbsolutePath); + } + + [Route("~/api/comments/remove")] + [Route("{localization}/api/comments/remove")] + public async Task RemoveComment(int commentId) { UgcService ugc = new UgcService(); - ugc.UpVoteComment(commentId); + await ugc.RemoveComment(commentId); return Redirect(Request.UrlReferrer?.AbsolutePath); } diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index ae57bf677..4401a6b42 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; using Sdl.Web.Mvc.Controllers; using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Data; using Sdl.Web.Modules.Ugc.Models; using Sdl.Web.Mvc.Configuration; @@ -10,26 +13,31 @@ namespace Sdl.Web.Modules.Ugc.Controllers /// Ugc Controller ///
public class UgcController : EntityController - { + { protected override ViewModel EnrichModel(ViewModel sourceModel) { UgcComments model = base.EnrichModel(sourceModel) as UgcComments; if (model != null) { - UgcService ugc = new UgcService(); - model.Comments = ugc.GetComments(model.Target.PublicationId, model.Target.ItemId, false, new int[] { }, 0, 0); + var ugcService = new UgcService(); + var comments = ugcService.GetComments(model.Target.PublicationId, model.Target.ItemId, false, new int[] { }, 0, 0); + model.Comments = CreateEntities(comments); return model; } UgcPostCommentForm postForm = base.EnrichModel(sourceModel) as UgcPostCommentForm; if (postForm != null && MapRequestFormData(postForm) && ModelState.IsValid) { - UgcService ugc = new UgcService(); - ugc.PostComment(postForm.Target.PublicationId, postForm.Target.ItemId, postForm.UserName, postForm.EmailAddress, postForm.Content, 0, new Dictionary()); + var ugcService = new UgcService(); + ugcService.PostComment(postForm.Target.PublicationId, postForm.Target.ItemId, postForm.UserName, postForm.EmailAddress, postForm.Content, postForm.ParentId, postForm.Metadata); return new RedirectModel(WebRequestContext.RequestUrl); } return sourceModel; } + + private static List CreateEntities(List comments) => comments.Select(CreateEntity).ToList(); + + private static UgcComment CreateEntity(Comment comment) => new UgcComment {Comments = CreateEntities(comment.Children), CommentData = comment}; } } diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs index 09f590cb0..4052293be 100644 --- a/webapp-net/Ugc/Data/Comment.cs +++ b/webapp-net/Ugc/Data/Comment.cs @@ -7,6 +7,10 @@ namespace Sdl.Web.Modules.Ugc.Data public class Comment { public long Id { get; set; } + + [JsonIgnore] + public long ParentId { get; set; } + public int ItemPublicationId { get; set; } public int ItemId { get; set; } public int ItemType { get; set; } @@ -18,6 +22,9 @@ public class Comment [JsonIgnore] public int Rating { get; set; } = 0; + + [JsonIgnore] + public Dictionary Metadata { get; set; } = new Dictionary(); } public class CommentDate diff --git a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs index 37b2569b3..5a205edc9 100644 --- a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs +++ b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs @@ -96,7 +96,8 @@ private static UgcComments CreateUgcCommentsEntity(ILocalization localization, s Target = CmUri.FromString( $"{localization.CmUriScheme}:{localization.Id}-{modelId}-{(int)itemType}"), - MvcData = mvcData + MvcData = mvcData, + IsVolatile = true }; } @@ -117,6 +118,7 @@ private static UgcPostCommentForm CreateUgcPostCommentEntity(ILocalization local NoContentMessage = GetValue(postFormConfig, "noContentMessage"), NoEmailAddressMessage = GetValue(postFormConfig, "noEmailAddressMessage"), NoUserNameMessage = GetValue(postFormConfig, "noUserNameMessage"), + IsVolatile = true }; } diff --git a/webapp-net/Ugc/Models/UgcComment.cs b/webapp-net/Ugc/Models/UgcComment.cs new file mode 100644 index 000000000..1184dc33f --- /dev/null +++ b/webapp-net/Ugc/Models/UgcComment.cs @@ -0,0 +1,13 @@ +using Sdl.Web.Common.Models; +using Sdl.Web.Modules.Ugc.Data; +using System.Collections.Generic; + +namespace Sdl.Web.Modules.Ugc.Models +{ + public class UgcComment : EntityModel + { + public Comment CommentData { get; set; } + + public List Comments { get; set; } + } +} diff --git a/webapp-net/Ugc/Models/UgcComments.cs b/webapp-net/Ugc/Models/UgcComments.cs index 60c94e63d..0a4921bb9 100644 --- a/webapp-net/Ugc/Models/UgcComments.cs +++ b/webapp-net/Ugc/Models/UgcComments.cs @@ -11,6 +11,6 @@ public class UgcComments : EntityModel public CmUri Target { get; set; } [SemanticProperty(IgnoreMapping = true)] - public List Comments { get; set; } + public List Comments { get; set; } } } diff --git a/webapp-net/Ugc/Models/UgcPostCommentForm.cs b/webapp-net/Ugc/Models/UgcPostCommentForm.cs index a17f0a17c..3b27e4a37 100644 --- a/webapp-net/Ugc/Models/UgcPostCommentForm.cs +++ b/webapp-net/Ugc/Models/UgcPostCommentForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Sdl.Web.Common; using Sdl.Web.Common.Models; @@ -31,6 +32,18 @@ public class UgcPostCommentForm : EntityModel [SemanticProperty(IgnoreMapping = true)] public string Content { get; set; } + /// + /// Metadata of comment to post + /// + [SemanticProperty(IgnoreMapping = true)] + public Dictionary Metadata { get; set; } + + /// + /// Parent id of comment to post + /// + [SemanticProperty(IgnoreMapping = true)] + public int ParentId { get; set; } = 0; + /// /// Label text for username input control on view /// diff --git a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj index e8c4e546a..6ba7d8d5a 100644 --- a/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj +++ b/webapp-net/Ugc/Sdl.Web.Modules.Ugc.csproj @@ -100,6 +100,7 @@ + @@ -111,6 +112,7 @@ + diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs index ee3101af0..60a251a05 100644 --- a/webapp-net/Ugc/UgcService.cs +++ b/webapp-net/Ugc/UgcService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Threading.Tasks; using Sdl.Web.Common.Interfaces; using Sdl.Web.Delivery.UGC; using Sdl.Web.Delivery.UGC.Model; @@ -36,7 +37,7 @@ public List GetComments(int publicationId, int pageId, bool descending, Depth = MaximumThreadsDepth, Statuses = new List(new List(status).Select(x => (Status)x)) }; - return Convert(_api.RetrieveFlatComments(CreateUri(publicationId, pageId), filter, descending, false)); + return Convert(_api.RetrieveThreadedComments(CreateUri(publicationId, pageId), filter, descending, true)); } public Comment PostComment(int publicationId, int pageId, string username, string email, string content, @@ -52,14 +53,19 @@ public List GetComments(int publicationId, int pageId, bool descending, _api.PostComment(CreateUri(publicationId, pageId), username, email, content, parentId, metadata).Result); } - public void UpVoteComment(long commentId) + public async Task UpVoteComment(long commentId) { - _votingApi.VoteCommentUp(commentId); + await _votingApi.VoteCommentUp(commentId); } - public void DownVoteComment(long commentId) + public async Task DownVoteComment(long commentId) { - _votingApi.VoteCommentDown(commentId); + await _votingApi.VoteCommentDown(commentId); + } + + public async Task RemoveComment(long commentId) + { + return await _api.RemoveComment(commentId); } private static CmUri CreateUri(int publicationId, int pageId) @@ -77,11 +83,13 @@ private static Comment Convert(IComment comment) Comment c = new Comment { Id = comment.Id, + ParentId = comment.ParentId, ItemId = comment.ItemId, ItemType = comment.ItemType, ItemPublicationId = comment.ItemPublicationId, Content = comment.Content, - Rating = comment.Score + Rating = comment.Score, + Metadata = Convert(comment.Metadata) }; if (comment.User != null) @@ -103,6 +111,17 @@ private static Comment Convert(IComment comment) return c; } + private static Dictionary Convert(List meta) + { + var metadata = new Dictionary(); + if(meta == null) return metadata; + foreach (var m in meta.Where(m => !metadata.ContainsKey(m.KeyName))) + { + metadata.Add(m.KeyName, m.KeyValue); + } + return metadata; + } + private static User Convert(IUser user) => new User { Id = user.Id, From 2a41242e27778d307fbbd7570afaacc68c584f6f Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 19 Apr 2018 14:13:50 +0100 Subject: [PATCH 25/78] TSI-3165 : Updated refs to newer CIL --- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- webapp-net/ExperienceOptimization/packages.config | 2 +- webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/packages.config | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 86e58e92b..596662277 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -7,5 +7,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 870608264..ef828eeb1 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -11,7 +11,7 @@ 2.0.0 2.1.0-beta-201804171440 - 11.0.0-beta-201804161522 + 11.0.0-beta-201804191206 8.5.0 8.5.0 10.1.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 7ca111515..f498c499b 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index 18457c8c7..feb161de9 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index b738ab744..1fdbb9f3e 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file From 815ee2717745d4bd65fcab0ad242f6a0b96b6bda Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 20 Apr 2018 12:15:30 +0100 Subject: [PATCH 26/78] TSI-3165 : Tweak to model builder --- webapp-net/Ugc/Mapping/UgcModelBuilder.cs | 101 ++++++++++++++++++---- 1 file changed, 84 insertions(+), 17 deletions(-) diff --git a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs index 5a205edc9..ffd18f2d8 100644 --- a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs +++ b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Logging; @@ -10,54 +11,107 @@ namespace Sdl.Web.Modules.Ugc.Mapping { + /// + /// Ugc Model Builder + /// public class UgcModelBuilder : IPageModelBuilder, IEntityModelBuilder { private static readonly string ShowCommentsExtData = "UgcShowComments"; private static readonly string PostCommentsExtData = "UgcPostComments"; + private static readonly string CommentsEntityRegionExt = "CommentsEntityRegion"; public void BuildPageModel(ref PageModel pageModel, PageModelData pageModelData, bool includePageRegions, ILocalization localization) { using (new Tracer(pageModel, pageModelData, localization)) { - UgcRegion ugcRegion = GetRegion(pageModel); + var ugcMetadata = UgcMetadata(pageModelData.PageTemplate.Metadata); - foreach (var region in pageModel.Regions) - { - AddCommentsToRegion(ugcRegion, region, localization); + string regionName = GetValue(ugcMetadata, "commentsRegion"); + string areaName = pageModel.MvcData.AreaName; + RegionModel ugcRegion; + if (string.IsNullOrEmpty(regionName)) + { + areaName = "Ugc"; + regionName = "Comments"; + ugcRegion = FindRegion(pageModel.Regions, "Comments") ?? + CreateRegion(pageModel, areaName, regionName); + } + else + { + ugcRegion = FindRegion(pageModel.Regions, regionName); + if (ugcRegion == null) + { + Log.Error("Unable to locate region for comments '" + regionName + "'."); + } } - var ugcMetadata = UgcMetadata(pageModelData.PageTemplate.Metadata); - if (ShowComments(ugcMetadata)) + // Entity Comments + foreach (var region in pageModel.Regions) { - ugcRegion.Entities.Add(CreateUgcCommentsEntity(localization, pageModel.Id, ItemType.Page)); + AddCommentsViews(pageModel, region, localization, ugcRegion); } - if (PostComments(ugcMetadata)) + + if (ugcRegion != null) { - ugcRegion.Entities.Add(CreateUgcPostCommentEntity(localization, pageModel.Id, ItemType.Page, UgcPostFormMetadata(ugcMetadata))); + // Page Comments + if (ShowComments(ugcMetadata)) + { + ugcRegion.Entities.Add(CreateUgcCommentsEntity(localization, pageModel.Id, ItemType.Page)); + } + if (PostComments(ugcMetadata)) + { + ugcRegion.Entities.Add(CreateUgcPostCommentEntity(localization, pageModel.Id, ItemType.Page, + UgcPostFormMetadata(ugcMetadata))); + } } } } - private static void AddCommentsToRegion(UgcRegion ugcRegion, RegionModel region, ILocalization localization) + private static void AddCommentsViews(PageModel pageModel, RegionModel region, ILocalization localization, RegionModel ugcRegion) { - if (ugcRegion == region) return; + List regionEntities = new List(); + foreach (var entity in region.Entities.Where(e => e.ExtensionData != null)) { + if (entity.ExtensionData == null) continue; + + // comments get added to the ugcRegion if it exists else we place in same region as entity + IList entities = ugcRegion != null ? ugcRegion.Entities : regionEntities; + if (entity.ExtensionData.ContainsKey(CommentsEntityRegionExt)) + { + // comment region specified for this entity so lets find it and use that + var targetRegion = FindRegion(pageModel.Regions, (string) entity.ExtensionData[CommentsEntityRegionExt]); + if (targetRegion != null && targetRegion != region) + { + entities = targetRegion.Entities; + } + else if (targetRegion == null || targetRegion == region) + { + entities = regionEntities; + } + } + if (entity.ExtensionData.ContainsKey(ShowCommentsExtData) && (bool) entity.ExtensionData[ShowCommentsExtData]) { - ugcRegion.Entities.Add(CreateUgcCommentsEntity(localization, entity.Id, ItemType.Component)); + entities.Add(CreateUgcCommentsEntity(localization, entity.Id, ItemType.Component)); } if (entity.ExtensionData.ContainsKey(PostCommentsExtData) && entity.ExtensionData[PostCommentsExtData] != null) { - ugcRegion.Entities.Add(CreateUgcPostCommentEntity(localization, entity.Id, ItemType.Component, (ContentModelData)entity.ExtensionData[PostCommentsExtData])); + entities.Add(CreateUgcPostCommentEntity(localization, entity.Id, ItemType.Component, (ContentModelData)entity.ExtensionData[PostCommentsExtData])); } } + // Add our ugc views to either the same region as the entity we have comments enabled for or the ugc "Comments" region if available + foreach (var x in regionEntities) + { + region.Entities.Add(x); + } + foreach (var childRegion in region.Regions) { - AddCommentsToRegion(ugcRegion, childRegion, localization); + AddCommentsViews(pageModel, childRegion, localization, ugcRegion); } } @@ -67,15 +121,26 @@ private static void AddCommentsToRegion(UgcRegion ugcRegion, RegionModel region, var ugcMetadata = UgcMetadata(entityModelData.ComponentTemplate.Metadata); entityModel.SetExtensionData(ShowCommentsExtData, ShowComments(ugcMetadata)); entityModel.SetExtensionData(PostCommentsExtData, PostComments(ugcMetadata) ? UgcPostFormMetadata(ugcMetadata) : null); + entityModel.SetExtensionData(CommentsEntityRegionExt, GetCommentsRegion(ugcMetadata)); } - private static UgcRegion GetRegion(PageModel pageModel) + private static RegionModel FindRegion(RegionModelSet regionModelSet, string regionName) + { + foreach (var region in regionModelSet) + { + if (region.Name.Equals(regionName)) return region; + RegionModel childRegion = FindRegion(region.Regions, regionName); + if (childRegion != null) return childRegion; + } + + return null; + } + + private static UgcRegion CreateRegion(PageModel pageModel, string areaName, string regionName) { UgcRegion ugcRegion; if (!pageModel.Regions.OfType().Any()) { - const string areaName = "Ugc"; - const string regionName = "Comments"; ugcRegion = new UgcRegion(regionName); ugcRegion.MvcData = new Common.Models.MvcData($"{areaName}:{regionName}"); pageModel.Regions.Add(ugcRegion); @@ -122,6 +187,8 @@ private static UgcPostCommentForm CreateUgcPostCommentEntity(ILocalization local }; } + private static string GetCommentsRegion(ContentModelData metadata) => GetValue(metadata, "commentsRegion"); + private static ContentModelData UgcMetadata(ContentModelData metadata) => metadata != null && metadata.ContainsKey("ugcConfig") ? (ContentModelData) metadata["ugcConfig"] : null; From 36d181e2497f840ad17634da99063865ffb2c2f8 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 23 Apr 2018 11:23:44 +0100 Subject: [PATCH 27/78] TSI-3165 : Fix for null metadata --- webapp-net/Ugc/Mapping/UgcModelBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs index ffd18f2d8..d018f0d4a 100644 --- a/webapp-net/Ugc/Mapping/UgcModelBuilder.cs +++ b/webapp-net/Ugc/Mapping/UgcModelBuilder.cs @@ -25,7 +25,7 @@ public class UgcModelBuilder : IPageModelBuilder, IEntityModelBuilder { using (new Tracer(pageModel, pageModelData, localization)) { - var ugcMetadata = UgcMetadata(pageModelData.PageTemplate.Metadata); + var ugcMetadata = UgcMetadata(pageModelData.PageTemplate?.Metadata); string regionName = GetValue(ugcMetadata, "commentsRegion"); string areaName = pageModel.MvcData.AreaName; @@ -118,7 +118,7 @@ private static void AddCommentsViews(PageModel pageModel, RegionModel region, IL public void BuildEntityModel(ref EntityModel entityModel, EntityModelData entityModelData, Type baseModelType, ILocalization localization) { - var ugcMetadata = UgcMetadata(entityModelData.ComponentTemplate.Metadata); + var ugcMetadata = UgcMetadata(entityModelData.ComponentTemplate?.Metadata); entityModel.SetExtensionData(ShowCommentsExtData, ShowComments(ugcMetadata)); entityModel.SetExtensionData(PostCommentsExtData, PostComments(ugcMetadata) ? UgcPostFormMetadata(ugcMetadata) : null); entityModel.SetExtensionData(CommentsEntityRegionExt, GetCommentsRegion(ugcMetadata)); From d0005f20697a28d9f1a8a931249d3505918b207e Mon Sep 17 00:00:00 2001 From: Alexey Zarakovskiy Date: Mon, 23 Apr 2018 15:32:59 +0200 Subject: [PATCH 28/78] TSI-3187 Added namespace information to the R2 model (TSI-3131) --- .../smarttarget/mapping/SmartTargetPageBuilderTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp-java/dxa-module-smarttarget/src/test/java/com/sdl/dxa/modules/smarttarget/mapping/SmartTargetPageBuilderTest.java b/webapp-java/dxa-module-smarttarget/src/test/java/com/sdl/dxa/modules/smarttarget/mapping/SmartTargetPageBuilderTest.java index 767b1937a..ceb2b4dfe 100644 --- a/webapp-java/dxa-module-smarttarget/src/test/java/com/sdl/dxa/modules/smarttarget/mapping/SmartTargetPageBuilderTest.java +++ b/webapp-java/dxa-module-smarttarget/src/test/java/com/sdl/dxa/modules/smarttarget/mapping/SmartTargetPageBuilderTest.java @@ -101,7 +101,7 @@ public void shouldHavePositiveePriority() { public void shouldReturnNullIfPageModelIsNull() { //when, then //noinspection ConstantConditions - assertNull(pageBuilder.buildPageModel(null, new PageModelData("", null, null, null, null, null, null))); + assertNull(pageBuilder.buildPageModel(null, new PageModelData("", "tcm", null, null, null, null, null, null))); } @Test @@ -112,7 +112,7 @@ public void shouldNotChangePageModelWithoutSTRegionsOnPage() throws DxaException PageModel expected = createPageModel(new RegionModelImpl("test")); //when - PageModel page2 = pageBuilder.buildPageModel(pageModel, new PageModelData("", null, null, null, null, null, null)); + PageModel page2 = pageBuilder.buildPageModel(pageModel, new PageModelData("", "tcm", null, null, null, null, null, null)); //then Assert.assertEquals(expected, pageModel); @@ -134,7 +134,7 @@ public void shouldNotChangePageModelWithoutRegionsMetadata() throws DxaException PageModel expected = createPageModel(new SmartTargetRegion("test")); //when - PageModel pageR2 = pageBuilder.buildPageModel(pageModel, new PageModelData("", null, null, null, null, null, "")); + PageModel pageR2 = pageBuilder.buildPageModel(pageModel, new PageModelData("", "tcm", null, null, null, null, null, "")); //then Assert.assertEquals(expected, pageModel); @@ -148,7 +148,7 @@ private void shouldCallSubclassForSmartTargetAndProcessMetadata_R2(String maxIte RegionModelData regionModelData = RegionModelData.builder().name("test").metadata(new ContentModelData() {{ put("maxItems", maxItemsValue); }}).build(); - PageModelData pageModelData = new PageModelData("id", null, Collections.emptyMap(), null, "title", Lists.newArrayList(regionModelData), ""); + PageModelData pageModelData = new PageModelData("id", "tcm", null, Collections.emptyMap(), null, "title", Lists.newArrayList(regionModelData), ""); SmartTargetPageModel stPageModel = Mockito.mock(SmartTargetPageModel.class); Mockito.when(stPageModel.setAllowDuplicates(Matchers.anyBoolean())).thenReturn(stPageModel); From 8ca34f088e5063d1d500f6884efe5fe3c00e9494 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 23 Apr 2018 16:42:36 +0100 Subject: [PATCH 29/78] TSI-3188 : Updated AM refs --- .../AudienceManager/Sdl.Web.Modules.AudienceManager.csproj | 6 ++---- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj index 110104cfa..fbd09f1a3 100644 --- a/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj +++ b/webapp-net/AudienceManager/Sdl.Web.Modules.AudienceManager.csproj @@ -1,9 +1,7 @@  - - - + Debug AnyCPU @@ -84,7 +82,7 @@ ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Tridion.ContentDelivery.AmbientData.dll - false + True ..\packages\Sdl.AudienceManager.ContentDelivery.$(AudienceManagerVersion)\lib\net452\Tridion.OutboundEmail.ContentDelivery.dll diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 596662277..c52169ceb 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -5,7 +5,7 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index ef828eeb1..c580285c2 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -12,7 +12,7 @@ 2.0.0 2.1.0-beta-201804171440 11.0.0-beta-201804191206 - 8.5.0 + 9.0.0-beta-201804031026 8.5.0 10.1.0 From 194fc257d76e8fc80f161437d8b2315a43c106a0 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 24 Apr 2018 16:08:42 +0100 Subject: [PATCH 30/78] TSI-3191 : Updated refs to latest packages of framework and datamodel --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 4 ++-- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 4 ++-- webapp-net/ExperienceOptimization/packages.config | 4 ++-- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- webapp-net/Search/SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/packages.config | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 571ff319c..1aff5c1f6 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index c52169ceb..de0a4ad76 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 7b2951324..8224a2782 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 9c79bbdc0..a370f010b 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index ba6365c9d..ce9aa8dee 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index c580285c2..0c6d8b004 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -9,8 +9,8 @@ --> - 2.0.0 - 2.1.0-beta-201804171440 + 2.1.0-beta-201804241437 + 2.1.0-beta-201804241702 11.0.0-beta-201804191206 9.0.0-beta-201804031026 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index f498c499b..4f8e835a7 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -6,8 +6,8 @@ - + - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index b6789b5e2..d0d323618 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index b6789b5e2..d0d323618 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index b6789b5e2..d0d323618 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 7f7226339..620010ec3 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 29b7ac81b..08cdc0c4d 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index b6789b5e2..d0d323618 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index feb161de9..2083f416f 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 1fdbb9f3e..5edd7ace8 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From c6b2f3179643f1a19583d02c77fdfe6944fc6381 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 25 Apr 2018 12:34:36 +0100 Subject: [PATCH 31/78] TSI-3195 : Added validation to user name in UGC + updated framework refs --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- .../ExperienceOptimization/packages.config | 2 +- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- .../SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/Controllers/UgcController.cs | 20 ++++++++++++++----- webapp-net/Ugc/Models/UgcPostCommentForm.cs | 2 ++ webapp-net/Ugc/packages.config | 2 +- 17 files changed, 32 insertions(+), 20 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index 1aff5c1f6..aa2ad3ec3 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index de0a4ad76..7b8d0c446 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 8224a2782..8b18c162e 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index a370f010b..1d2d02bd9 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index ce9aa8dee..5942ba98e 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 0c6d8b004..494701483 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,7 +10,7 @@ 2.1.0-beta-201804241437 - 2.1.0-beta-201804241702 + 2.1.0-beta-201804251327 11.0.0-beta-201804191206 9.0.0-beta-201804031026 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 4f8e835a7..5a10a67bf 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index d0d323618..55868620a 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index d0d323618..55868620a 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index d0d323618..55868620a 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 620010ec3..63421bb4c 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 08cdc0c4d..029379a6e 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index d0d323618..55868620a 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index 2083f416f..45c66e6f8 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index 4401a6b42..bc03d05a3 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using System.Web.Mvc; using Sdl.Web.Mvc.Controllers; using Sdl.Web.Common.Models; using Sdl.Web.Modules.Ugc.Data; @@ -19,12 +18,23 @@ protected override ViewModel EnrichModel(ViewModel sourceModel) UgcComments model = base.EnrichModel(sourceModel) as UgcComments; if (model != null) { - var ugcService = new UgcService(); - var comments = ugcService.GetComments(model.Target.PublicationId, model.Target.ItemId, false, new int[] { }, 0, 0); - model.Comments = CreateEntities(comments); + if (Request.HttpMethod == "POST") + { + // don't retrieve comments on a POST and to keep rendering happy give it an + // empty list + model.Comments = new List(); + } + else + { + var ugcService = new UgcService(); + var comments = ugcService.GetComments(model.Target.PublicationId, model.Target.ItemId, false, + new int[] {}, 0, 0); + model.Comments = CreateEntities(comments); + } + return model; } - + UgcPostCommentForm postForm = base.EnrichModel(sourceModel) as UgcPostCommentForm; if (postForm != null && MapRequestFormData(postForm) && ModelState.IsValid) { diff --git a/webapp-net/Ugc/Models/UgcPostCommentForm.cs b/webapp-net/Ugc/Models/UgcPostCommentForm.cs index 3b27e4a37..a71fcb723 100644 --- a/webapp-net/Ugc/Models/UgcPostCommentForm.cs +++ b/webapp-net/Ugc/Models/UgcPostCommentForm.cs @@ -15,6 +15,7 @@ public class UgcPostCommentForm : EntityModel /// Holds the form control value for username ///
[Required(ErrorMessage = "@Model.NoUserNameMessage")] + [StringLength(80)] [SemanticProperty(IgnoreMapping = true)] public string UserName { get; set; } @@ -22,6 +23,7 @@ public class UgcPostCommentForm : EntityModel /// Holds the form control value for email address ///
[Required(ErrorMessage = "@Model.NoEmailAddressMessage")] + [StringLength(255)] [SemanticProperty(IgnoreMapping = true)] public string EmailAddress { get; set; } diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 5edd7ace8..3f8298bc9 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From 31b5f61d9bae99e52741b25d7ecc3d6b1b910097 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Wed, 25 Apr 2018 16:35:17 +0200 Subject: [PATCH 32/78] UGC Module added. First commit, for safekeeping only --- webapp-java/build.gradle | 3 +- webapp-java/dxa-module-ugc/pom.xml | 80 ++++++ .../sdl/dxa/modules/ugc/UgcInitializer.java | 47 ++++ .../com/sdl/dxa/modules/ugc/UgcService.java | 175 ++++++++++++ .../ugc/controllers/UgcApiController.java | 17 ++ .../ugc/controllers/UgcController.java | 59 ++++ .../com/sdl/dxa/modules/ugc/data/Comment.java | 66 +++++ .../dxa/modules/ugc/data/PostedComment.java | 28 ++ .../dxa/modules/ugc/data/PubIdTitleLang.java | 13 + .../com/sdl/dxa/modules/ugc/data/User.java | 14 + .../modules/ugc/mapping/UgcModelBuilder.java | 262 ++++++++++++++++++ .../ugc/mock/mockUgcVoteCommentApi.java | 13 + .../modules/ugc/model/entity/UgcComment.java | 24 ++ .../modules/ugc/model/entity/UgcComments.java | 26 ++ .../ugc/model/entity/UgcPostCommentForm.java | 93 +++++++ .../modules/ugc/model/entity/UgcRegion.java | 48 ++++ .../WEB-INF/Views/Ugc/Entity/UgcComments.jsp | 37 +++ .../Views/Ugc/Entity/UgcPostCommentForm.jsp | 38 +++ .../WEB-INF/Views/Ugc/Page/GeneralPage.jsp | 67 +++++ .../WEB-INF/Views/Ugc/Region/Comments.jsp | 8 + 20 files changed, 1117 insertions(+), 1 deletion(-) create mode 100644 webapp-java/dxa-module-ugc/pom.xml create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java create mode 100644 webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp create mode 100644 webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp create mode 100644 webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp create mode 100644 webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Region/Comments.jsp diff --git a/webapp-java/build.gradle b/webapp-java/build.gradle index 115ed51ba..ca6f90d57 100644 --- a/webapp-java/build.gradle +++ b/webapp-java/build.gradle @@ -35,7 +35,8 @@ task buildModules(type: MavenBuildTask) { "dxa-module-googleanalytics", "dxa-module-mediamanager", "dxa-module-search", - "dxa-module-51degrees" + "dxa-module-51degrees", + "dxa-module-ugc" ], ["dxa-module-test"] ] diff --git a/webapp-java/dxa-module-ugc/pom.xml b/webapp-java/dxa-module-ugc/pom.xml new file mode 100644 index 000000000..403a35734 --- /dev/null +++ b/webapp-java/dxa-module-ugc/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + com.sdl.dxa + dxa-oss-parent + 2.1.0-SNAPSHOT + + + com.sdl.dxa.modules + dxa-module-ugc + + DXA Modules - UGC + Implementation of DXA UGC module + + + https://github.com/sdl/dxa-modules + scm:git:git@github.com:sdl/dxa-modules.git + scm:git:git@github.com:sdl/dxa-modules.git + HEAD + + + + + com.sdl.dxa + dxa-common-api + + + com.sdl.dxa + dxa-tridion-provider + + + + com.sdl.web + cil + pom + + + + + javax.servlet + javax.servlet-api + + + javax.servlet + jstl + + + + + org.springframework + spring-test + + + + junit + junit + + + org.mockito + mockito-all + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + \ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java new file mode 100644 index 000000000..450783ac6 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -0,0 +1,47 @@ +package com.sdl.dxa.modules.ugc; + +import com.sdl.delivery.ugc.client.comment.UgcCommentApi; +import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; +import com.sdl.delivery.ugc.client.comment.impl.DefaultUgcCommentApi; +import com.sdl.dxa.modules.ugc.mock.mockUgcVoteCommentApi; +import com.sdl.dxa.modules.ugc.model.entity.UgcComments; +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.dxa.modules.ugc.model.entity.UgcRegion; +import com.sdl.webapp.common.api.mapping.views.AbstractModuleInitializer; +import com.sdl.webapp.common.api.mapping.views.ModuleInfo; +import com.sdl.webapp.common.api.mapping.views.RegisteredViewModel; +import com.sdl.webapp.common.api.mapping.views.RegisteredViewModels; +import com.sdl.webapp.common.api.model.page.DefaultPageModel; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +@Configuration +@ComponentScan("com.sdl.dxa.modules.ugc") + + +public class UgcInitializer { + + @Bean + public UgcCommentApi ugcCommentApi() {return new DefaultUgcCommentApi();} + + @Bean + public UgcVoteCommentApi ugcVoteCommentApi() {return new mockUgcVoteCommentApi();} + + @Component + @RegisteredViewModels({ + @RegisteredViewModel(viewName = "Comments", modelClass = UgcRegion.class), + @RegisteredViewModel(viewName = "UgcComments", modelClass = UgcComments.class), + @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class), + @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class), + @RegisteredViewModel(viewName = "GeneralPage", modelClass = DefaultPageModel.class) + }) + @ModuleInfo(name = "UGC module", areaName = "Ugc", description = "Support for UGC views") + public static class UgcViewModuleInitializer extends AbstractModuleInitializer { + @Override + protected String getAreaName() { + return "Ugc"; + } + } +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java new file mode 100644 index 000000000..51dd8324d --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -0,0 +1,175 @@ +package com.sdl.dxa.modules.ugc; + +import com.sdl.delivery.ugc.client.comment.UgcCommentApi; +import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; +import com.sdl.delivery.ugc.client.comment.impl.SimpleCommentsFilter; +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.dxa.modules.ugc.data.User; +import com.sdl.web.ugc.Status; +import com.sdl.webapp.common.api.WebRequestContext; +import com.sdl.webapp.common.util.TcmUtils; +import com.tridion.ambientdata.AmbientDataContext; +import com.tridion.ambientdata.claimstore.ClaimStore; +import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.net.URI; +import java.net.URISyntaxException; +import java.time.DayOfWeek; +import java.time.Month; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +@Service +@Slf4j +public class UgcService { + + private static final int maximumThreadsDepth = -1; + private final WebRequestContext webRequestContext; + + @Autowired + private UgcCommentApi ugcCommentApi; + + //Todo: create client which implements UgcVoteCommentApi + @Autowired + private UgcVoteCommentApi ugcVoteCommentApi; + + @Autowired + public UgcService(WebRequestContext webRequestContext) { + this.webRequestContext = webRequestContext; + } + + /** + * @param publicationId + * @param pageId + * @param descending + * @param statuses + * @param top + * @param skip + * @return List of Comments + */ + public List GetComments(int publicationId, int pageId, boolean descending, List statuses, int top, int skip) { + List statusStatuses = new ArrayList<>(); + statuses.stream().forEach(status -> { + statusStatuses.add(Status.getStatusForId(status)); + }); + SimpleCommentsFilter filter = new SimpleCommentsFilter() + .withTop(top) + .withSkip(skip) + .withDepth(maximumThreadsDepth) + .withStatuses(statusStatuses); + + return Convert(ugcCommentApi.retrieveThreadedComments(TcmUtils.buildPageTcmUri(publicationId, pageId), filter, descending, true)); + } + + /** + * @param publicationId + * @param pageId + * @param username + * @param email + * @param content + * @param parentId + * @param metadata + * @return Comment + */ + public Comment PostComment(int publicationId, int pageId, String username, String email, String content, + int parentId, Map metadata) { + + try { + ClaimStore claimStore = AmbientDataContext.getCurrentClaimStore(); + if (claimStore != null) { + claimStore.put(new URI("taf:claim:contentdelivery:webservice:user"), username); + claimStore.put(new URI("taf:claim:contentdelivery:webservice:post:allowed"), true); + } + } catch (URISyntaxException e) { + log.error("Error while Storing Claims", e); + } + return Convert( + ugcCommentApi.postComment(TcmUtils.buildPageTcmUri(publicationId, pageId), username, email, content, parentId, metadata)); + } + + /** + * @param commentId + */ + // Todo: Implement ugcVoteCommentApi + public void UpVoteComment(long commentId) { + ugcVoteCommentApi.voteCommentUp(commentId); + } + + /** + * @param commentId + */ + // Todo: Implement ugcVoteCommentApi + public void DownVoteComment(long commentId) { + ugcVoteCommentApi.voteCommentDown(commentId); + } + + + private List Convert(List comments) { + List convertedComments = new ArrayList<>(); + comments.stream().forEach(comment -> { + convertedComments.add(Convert(comment)); + }); + + return convertedComments; + } + + private Comment Convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { + if (comment == null) { + return null; + } + Comment c = new Comment(); + c.setId(comment.getIdLong()); + c.setParentId(comment.getParent().getIdLong()); + c.setItemId(comment.getItemId()); + c.setItemType(comment.getItemType()); + c.setItemPublicationId(comment.getItemPublicationId()); + c.setContent(comment.getContent()); + c.setRating(comment.getScore()); + c.setMetadata(comment.getMetadata()); + if (comment.getUser() != null) { + c.setUser(Convert(comment.getUser())); + } + if (comment.getCreationDate() != null) { + c.setCreationDate(Convert(comment.getCreationDate())); + } + return c; + } + + private Comment.CommentDate Convert(ZonedDateTime creationDate) { + Comment.CommentDate commentDate = new Comment.CommentDate(); + DateTime dt = new DateTime( + creationDate.toInstant().toEpochMilli(), + DateTimeZone.forTimeZone(TimeZone.getTimeZone(creationDate.getZone()))); + commentDate.setDateTime(dt); + commentDate.setDayOfMonth(dt.getMonthOfYear()); + commentDate.setDayOfWeek(DayOfWeek.of(dt.getDayOfWeek()).name()); + commentDate.setDayOfYear(dt.getDayOfYear()); + commentDate.setMonth(Month.of(dt.getMonthOfYear()).name()); + commentDate.setMonthValue(dt.getMonthOfYear()); + commentDate.setYear(dt.getYear()); + commentDate.setHour(dt.getHourOfDay()); + commentDate.setMinute(dt.getMinuteOfHour()); + commentDate.setSecond(dt.getSecondOfMinute()); + commentDate.setNano(dt.getMillisOfSecond()); + + return commentDate; + + } + + private User Convert(com.sdl.delivery.ugc.client.odata.edm.User user) { + User u = new User(); + u.setId(user.getId()); + u.setExternalId(user.getExternalId()); + u.setName(user.getName()); + u.setEmailAddress(user.getEmailAddress()); + return u; + } + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java new file mode 100644 index 000000000..ee26ccceb --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -0,0 +1,17 @@ +package com.sdl.dxa.modules.ugc.controllers; + +import com.sdl.webapp.common.api.WebRequestContext; +import com.sdl.webapp.common.controller.BaseController; +import com.sdl.webapp.common.controller.ControllerUtils; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Controller +@RequestMapping(value = { "/api/comments", "/{path}/api/comments"}) +@Slf4j +public class UgcApiController extends BaseController{ +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java new file mode 100644 index 000000000..67bbc6384 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -0,0 +1,59 @@ +package com.sdl.dxa.modules.ugc.controllers; + +import com.sdl.dxa.modules.ugc.UgcService; +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.dxa.modules.ugc.model.entity.UgcComment; +import com.sdl.dxa.modules.ugc.model.entity.UgcComments; +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.webapp.common.api.model.EntityModel; +import com.sdl.webapp.common.api.model.ViewModel; +import com.sdl.webapp.common.api.model.entity.RedirectEntity; +import com.sdl.webapp.common.controller.EntityController; +import org.springframework.stereotype.Controller; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +@Controller +public class UgcController extends EntityController { + + private static List CreateEntities(List comments) { + + List ugcComments = new ArrayList<>(); + comments.forEach((Comment comment) -> ugcComments.add(CreateEntity(comment))); + return ugcComments; + } + + private static UgcComment CreateEntity(Comment comment) { + UgcComment ugcComment = new UgcComment(); + ugcComment.setComments(CreateEntities(comment.getChildren())); + ugcComment.setCommentData(comment); + return ugcComment; + } + + @Override + protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) throws Exception { + + if (model instanceof UgcComments) { + final ViewModel enrichedModel = super.enrichModel(model, request); + UgcService ugcService = new UgcService(context); + UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); + List comments = ugcService.GetComments(ugcComments.getTarget().getPublicationId(), + ugcComments.getTarget().getItemId(), false, new ArrayList<>(), 0, 0); + ugcComments.setComments(CreateEntities(comments)); + return ugcComments; + } + + if (model instanceof UgcPostCommentForm) { + UgcService ugcService = new UgcService(context); + final ViewModel enrichedModel = super.enrichModel(model, request); + UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); + ugcService.PostComment(postForm.getTarget().getPublicationId(), postForm.getTarget().getItemId(), postForm.getUserName(), + postForm.getEmailAddress(), postForm.getContent(), postForm.getParentId(), postForm.getMetadata()); + + return new RedirectEntity(context.getFullUrl()); + } + return model; + } +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java new file mode 100644 index 000000000..59fc41439 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java @@ -0,0 +1,66 @@ +package com.sdl.dxa.modules.ugc.data; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.joda.time.DateTime; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class Comment { + private long id; + + @JsonIgnore + private long parentId; + + private int itemPublicationId; + + private int itemId; + + private int itemType; + + private CommentDate creationDate; + + private CommentDate lastModifiedDate; + + private String content; + + private User user; + + private List children; + + @JsonIgnore + private int rating = 0; + + @JsonIgnore + private Map metadata = new HashMap(); + + @Data + public static class CommentDate { + @JsonIgnore + private DateTime dateTime; + + private int dayOfMonth; + + private String dayOfWeek; + + private int dayOfYear; + + private int hour; + + private int minute; + + private String month; + + private int monthValue; + + private int nano; + + private int second; + + private int year; + } + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java new file mode 100644 index 000000000..bdc1d07fd --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java @@ -0,0 +1,28 @@ +package com.sdl.dxa.modules.ugc.data; + +import lombok.Data; + +@Data +public class PostedComment { + private int publicationId; + + private int pageId; + + private String username; + + private String email; + + private String content; + + private int parentId = 0; + + private String publicationTitle; + + private String publicationUrl; + + private String pageTitle; + + private String pageUrl; + + private String language; +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java new file mode 100644 index 000000000..84afda52a --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java @@ -0,0 +1,13 @@ +package com.sdl.dxa.modules.ugc.data; + +import lombok.Data; + +@Data +public class PubIdTitleLang { + + private int id; + + private String title; + + private String lang; +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java new file mode 100644 index 000000000..1b5f0e5a9 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java @@ -0,0 +1,14 @@ +package com.sdl.dxa.modules.ugc.data; + +import lombok.Data; + +@Data +public class User { + private String id; + + private String name; + + private String emailAddress; + + private String externalId; +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java new file mode 100644 index 000000000..24bbad9a7 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -0,0 +1,262 @@ +package com.sdl.dxa.modules.ugc.mapping; + +import com.sdl.dxa.api.datamodel.model.ContentModelData; +import com.sdl.dxa.api.datamodel.model.EntityModelData; +import com.sdl.dxa.api.datamodel.model.PageModelData; +import com.sdl.dxa.modules.ugc.model.entity.UgcComments; +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.dxa.modules.ugc.model.entity.UgcRegion; +import com.sdl.dxa.tridion.mapping.EntityModelBuilder; +import com.sdl.dxa.tridion.mapping.PageModelBuilder; +import com.sdl.webapp.common.api.WebRequestContext; +import com.sdl.webapp.common.api.localization.Localization; +import com.sdl.webapp.common.api.model.*; +import com.sdl.webapp.common.api.model.mvcdata.DefaultsMvcData; +import com.sdl.webapp.common.api.model.mvcdata.MvcDataCreator; +import com.sdl.webapp.common.exceptions.DxaException; +import com.sdl.webapp.common.util.TcmUtils; +import com.tridion.util.TCMURI; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Component +public class UgcModelBuilder implements PageModelBuilder, EntityModelBuilder { + + private static final String COMMENTS_CONFIG = "ugcConfig"; + private static final String POST_FORM_CONFIG = "postFormConfig"; + + private static final String COMMENTS_REGION_KEY = "commentsRegion"; + private static final String SHOW_COMMENTS_KEY = "showComments"; + private static final String ALLOW_POST_KEY = "allowPost"; + + private static final String COMMENTS_REGION = "Comments"; + private static final String COMMENTS_AREA = "Ugc"; + + private static final String SHOW_COMMENTS_EXT_DATA = "UgcShowComments"; + private static final String POST_COMMENTS_EXT_DATA = "UgcPostComments"; + private static final String COMMENTS_ENTITY_REGION_EXT_DATA = "CommentsEntityRegion"; + + private static final String COMMENTS_QUALIFIED_NAME = "Ugc:Ugc:UgcComments"; + private static final String POST_FORM_QUALIFIED_NAME = "Ugc:Ugc:UgcPostCommentForm"; + + private final HttpServletRequest httpServletRequest; + + private final WebRequestContext webRequestContext; + + @Autowired + public UgcModelBuilder(HttpServletRequest httpServletRequest, WebRequestContext webRequestContext) { + this.httpServletRequest = httpServletRequest; + this.webRequestContext = webRequestContext; + } + + private static RegionModel FindRegion(RegionModelSet regionModelSet, String regionName) { + for (RegionModel region : regionModelSet) { + if (region.getName().equals(regionName)) { + return region; + } + RegionModel childRegion = FindRegion(region.getRegions(), regionName); + if (childRegion != null) { + return childRegion; + } + } + return null; + } + + private static UgcRegion CreateRegion(PageModel pageModel, String areaName, String regionName) { + UgcRegion ugcRegion = null; + if (!pageModel.getRegions().containsClass(UgcRegion.class)) { + try { + ugcRegion = new UgcRegion(regionName); + MvcData mvcData = MvcDataCreator.creator() + .fromQualifiedName(String.format("%s:%s", areaName, regionName)) + .defaults(DefaultsMvcData.REGION) + .create(); + ugcRegion.setMvcData(mvcData); + pageModel.getRegions().add(ugcRegion); + } catch (DxaException e) { + log.error(String.format("Creation of RegionModel %s failed", regionName), e); + } + } else { + ugcRegion = pageModel.getRegions().stream() + .filter(regionModel -> regionModel instanceof UgcRegion) + .map(regionModel -> (UgcRegion) regionModel) + .findFirst().orElse(null); + } + return ugcRegion; + } + + private static void AddCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { + List regionEntities = new ArrayList<>(); + for (EntityModel entity : region.getEntities()) { + if (entity.getExtensionData() == null) { + continue; + } + List entities = ugcRegion != null ? ugcRegion.getEntities() : regionEntities; + if (entity.getExtensionData().containsKey(COMMENTS_ENTITY_REGION_EXT_DATA)) { + // comment region specified for this entity so lets find it and use that + RegionModel targetRegion = FindRegion(pageModel.getRegions(), (String) entity.getExtensionData().get(COMMENTS_ENTITY_REGION_EXT_DATA)); + if (targetRegion != null && targetRegion != region) { + entities = targetRegion.getEntities(); + } else if (targetRegion == null || targetRegion == region) { + entities = regionEntities; + } + + if (entity.getExtensionData().containsKey(SHOW_COMMENTS_EXT_DATA) && + (boolean) entity.getExtensionData().get(SHOW_COMMENTS_EXT_DATA)) { + entities.add(CreateUgcCommentsEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE)); + } + if (entity.getExtensionData().containsKey(POST_COMMENTS_EXT_DATA) && entity.getExtensionData().get(POST_COMMENTS_EXT_DATA) != null) { + entities.add(CreateUgcPostCommentEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE, (ContentModelData) entity.getExtensionData().get(POST_COMMENTS_EXT_DATA))); + } + } + } + // Add our ugc views to either the same region as the entity we have comments enabled for or the ugc "Comments" region if available + regionEntities.stream().forEach(entity -> { + region.getEntities().add(entity); + }); + region.getRegions().stream().forEach(childRegion -> { + AddCommentsViews(pageModel, childRegion, localization, ugcRegion); + }); + } + + private static UgcComments CreateUgcCommentsEntity(Localization localization, String id, int componentItemType) { + MvcData mvcData = MvcDataCreator.creator() + .fromQualifiedName(COMMENTS_QUALIFIED_NAME) + .defaults(DefaultsMvcData.ENTITY) + .create(); + UgcComments model = new UgcComments(); + try { + model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + } catch (ParseException e) { + log.error(String.format("Unable to process TCMURI '%s'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + } + model.setMvcData(mvcData); + return model; + } + + private static UgcPostCommentForm CreateUgcPostCommentEntity(Localization localization, String id, int componentItemType, ContentModelData postFormConfig) { + MvcData mvcData = MvcDataCreator.creator() + .fromQualifiedName(POST_FORM_QUALIFIED_NAME) + .defaults(DefaultsMvcData.ENTITY) + .create(); + UgcPostCommentForm model = new UgcPostCommentForm(); + try { + model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + } catch (ParseException e) { + log.error(String.format("Unable to process TCMURI '%s'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + } + model.setMvcData(mvcData); + model.setUserNameLabel(GetValue(postFormConfig, "userNameLabel", String.class)); + model.setEmailAddressLabel(GetValue(postFormConfig, "emailAddressLabel", String.class)); + model.setContentLabel(GetValue(postFormConfig, "contentLabel", String.class)); + model.setSubmitButtonLabel(GetValue(postFormConfig, "submitButtonLabel", String.class)); + model.setNoContentMessage(GetValue(postFormConfig, "noContentMessage", String.class)); + model.setNoEmailAddressMessage(GetValue(postFormConfig, "noEmailAddressMessage", String.class)); + model.setNoUserNameMessage(GetValue(postFormConfig, "noUserNameMessage", String.class)); + + return model; + } + + private static ContentModelData UgcMetadata(ContentModelData metadata) { + return metadata == null ? null : metadata.getAndCast(COMMENTS_CONFIG, ContentModelData.class); + } + + private static ContentModelData UgcPostFormMetadata(ContentModelData ugcMetadata) { + return ugcMetadata == null ? null : ugcMetadata.getAndCast(POST_FORM_CONFIG, ContentModelData.class); + } + + private static boolean ShowComments(ContentModelData ugcMetadata) { + return GetValue(ugcMetadata, SHOW_COMMENTS_KEY, boolean.class); + } + + private static boolean PostComments(ContentModelData ugcMetadata) { + return GetValue(ugcMetadata, ALLOW_POST_KEY, boolean.class); + } + + private static T GetValue(ContentModelData metadata, String name, Class type) { + if (metadata == null || !metadata.containsKey(name)) { + return null; + } + Object v = metadata.get(name); + if (v == null) { + return null; + } + if (type == Boolean.class) { + //noinspection unchecked + return (T) Boolean.valueOf("Yes"); + } + //noinspection unchecked + return (T) v; + } + + @Nullable + @Override + public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageModelData modelData) { + ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); + ContentModelData ugcMetadata = UgcMetadata(metadata); + Localization localization = webRequestContext.getLocalization(); + + String regionName = GetValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); + String areaName = pageModel.getMvcData().getAreaName(); + RegionModel ugcRegion; + if (StringUtils.isEmpty(regionName)) { + areaName = COMMENTS_AREA; + regionName = COMMENTS_REGION; + + ugcRegion = FindRegion(pageModel.getRegions(), COMMENTS_REGION); + if (ugcRegion == null) { + CreateRegion(pageModel, areaName, regionName); + } + } else { + ugcRegion = FindRegion(pageModel.getRegions(), regionName); + if (ugcRegion == null) { + log.error(String.format("Unable to locate region for comments '%s'.", regionName)); + } + } + + // Entity Comments + pageModel.getRegions().stream().forEach(region -> { + AddCommentsViews(pageModel, region, localization, ugcRegion); + }); + + if (ugcRegion != null) { + // Page Comments + if (ShowComments(ugcMetadata)) { + ugcRegion.getEntities().add(CreateUgcCommentsEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE)); + } + if (PostComments(ugcMetadata)) { + ugcRegion.getEntities().add(CreateUgcPostCommentEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE, + UgcPostFormMetadata(ugcMetadata))); + } + } + return pageModel; + } + + @Override + public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { + + ContentModelData ugcMetadata = UgcMetadata(entityModelData.getComponentTemplate().getMetadata()); + entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, ShowComments(ugcMetadata)); + entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (PostComments(ugcMetadata) ? UgcPostFormMetadata(ugcMetadata) : null)); + entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, GetValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + + return entityModel; + } + + @Override + public int getOrder() { + return 0; + } + + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java new file mode 100644 index 000000000..aa0e181ca --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java @@ -0,0 +1,13 @@ +package com.sdl.dxa.modules.ugc.mock; + +import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; + +public class mockUgcVoteCommentApi implements UgcVoteCommentApi { + @Override + public void voteCommentUp(long l) { + } + + @Override + public void voteCommentDown(long l) { + } +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java new file mode 100644 index 000000000..1f302bfd4 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java @@ -0,0 +1,24 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class UgcComment extends AbstractEntityModel { + + /** + * Comment Data + **/ + private Comment commentData; + + /** + * List of related comments + **/ + private List comments; + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java new file mode 100644 index 000000000..695a50b93 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java @@ -0,0 +1,26 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.sdl.webapp.common.api.mapping.semantic.annotations.SemanticMappingIgnore; +import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import com.tridion.util.CMURI; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class UgcComments extends AbstractEntityModel { + + /** + * Target CmUri for comments + **/ + @SemanticMappingIgnore + private CMURI target; + + /** + * List of comments + **/ + @SemanticMappingIgnore + private List comments; +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java new file mode 100644 index 000000000..15909393c --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java @@ -0,0 +1,93 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.sdl.dxa.caching.NeverCached; +import com.sdl.webapp.common.api.mapping.semantic.annotations.SemanticMappingIgnore; +import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import com.tridion.util.CMURI; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Map; + +/** + * + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NeverCached(qualifier = "UgcPostCommentForm") +public class UgcPostCommentForm extends AbstractEntityModel { + + /** + * Holds the form control value for username + */ + @SemanticMappingIgnore + private String userName; + + /** + * Holds the form control value for email address + **/ +// [Required(ErrorMessage = "@Model.NoEmailAddressMessage")] + @SemanticMappingIgnore + private String emailAddress; + + /** + * Holds the form control value for email address + **/ +// [Required(ErrorMessage = "@Model.NoContentMessage")] + @SemanticMappingIgnore + private String content; + + /** + * Metadata of comment to post + **/ + @SemanticMappingIgnore + private Map metadata; + + /** + * Parent id of comment to post + **/ + @SemanticMappingIgnore + public int ParentId = 0; + + /** + * Label text for username input control on view + **/ + private String userNameLabel; + + /** + * Label text for email address input control on view + **/ + private String emailAddressLabel; + + /** + * Label text for content input control on view + **/ + private String contentLabel; + + /** + * Label text for submit button on view + **/ + private String submitButtonLabel; + + /** + * User name not specified message + **/ + private String noUserNameMessage; + + /** + * Email not specified message + **/ + private String noEmailAddressMessage; + + /** + * Content not specified message + **/ + private String noContentMessage; + + /** + * Target CmUri for comments + **/ + @SemanticMappingIgnore + private CMURI target; + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java new file mode 100644 index 000000000..af82a3e73 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java @@ -0,0 +1,48 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.sdl.dxa.caching.NeverCached; +import com.sdl.webapp.common.api.model.MvcData; +import com.sdl.webapp.common.api.model.RegionModel; +import com.sdl.webapp.common.api.model.region.RegionModelImpl; +import com.sdl.webapp.common.exceptions.DxaException; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class UgcRegion extends RegionModelImpl { + /** + * @param other other Region + */ + public UgcRegion(RegionModel other) { + super(other); + } + + /** + * @param name Region name + * @throws DxaException + */ + public UgcRegion(String name) throws DxaException { + super(name); + } + + /** + * @param name region name + * @param qualifiedViewName view name + * @throws DxaException + */ + public UgcRegion(String name, String qualifiedViewName) throws DxaException { + super(name, qualifiedViewName); + } + + /** + * @param mvcData + * @throws DxaException + */ + public UgcRegion(MvcData mvcData) throws DxaException { + super(mvcData); + } +} diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp new file mode 100644 index 000000000..ea07962ff --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp @@ -0,0 +1,37 @@ +<%@ taglib prefix="dxa" uri="http://www.sdl.com/tridion-dxa" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + +
+

Comments (${entity.Comments.size()})

+
+
+ +
+
+ +
+
+
+ ${comment.User.Name} + - + +
+
+

${comment.Content}

+
+
+ + ${comment.Rating} + + - + Reply +
+
+
+
+
+
+ + diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp new file mode 100644 index 000000000..faed99046 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp @@ -0,0 +1,38 @@ +<%@ taglib prefix="dxa" uri="http://www.sdl.com/tridion-dxa" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + + +
+ + + <%--@elvariable id="errors" type="java.util.ArrayList"--%> + +
+
+
    + +
  • ${entity.resolveErrorCode(error.code)}
  • +
    +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp new file mode 100644 index 000000000..86eaa2c7e --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp @@ -0,0 +1,67 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="dxa" uri="http://www.sdl.com/tridion-dxa" %> +<%@ taglib prefix="xpm" uri="http://www.sdl.com/tridion-xpm" %> + + + + + + + + + + + + + ${pageModel.title} + + + + + + + + + + + + +
+ +
+ + +
+ + + +
+ + +
+
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Region/Comments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Region/Comments.jsp new file mode 100644 index 000000000..747dbf96e --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Region/Comments.jsp @@ -0,0 +1,8 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ taglib prefix="dxa" uri="http://www.sdl.com/tridion-dxa" %> + + + +
+ +
From 869529711f9f9654d2711341f09d5036b8c2959c Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Thu, 26 Apr 2018 08:32:56 +0200 Subject: [PATCH 33/78] Added controller for post form validation and handling minor improvements in logging --- .../sdl/dxa/modules/ugc/UgcInitializer.java | 1 + .../com/sdl/dxa/modules/ugc/UgcService.java | 3 - .../ugc/controllers/UgcController.java | 17 ++++-- .../controllers/UgcPostFormController.java | 56 +++++++++++++++++++ .../modules/ugc/mapping/UgcModelBuilder.java | 8 +-- .../ugc/model/entity/UgcPostCommentForm.java | 29 +++++++++- .../UgcPostCommentFormValidator.java | 25 +++++++++ .../Views/Ugc/Entity/UgcPostCommentForm.jsp | 2 +- 8 files changed, 125 insertions(+), 16 deletions(-) create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java create mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index 450783ac6..ed2537e6b 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -26,6 +26,7 @@ public class UgcInitializer { @Bean public UgcCommentApi ugcCommentApi() {return new DefaultUgcCommentApi();} + //Todo: create or use real UgcVoteCommentApi implementation @Bean public UgcVoteCommentApi ugcVoteCommentApi() {return new mockUgcVoteCommentApi();} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 51dd8324d..c7ee552e0 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -36,7 +36,6 @@ public class UgcService { @Autowired private UgcCommentApi ugcCommentApi; - //Todo: create client which implements UgcVoteCommentApi @Autowired private UgcVoteCommentApi ugcVoteCommentApi; @@ -97,7 +96,6 @@ public Comment PostComment(int publicationId, int pageId, String username, Strin /** * @param commentId */ - // Todo: Implement ugcVoteCommentApi public void UpVoteComment(long commentId) { ugcVoteCommentApi.voteCommentUp(commentId); } @@ -105,7 +103,6 @@ public void UpVoteComment(long commentId) { /** * @param commentId */ - // Todo: Implement ugcVoteCommentApi public void DownVoteComment(long commentId) { ugcVoteCommentApi.voteCommentDown(commentId); } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 67bbc6384..4c22122de 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -5,10 +5,11 @@ import com.sdl.dxa.modules.ugc.model.entity.UgcComment; import com.sdl.dxa.modules.ugc.model.entity.UgcComments; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.webapp.common.api.WebRequestContext; import com.sdl.webapp.common.api.model.EntityModel; import com.sdl.webapp.common.api.model.ViewModel; -import com.sdl.webapp.common.api.model.entity.RedirectEntity; import com.sdl.webapp.common.controller.EntityController; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import javax.servlet.http.HttpServletRequest; @@ -18,6 +19,13 @@ @Controller public class UgcController extends EntityController { + private final WebRequestContext webRequestContext; + + @Autowired + public UgcController(WebRequestContext webRequestContext) { + this.webRequestContext = webRequestContext; + } + private static List CreateEntities(List comments) { List ugcComments = new ArrayList<>(); @@ -26,7 +34,7 @@ private static List CreateEntities(List comments) { } private static UgcComment CreateEntity(Comment comment) { - UgcComment ugcComment = new UgcComment(); + UgcComment ugcComment = new UgcComment(); ugcComment.setComments(CreateEntities(comment.getChildren())); ugcComment.setCommentData(comment); return ugcComment; @@ -46,13 +54,10 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr } if (model instanceof UgcPostCommentForm) { - UgcService ugcService = new UgcService(context); final ViewModel enrichedModel = super.enrichModel(model, request); UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); - ugcService.PostComment(postForm.getTarget().getPublicationId(), postForm.getTarget().getItemId(), postForm.getUserName(), - postForm.getEmailAddress(), postForm.getContent(), postForm.getParentId(), postForm.getMetadata()); + postForm.setFormUrl(webRequestContext.getPage().getUrl()); - return new RedirectEntity(context.getFullUrl()); } return model; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java new file mode 100644 index 000000000..c9c53073d --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -0,0 +1,56 @@ +package com.sdl.dxa.modules.ugc.controllers; + +import com.sdl.dxa.modules.ugc.UgcService; +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.dxa.modules.ugc.model.validator.UgcPostCommentFormValidator; +import com.sdl.webapp.common.api.WebRequestContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Controller +@RequestMapping(value = {"/api/ugc", "/{path}/api/ugc"}) +@Slf4j +public class UgcPostFormController { + + private static final String REDIRECT_PREFIX = "redirect:"; + + private final WebRequestContext webRequestContext; + private final UgcPostCommentFormValidator ugcPostCommentFormValidator; + + @Autowired + public UgcPostFormController(WebRequestContext webRequestContext, + UgcPostCommentFormValidator ugcPostCommentFormValidator) { + this.webRequestContext = webRequestContext; + this.ugcPostCommentFormValidator = ugcPostCommentFormValidator; + } + + @RequestMapping(value = "/postcomment", method = RequestMethod.POST) + public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes, + HttpServletRequest request, HttpServletResponse response) { + ugcPostCommentFormValidator.validate(form, bindingResult); + + if (bindingResult.hasErrors()) { + log.trace("Comment Form has {} errors",bindingResult.getErrorCount()); + redirectAttributes.addFlashAttribute("errors", bindingResult.getAllErrors()); + return REDIRECT_PREFIX + form.getFormUrl(); + } + log.trace("Comment Form complete and valid"); + + UgcService ugcService = new UgcService(webRequestContext); + ugcService.PostComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), + form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); + + log.trace("Comment posted succesful {}", form.getUserName()); + return REDIRECT_PREFIX + form.getFormUrl(); + } + +} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 24bbad9a7..20e833002 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -84,7 +84,7 @@ private static UgcRegion CreateRegion(PageModel pageModel, String areaName, Stri ugcRegion.setMvcData(mvcData); pageModel.getRegions().add(ugcRegion); } catch (DxaException e) { - log.error(String.format("Creation of RegionModel %s failed", regionName), e); + log.error("Creation of RegionModel {} failed", regionName, e); } } else { ugcRegion = pageModel.getRegions().stream() @@ -138,7 +138,7 @@ private static UgcComments CreateUgcCommentsEntity(Localization localization, St try { model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); } catch (ParseException e) { - log.error(String.format("Unable to process TCMURI '%s'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType)); } model.setMvcData(mvcData); return model; @@ -153,7 +153,7 @@ private static UgcPostCommentForm CreateUgcPostCommentEntity(Localization locali try { model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); } catch (ParseException e) { - log.error(String.format("Unable to process TCMURI '%s'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType)); } model.setMvcData(mvcData); model.setUserNameLabel(GetValue(postFormConfig, "userNameLabel", String.class)); @@ -220,7 +220,7 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode } else { ugcRegion = FindRegion(pageModel.getRegions(), regionName); if (ugcRegion == null) { - log.error(String.format("Unable to locate region for comments '%s'.", regionName)); + log.error("Unable to locate region for comments '{}'.", regionName); } } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java index 15909393c..cc6189455 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java @@ -1,8 +1,10 @@ package com.sdl.dxa.modules.ugc.model.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.sdl.dxa.caching.NeverCached; import com.sdl.webapp.common.api.mapping.semantic.annotations.SemanticMappingIgnore; import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import com.sdl.webapp.common.api.model.validation.DynamicValidationMessage; import com.tridion.util.CMURI; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,6 +19,13 @@ @NeverCached(qualifier = "UgcPostCommentForm") public class UgcPostCommentForm extends AbstractEntityModel { + /** + * Holds the forms url, for redirecting purposes + */ + @SemanticMappingIgnore + @JsonIgnore + private String formUrl; + /** * Holds the form control value for username */ @@ -26,14 +35,14 @@ public class UgcPostCommentForm extends AbstractEntityModel { /** * Holds the form control value for email address **/ -// [Required(ErrorMessage = "@Model.NoEmailAddressMessage")] @SemanticMappingIgnore private String emailAddress; + + /** * Holds the form control value for email address **/ -// [Required(ErrorMessage = "@Model.NoContentMessage")] @SemanticMappingIgnore private String content; @@ -79,6 +88,7 @@ public class UgcPostCommentForm extends AbstractEntityModel { **/ private String noEmailAddressMessage; + /** * Content not specified message **/ @@ -90,4 +100,19 @@ public class UgcPostCommentForm extends AbstractEntityModel { @SemanticMappingIgnore private CMURI target; + @DynamicValidationMessage(errorCode = "userName.empty") + public String getNoUserNameMessage() { + return noUserNameMessage; + } + + @DynamicValidationMessage(errorCode = "emailAddress.empty") + public String getNoEmailAddressMessage() { + return noEmailAddressMessage; + } + + @DynamicValidationMessage(errorCode = "content.empty") + public String getNoContentMessage() { + return noContentMessage; + } + } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java new file mode 100644 index 000000000..a485568e0 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java @@ -0,0 +1,25 @@ +package com.sdl.dxa.modules.ugc.model.validator; + +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +@Component +public class UgcPostCommentFormValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return UgcPostCommentForm.class.isAssignableFrom(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + UgcPostCommentForm form = (UgcPostCommentForm) target; + + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "userName.empty", form.getNoUserNameMessage()); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emailAddress", "emailAddress.empty", form.getNoEmailAddressMessage()); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "content", "content.empty", form.getNoContentMessage()); + } +} diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp index faed99046..8f6403d2d 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp @@ -8,7 +8,7 @@
- +
From 81192d61681528384eca25e093f17ecffe5264ba Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Thu, 26 Apr 2018 11:59:48 +0200 Subject: [PATCH 34/78] Fixed camelCase for one class and various methods and variables --- .../sdl/dxa/modules/ugc/UgcInitializer.java | 4 +- .../com/sdl/dxa/modules/ugc/UgcService.java | 26 +++---- .../ugc/controllers/UgcController.java | 12 +-- .../controllers/UgcPostFormController.java | 2 +- .../modules/ugc/mapping/UgcModelBuilder.java | 78 +++++++++---------- ...entApi.java => MockUgcVoteCommentApi.java} | 2 +- .../ugc/model/entity/UgcPostCommentForm.java | 2 +- 7 files changed, 63 insertions(+), 63 deletions(-) rename webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/{mockUgcVoteCommentApi.java => MockUgcVoteCommentApi.java} (78%) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index ed2537e6b..c72d2ac67 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -3,7 +3,7 @@ import com.sdl.delivery.ugc.client.comment.UgcCommentApi; import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; import com.sdl.delivery.ugc.client.comment.impl.DefaultUgcCommentApi; -import com.sdl.dxa.modules.ugc.mock.mockUgcVoteCommentApi; +import com.sdl.dxa.modules.ugc.mock.MockUgcVoteCommentApi; import com.sdl.dxa.modules.ugc.model.entity.UgcComments; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; import com.sdl.dxa.modules.ugc.model.entity.UgcRegion; @@ -28,7 +28,7 @@ public class UgcInitializer { //Todo: create or use real UgcVoteCommentApi implementation @Bean - public UgcVoteCommentApi ugcVoteCommentApi() {return new mockUgcVoteCommentApi();} + public UgcVoteCommentApi ugcVoteCommentApi() {return new MockUgcVoteCommentApi();} @Component @RegisteredViewModels({ diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index c7ee552e0..45af1e13a 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -53,7 +53,7 @@ public UgcService(WebRequestContext webRequestContext) { * @param skip * @return List of Comments */ - public List GetComments(int publicationId, int pageId, boolean descending, List statuses, int top, int skip) { + public List getComments(int publicationId, int pageId, boolean descending, List statuses, int top, int skip) { List statusStatuses = new ArrayList<>(); statuses.stream().forEach(status -> { statusStatuses.add(Status.getStatusForId(status)); @@ -64,7 +64,7 @@ public List GetComments(int publicationId, int pageId, boolean descendi .withDepth(maximumThreadsDepth) .withStatuses(statusStatuses); - return Convert(ugcCommentApi.retrieveThreadedComments(TcmUtils.buildPageTcmUri(publicationId, pageId), filter, descending, true)); + return convert(ugcCommentApi.retrieveThreadedComments(TcmUtils.buildPageTcmUri(publicationId, pageId), filter, descending, true)); } /** @@ -77,7 +77,7 @@ public List GetComments(int publicationId, int pageId, boolean descendi * @param metadata * @return Comment */ - public Comment PostComment(int publicationId, int pageId, String username, String email, String content, + public Comment postComment(int publicationId, int pageId, String username, String email, String content, int parentId, Map metadata) { try { @@ -89,35 +89,35 @@ public Comment PostComment(int publicationId, int pageId, String username, Strin } catch (URISyntaxException e) { log.error("Error while Storing Claims", e); } - return Convert( + return convert( ugcCommentApi.postComment(TcmUtils.buildPageTcmUri(publicationId, pageId), username, email, content, parentId, metadata)); } /** * @param commentId */ - public void UpVoteComment(long commentId) { + public void upVoteComment(long commentId) { ugcVoteCommentApi.voteCommentUp(commentId); } /** * @param commentId */ - public void DownVoteComment(long commentId) { + public void downVoteComment(long commentId) { ugcVoteCommentApi.voteCommentDown(commentId); } - private List Convert(List comments) { + private List convert(List comments) { List convertedComments = new ArrayList<>(); comments.stream().forEach(comment -> { - convertedComments.add(Convert(comment)); + convertedComments.add(convert(comment)); }); return convertedComments; } - private Comment Convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { + private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { if (comment == null) { return null; } @@ -131,15 +131,15 @@ private Comment Convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { c.setRating(comment.getScore()); c.setMetadata(comment.getMetadata()); if (comment.getUser() != null) { - c.setUser(Convert(comment.getUser())); + c.setUser(convert(comment.getUser())); } if (comment.getCreationDate() != null) { - c.setCreationDate(Convert(comment.getCreationDate())); + c.setCreationDate(convert(comment.getCreationDate())); } return c; } - private Comment.CommentDate Convert(ZonedDateTime creationDate) { + private Comment.CommentDate convert(ZonedDateTime creationDate) { Comment.CommentDate commentDate = new Comment.CommentDate(); DateTime dt = new DateTime( creationDate.toInstant().toEpochMilli(), @@ -160,7 +160,7 @@ private Comment.CommentDate Convert(ZonedDateTime creationDate) { } - private User Convert(com.sdl.delivery.ugc.client.odata.edm.User user) { + private User convert(com.sdl.delivery.ugc.client.odata.edm.User user) { User u = new User(); u.setId(user.getId()); u.setExternalId(user.getExternalId()); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 4c22122de..5d3bcfc47 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -26,16 +26,16 @@ public UgcController(WebRequestContext webRequestContext) { this.webRequestContext = webRequestContext; } - private static List CreateEntities(List comments) { + private static List createEntities(List comments) { List ugcComments = new ArrayList<>(); - comments.forEach((Comment comment) -> ugcComments.add(CreateEntity(comment))); + comments.forEach((Comment comment) -> ugcComments.add(createEntity(comment))); return ugcComments; } - private static UgcComment CreateEntity(Comment comment) { + private static UgcComment createEntity(Comment comment) { UgcComment ugcComment = new UgcComment(); - ugcComment.setComments(CreateEntities(comment.getChildren())); + ugcComment.setComments(createEntities(comment.getChildren())); ugcComment.setCommentData(comment); return ugcComment; } @@ -47,9 +47,9 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr final ViewModel enrichedModel = super.enrichModel(model, request); UgcService ugcService = new UgcService(context); UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); - List comments = ugcService.GetComments(ugcComments.getTarget().getPublicationId(), + List comments = ugcService.getComments(ugcComments.getTarget().getPublicationId(), ugcComments.getTarget().getItemId(), false, new ArrayList<>(), 0, 0); - ugcComments.setComments(CreateEntities(comments)); + ugcComments.setComments(createEntities(comments)); return ugcComments; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index c9c53073d..edc81bb68 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -46,7 +46,7 @@ public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, Bin log.trace("Comment Form complete and valid"); UgcService ugcService = new UgcService(webRequestContext); - ugcService.PostComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), + ugcService.postComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); log.trace("Comment posted succesful {}", form.getUserName()); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 20e833002..7ae5c05b4 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -59,12 +59,12 @@ public UgcModelBuilder(HttpServletRequest httpServletRequest, WebRequestContext this.webRequestContext = webRequestContext; } - private static RegionModel FindRegion(RegionModelSet regionModelSet, String regionName) { + private static RegionModel findRegion(RegionModelSet regionModelSet, String regionName) { for (RegionModel region : regionModelSet) { if (region.getName().equals(regionName)) { return region; } - RegionModel childRegion = FindRegion(region.getRegions(), regionName); + RegionModel childRegion = findRegion(region.getRegions(), regionName); if (childRegion != null) { return childRegion; } @@ -72,7 +72,7 @@ private static RegionModel FindRegion(RegionModelSet regionModelSet, String regi return null; } - private static UgcRegion CreateRegion(PageModel pageModel, String areaName, String regionName) { + private static UgcRegion createRegion(PageModel pageModel, String areaName, String regionName) { UgcRegion ugcRegion = null; if (!pageModel.getRegions().containsClass(UgcRegion.class)) { try { @@ -95,7 +95,7 @@ private static UgcRegion CreateRegion(PageModel pageModel, String areaName, Stri return ugcRegion; } - private static void AddCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { + private static void addCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { List regionEntities = new ArrayList<>(); for (EntityModel entity : region.getEntities()) { if (entity.getExtensionData() == null) { @@ -104,7 +104,7 @@ private static void AddCommentsViews(PageModel pageModel, RegionModel region, Lo List entities = ugcRegion != null ? ugcRegion.getEntities() : regionEntities; if (entity.getExtensionData().containsKey(COMMENTS_ENTITY_REGION_EXT_DATA)) { // comment region specified for this entity so lets find it and use that - RegionModel targetRegion = FindRegion(pageModel.getRegions(), (String) entity.getExtensionData().get(COMMENTS_ENTITY_REGION_EXT_DATA)); + RegionModel targetRegion = findRegion(pageModel.getRegions(), (String) entity.getExtensionData().get(COMMENTS_ENTITY_REGION_EXT_DATA)); if (targetRegion != null && targetRegion != region) { entities = targetRegion.getEntities(); } else if (targetRegion == null || targetRegion == region) { @@ -113,10 +113,10 @@ private static void AddCommentsViews(PageModel pageModel, RegionModel region, Lo if (entity.getExtensionData().containsKey(SHOW_COMMENTS_EXT_DATA) && (boolean) entity.getExtensionData().get(SHOW_COMMENTS_EXT_DATA)) { - entities.add(CreateUgcCommentsEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE)); + entities.add(createUgcCommentsEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE)); } if (entity.getExtensionData().containsKey(POST_COMMENTS_EXT_DATA) && entity.getExtensionData().get(POST_COMMENTS_EXT_DATA) != null) { - entities.add(CreateUgcPostCommentEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE, (ContentModelData) entity.getExtensionData().get(POST_COMMENTS_EXT_DATA))); + entities.add(createUgcPostCommentEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE, (ContentModelData) entity.getExtensionData().get(POST_COMMENTS_EXT_DATA))); } } } @@ -125,11 +125,11 @@ private static void AddCommentsViews(PageModel pageModel, RegionModel region, Lo region.getEntities().add(entity); }); region.getRegions().stream().forEach(childRegion -> { - AddCommentsViews(pageModel, childRegion, localization, ugcRegion); + addCommentsViews(pageModel, childRegion, localization, ugcRegion); }); } - private static UgcComments CreateUgcCommentsEntity(Localization localization, String id, int componentItemType) { + private static UgcComments createUgcCommentsEntity(Localization localization, String id, int componentItemType) { MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(COMMENTS_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) @@ -144,7 +144,7 @@ private static UgcComments CreateUgcCommentsEntity(Localization localization, St return model; } - private static UgcPostCommentForm CreateUgcPostCommentEntity(Localization localization, String id, int componentItemType, ContentModelData postFormConfig) { + private static UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int componentItemType, ContentModelData postFormConfig) { MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(POST_FORM_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) @@ -156,34 +156,34 @@ private static UgcPostCommentForm CreateUgcPostCommentEntity(Localization locali log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType)); } model.setMvcData(mvcData); - model.setUserNameLabel(GetValue(postFormConfig, "userNameLabel", String.class)); - model.setEmailAddressLabel(GetValue(postFormConfig, "emailAddressLabel", String.class)); - model.setContentLabel(GetValue(postFormConfig, "contentLabel", String.class)); - model.setSubmitButtonLabel(GetValue(postFormConfig, "submitButtonLabel", String.class)); - model.setNoContentMessage(GetValue(postFormConfig, "noContentMessage", String.class)); - model.setNoEmailAddressMessage(GetValue(postFormConfig, "noEmailAddressMessage", String.class)); - model.setNoUserNameMessage(GetValue(postFormConfig, "noUserNameMessage", String.class)); + model.setUserNameLabel(getValue(postFormConfig, "userNameLabel", String.class)); + model.setEmailAddressLabel(getValue(postFormConfig, "emailAddressLabel", String.class)); + model.setContentLabel(getValue(postFormConfig, "contentLabel", String.class)); + model.setSubmitButtonLabel(getValue(postFormConfig, "submitButtonLabel", String.class)); + model.setNoContentMessage(getValue(postFormConfig, "noContentMessage", String.class)); + model.setNoEmailAddressMessage(getValue(postFormConfig, "noEmailAddressMessage", String.class)); + model.setNoUserNameMessage(getValue(postFormConfig, "noUserNameMessage", String.class)); return model; } - private static ContentModelData UgcMetadata(ContentModelData metadata) { + private static ContentModelData ugcMetadata(ContentModelData metadata) { return metadata == null ? null : metadata.getAndCast(COMMENTS_CONFIG, ContentModelData.class); } - private static ContentModelData UgcPostFormMetadata(ContentModelData ugcMetadata) { + private static ContentModelData ugcPostFormMetadata(ContentModelData ugcMetadata) { return ugcMetadata == null ? null : ugcMetadata.getAndCast(POST_FORM_CONFIG, ContentModelData.class); } - private static boolean ShowComments(ContentModelData ugcMetadata) { - return GetValue(ugcMetadata, SHOW_COMMENTS_KEY, boolean.class); + private static boolean showComments(ContentModelData ugcMetadata) { + return getValue(ugcMetadata, SHOW_COMMENTS_KEY, boolean.class); } - private static boolean PostComments(ContentModelData ugcMetadata) { - return GetValue(ugcMetadata, ALLOW_POST_KEY, boolean.class); + private static boolean postComments(ContentModelData ugcMetadata) { + return getValue(ugcMetadata, ALLOW_POST_KEY, boolean.class); } - private static T GetValue(ContentModelData metadata, String name, Class type) { + private static T getValue(ContentModelData metadata, String name, Class type) { if (metadata == null || !metadata.containsKey(name)) { return null; } @@ -203,22 +203,22 @@ private static T GetValue(ContentModelData metadata, String name, Class t @Override public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageModelData modelData) { ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); - ContentModelData ugcMetadata = UgcMetadata(metadata); + ContentModelData ugcMetadata = ugcMetadata(metadata); Localization localization = webRequestContext.getLocalization(); - String regionName = GetValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); + String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); String areaName = pageModel.getMvcData().getAreaName(); RegionModel ugcRegion; if (StringUtils.isEmpty(regionName)) { areaName = COMMENTS_AREA; regionName = COMMENTS_REGION; - ugcRegion = FindRegion(pageModel.getRegions(), COMMENTS_REGION); + ugcRegion = findRegion(pageModel.getRegions(), COMMENTS_REGION); if (ugcRegion == null) { - CreateRegion(pageModel, areaName, regionName); + createRegion(pageModel, areaName, regionName); } } else { - ugcRegion = FindRegion(pageModel.getRegions(), regionName); + ugcRegion = findRegion(pageModel.getRegions(), regionName); if (ugcRegion == null) { log.error("Unable to locate region for comments '{}'.", regionName); } @@ -226,17 +226,17 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode // Entity Comments pageModel.getRegions().stream().forEach(region -> { - AddCommentsViews(pageModel, region, localization, ugcRegion); + addCommentsViews(pageModel, region, localization, ugcRegion); }); if (ugcRegion != null) { // Page Comments - if (ShowComments(ugcMetadata)) { - ugcRegion.getEntities().add(CreateUgcCommentsEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE)); + if (showComments(ugcMetadata)) { + ugcRegion.getEntities().add(createUgcCommentsEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE)); } - if (PostComments(ugcMetadata)) { - ugcRegion.getEntities().add(CreateUgcPostCommentEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE, - UgcPostFormMetadata(ugcMetadata))); + if (postComments(ugcMetadata)) { + ugcRegion.getEntities().add(createUgcPostCommentEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE, + ugcPostFormMetadata(ugcMetadata))); } } return pageModel; @@ -245,10 +245,10 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode @Override public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { - ContentModelData ugcMetadata = UgcMetadata(entityModelData.getComponentTemplate().getMetadata()); - entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, ShowComments(ugcMetadata)); - entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (PostComments(ugcMetadata) ? UgcPostFormMetadata(ugcMetadata) : null)); - entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, GetValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); + entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); + entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); + entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); return entityModel; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java similarity index 78% rename from webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java rename to webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java index aa0e181ca..627f0c045 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/mockUgcVoteCommentApi.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java @@ -2,7 +2,7 @@ import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; -public class mockUgcVoteCommentApi implements UgcVoteCommentApi { +public class MockUgcVoteCommentApi implements UgcVoteCommentApi { @Override public void voteCommentUp(long l) { } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java index cc6189455..bf083e3fd 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java @@ -56,7 +56,7 @@ public class UgcPostCommentForm extends AbstractEntityModel { * Parent id of comment to post **/ @SemanticMappingIgnore - public int ParentId = 0; + public int parentId = 0; /** * Label text for username input control on view From b13e0bee61ca8eb2e36225a172b4f69ce1605de0 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Thu, 26 Apr 2018 14:46:54 +0200 Subject: [PATCH 35/78] Made variables final where possible --- .../com/sdl/dxa/modules/ugc/UgcService.java | 16 ++++++++-------- .../modules/ugc/controllers/UgcController.java | 12 ++++++------ .../modules/ugc/mapping/UgcModelBuilder.java | 18 +++++++++--------- .../validator/UgcPostCommentFormValidator.java | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 45af1e13a..1e4bf93de 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -54,11 +54,11 @@ public UgcService(WebRequestContext webRequestContext) { * @return List of Comments */ public List getComments(int publicationId, int pageId, boolean descending, List statuses, int top, int skip) { - List statusStatuses = new ArrayList<>(); + final List statusStatuses = new ArrayList<>(); statuses.stream().forEach(status -> { statusStatuses.add(Status.getStatusForId(status)); }); - SimpleCommentsFilter filter = new SimpleCommentsFilter() + final SimpleCommentsFilter filter = new SimpleCommentsFilter() .withTop(top) .withSkip(skip) .withDepth(maximumThreadsDepth) @@ -81,7 +81,7 @@ public Comment postComment(int publicationId, int pageId, String username, Strin int parentId, Map metadata) { try { - ClaimStore claimStore = AmbientDataContext.getCurrentClaimStore(); + final ClaimStore claimStore = AmbientDataContext.getCurrentClaimStore(); if (claimStore != null) { claimStore.put(new URI("taf:claim:contentdelivery:webservice:user"), username); claimStore.put(new URI("taf:claim:contentdelivery:webservice:post:allowed"), true); @@ -109,7 +109,7 @@ public void downVoteComment(long commentId) { private List convert(List comments) { - List convertedComments = new ArrayList<>(); + final List convertedComments = new ArrayList<>(); comments.stream().forEach(comment -> { convertedComments.add(convert(comment)); }); @@ -121,7 +121,7 @@ private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { if (comment == null) { return null; } - Comment c = new Comment(); + final Comment c = new Comment(); c.setId(comment.getIdLong()); c.setParentId(comment.getParent().getIdLong()); c.setItemId(comment.getItemId()); @@ -140,8 +140,8 @@ private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { } private Comment.CommentDate convert(ZonedDateTime creationDate) { - Comment.CommentDate commentDate = new Comment.CommentDate(); - DateTime dt = new DateTime( + final Comment.CommentDate commentDate = new Comment.CommentDate(); + final DateTime dt = new DateTime( creationDate.toInstant().toEpochMilli(), DateTimeZone.forTimeZone(TimeZone.getTimeZone(creationDate.getZone()))); commentDate.setDateTime(dt); @@ -161,7 +161,7 @@ private Comment.CommentDate convert(ZonedDateTime creationDate) { } private User convert(com.sdl.delivery.ugc.client.odata.edm.User user) { - User u = new User(); + final User u = new User(); u.setId(user.getId()); u.setExternalId(user.getExternalId()); u.setName(user.getName()); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 5d3bcfc47..8cba37734 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -28,13 +28,13 @@ public UgcController(WebRequestContext webRequestContext) { private static List createEntities(List comments) { - List ugcComments = new ArrayList<>(); + final List ugcComments = new ArrayList<>(); comments.forEach((Comment comment) -> ugcComments.add(createEntity(comment))); return ugcComments; } private static UgcComment createEntity(Comment comment) { - UgcComment ugcComment = new UgcComment(); + final UgcComment ugcComment = new UgcComment(); ugcComment.setComments(createEntities(comment.getChildren())); ugcComment.setCommentData(comment); return ugcComment; @@ -45,9 +45,9 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr if (model instanceof UgcComments) { final ViewModel enrichedModel = super.enrichModel(model, request); - UgcService ugcService = new UgcService(context); - UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); - List comments = ugcService.getComments(ugcComments.getTarget().getPublicationId(), + final UgcService ugcService = new UgcService(context); + final UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); + final List comments = ugcService.getComments(ugcComments.getTarget().getPublicationId(), ugcComments.getTarget().getItemId(), false, new ArrayList<>(), 0, 0); ugcComments.setComments(createEntities(comments)); return ugcComments; @@ -55,7 +55,7 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr if (model instanceof UgcPostCommentForm) { final ViewModel enrichedModel = super.enrichModel(model, request); - UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); + final UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); postForm.setFormUrl(webRequestContext.getPage().getUrl()); } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 7ae5c05b4..8d84dcad3 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -96,7 +96,7 @@ private static UgcRegion createRegion(PageModel pageModel, String areaName, Stri } private static void addCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { - List regionEntities = new ArrayList<>(); + final List regionEntities = new ArrayList<>(); for (EntityModel entity : region.getEntities()) { if (entity.getExtensionData() == null) { continue; @@ -130,11 +130,11 @@ private static void addCommentsViews(PageModel pageModel, RegionModel region, Lo } private static UgcComments createUgcCommentsEntity(Localization localization, String id, int componentItemType) { - MvcData mvcData = MvcDataCreator.creator() + final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(COMMENTS_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) .create(); - UgcComments model = new UgcComments(); + final UgcComments model = new UgcComments(); try { model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); } catch (ParseException e) { @@ -145,11 +145,11 @@ private static UgcComments createUgcCommentsEntity(Localization localization, St } private static UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int componentItemType, ContentModelData postFormConfig) { - MvcData mvcData = MvcDataCreator.creator() + final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(POST_FORM_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) .create(); - UgcPostCommentForm model = new UgcPostCommentForm(); + final UgcPostCommentForm model = new UgcPostCommentForm(); try { model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); } catch (ParseException e) { @@ -202,9 +202,9 @@ private static T getValue(ContentModelData metadata, String name, Class t @Nullable @Override public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageModelData modelData) { - ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); - ContentModelData ugcMetadata = ugcMetadata(metadata); - Localization localization = webRequestContext.getLocalization(); + final ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); + final ContentModelData ugcMetadata = ugcMetadata(metadata); + final Localization localization = webRequestContext.getLocalization(); String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); String areaName = pageModel.getMvcData().getAreaName(); @@ -245,7 +245,7 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode @Override public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { - ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); + final ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java index a485568e0..7dadfbcf1 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java @@ -16,7 +16,7 @@ public boolean supports(Class clazz) { @Override public void validate(Object target, Errors errors) { - UgcPostCommentForm form = (UgcPostCommentForm) target; + final UgcPostCommentForm form = (UgcPostCommentForm) target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "userName.empty", form.getNoUserNameMessage()); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emailAddress", "emailAddress.empty", form.getNoEmailAddressMessage()); From e4267398622d525e6c78333e147f59be186b7a6e Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 26 Apr 2018 16:59:38 +0100 Subject: [PATCH 36/78] TSI-3195 : Fixed issue with no comments during POST --- webapp-net/Ugc/Controllers/UgcController.cs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/webapp-net/Ugc/Controllers/UgcController.cs b/webapp-net/Ugc/Controllers/UgcController.cs index bc03d05a3..dabb8e859 100644 --- a/webapp-net/Ugc/Controllers/UgcController.cs +++ b/webapp-net/Ugc/Controllers/UgcController.cs @@ -18,20 +18,10 @@ protected override ViewModel EnrichModel(ViewModel sourceModel) UgcComments model = base.EnrichModel(sourceModel) as UgcComments; if (model != null) { - if (Request.HttpMethod == "POST") - { - // don't retrieve comments on a POST and to keep rendering happy give it an - // empty list - model.Comments = new List(); - } - else - { - var ugcService = new UgcService(); - var comments = ugcService.GetComments(model.Target.PublicationId, model.Target.ItemId, false, - new int[] {}, 0, 0); - model.Comments = CreateEntities(comments); - } - + var ugcService = new UgcService(); + var comments = ugcService.GetComments(model.Target.PublicationId, model.Target.ItemId, false, + new int[] {}, 0, 0); + model.Comments = CreateEntities(comments); return model; } From 948dd93eceea094522ae6c7b9c20605f4b8ceffe Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Mon, 30 Apr 2018 09:48:28 +0200 Subject: [PATCH 37/78] Implemented API Controller removed unneeded webRequestContext --- .../sdl/dxa/modules/ugc/UgcInitializer.java | 2 - .../com/sdl/dxa/modules/ugc/UgcService.java | 9 +- .../ugc/controllers/UgcApiController.java | 101 ++++++++++++++++-- .../ugc/controllers/UgcController.java | 13 +-- 4 files changed, 99 insertions(+), 26 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index c72d2ac67..3b54b721d 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -19,8 +19,6 @@ @Configuration @ComponentScan("com.sdl.dxa.modules.ugc") - - public class UgcInitializer { @Bean diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 1e4bf93de..d8b13afd8 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -21,10 +21,7 @@ import java.time.DayOfWeek; import java.time.Month; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; +import java.util.*; @Service @Slf4j @@ -53,9 +50,9 @@ public UgcService(WebRequestContext webRequestContext) { * @param skip * @return List of Comments */ - public List getComments(int publicationId, int pageId, boolean descending, List statuses, int top, int skip) { + public List getComments(int publicationId, int pageId, boolean descending, Integer[] statuses, int top, int skip) { final List statusStatuses = new ArrayList<>(); - statuses.stream().forEach(status -> { + Arrays.stream(statuses).forEach(status -> { statusStatuses.add(Status.getStatusForId(status)); }); final SimpleCommentsFilter filter = new SimpleCommentsFilter() diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index ee26ccceb..eb4943081 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -1,17 +1,104 @@ package com.sdl.dxa.modules.ugc.controllers; -import com.sdl.webapp.common.api.WebRequestContext; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.sdl.dxa.modules.ugc.UgcService; +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.dxa.modules.ugc.data.PostedComment; +import com.sdl.dxa.modules.ugc.data.PubIdTitleLang; import com.sdl.webapp.common.controller.BaseController; -import com.sdl.webapp.common.controller.ControllerUtils; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.Nullable; +import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.POST; @Controller -@RequestMapping(value = { "/api/comments", "/{path}/api/comments"}) +@RequestMapping(value = {"/api/comments", "/{path}/api/comments"}) @Slf4j -public class UgcApiController extends BaseController{ +public class UgcApiController extends BaseController { + + @RequestMapping(method = GET, value = "/{publicationId}/{pageId}", + produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public List getComments(@PathVariable("publicationId") Integer publicationId, + @PathVariable("pageId") Integer pageId, + @RequestParam(value = "descending", + required = false, + defaultValue = "false") Boolean descending, + @RequestParam(value = "status[]", + required = false, + defaultValue = "0") Integer[] status, + @RequestParam(value = "top", + required = false, + defaultValue = "0") Integer top, + @RequestParam(value = "skip", + required = false, + defaultValue = "0") Integer skip) { + final UgcService ugcService = new UgcService(context); + return ugcService.getComments(publicationId, pageId, descending, status, top, skip); + } + + @RequestMapping(method = POST, value = "/add", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public Comment postComment(@RequestBody PostedComment input) { + final UgcService ugcService = new UgcService(context); + Map metadata = new HashMap<>(); + metadata.put("publicationTitle", input.getPublicationTitle()); + metadata.put("publicationUrl", input.getPublicationUrl()); + metadata.put("itemTitle", input.getPageTitle()); + metadata.put("itemUrl", input.getPageUrl()); + metadata.put("language", input.getLanguage()); + metadata.put("status", "0"); + + addPubIdTitleLangToCommentMetadata(input, metadata); + + return ugcService.postComment(input.getPublicationId(), + input.getPageId(), + input.getUsername(), + input.getEmail(), + input.getContent(), + input.getParentId(), + metadata); + } + + @RequestMapping("/upvote") + public String upVoteComment(@RequestParam(value = "commentId", + required = false, + defaultValue = "0") Integer commentId) { + final UgcService ugcService = new UgcService(context); + ugcService.upVoteComment(commentId); + return String.format("redirect:%s",context.getFullUrl()); + } + + @RequestMapping("/downvote") + public String downVoteComment(@RequestParam(value = "commentId", + required = false, + defaultValue = "0") Integer commentId) { + final UgcService ugcService = new UgcService(context); + ugcService.downVoteComment(commentId); + return String.format("redirect:%s",context.getFullUrl()); + } + + private void addPubIdTitleLangToCommentMetadata(@RequestBody PostedComment input, Map metadata) { + PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); + pubIdTitleLang.setId(input.getPublicationId()); + pubIdTitleLang.setLang(input.getLanguage()); + pubIdTitleLang.setTitle(input.getPublicationTitle()); + + Gson gSon = new GsonBuilder().create(); + String pubIdTitleLangJson = gSon.toJson(pubIdTitleLang); + + metadata.put("pubIdTitleLang", pubIdTitleLangJson); + } + } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 8cba37734..ce2c6a1a1 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -5,11 +5,9 @@ import com.sdl.dxa.modules.ugc.model.entity.UgcComment; import com.sdl.dxa.modules.ugc.model.entity.UgcComments; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; -import com.sdl.webapp.common.api.WebRequestContext; import com.sdl.webapp.common.api.model.EntityModel; import com.sdl.webapp.common.api.model.ViewModel; import com.sdl.webapp.common.controller.EntityController; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import javax.servlet.http.HttpServletRequest; @@ -19,13 +17,6 @@ @Controller public class UgcController extends EntityController { - private final WebRequestContext webRequestContext; - - @Autowired - public UgcController(WebRequestContext webRequestContext) { - this.webRequestContext = webRequestContext; - } - private static List createEntities(List comments) { final List ugcComments = new ArrayList<>(); @@ -48,7 +39,7 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr final UgcService ugcService = new UgcService(context); final UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); final List comments = ugcService.getComments(ugcComments.getTarget().getPublicationId(), - ugcComments.getTarget().getItemId(), false, new ArrayList<>(), 0, 0); + ugcComments.getTarget().getItemId(), false, new Integer[0], 0, 0); ugcComments.setComments(createEntities(comments)); return ugcComments; } @@ -56,7 +47,7 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr if (model instanceof UgcPostCommentForm) { final ViewModel enrichedModel = super.enrichModel(model, request); final UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); - postForm.setFormUrl(webRequestContext.getPage().getUrl()); + postForm.setFormUrl(context.getPage().getUrl()); } return model; From a8b0686e7566e2d2b5f220e7069a63f2f6c0cf92 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 3 May 2018 12:14:55 +0100 Subject: [PATCH 38/78] TSI-3200 : Return empty hash to avoid using more expensive default impl since this is not needed under TridionDocs --- .../TridionDocs/Localization/TridionDocsLocalization.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs b/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs index 23d905c6d..8993e6e74 100644 --- a/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs +++ b/webapp-net/TridionDocs/Localization/TridionDocsLocalization.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using Sdl.Web.Common.Configuration; @@ -27,6 +28,9 @@ protected override void Load() } } + public override IDictionary GetResources(string sectionName = null) + => new Hashtable(); // no resources so return empty hash to avoid default impl + public override bool IsStaticContentUrl(string urlPath) { List mediaPatterns = new List(); From afa320140e2876d9d39a613268532f22a6a3d74e Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Sun, 6 May 2018 08:55:11 +0200 Subject: [PATCH 39/78] First round of debugging Fixed bugs in usercomment --- webapp-java/dxa-module-ugc/pom.xml | 14 ++++- .../sdl/dxa/modules/ugc/UgcInitializer.java | 3 +- .../com/sdl/dxa/modules/ugc/UgcService.java | 9 ++- .../ugc/controllers/UgcApiController.java | 13 +++-- .../ugc/controllers/UgcController.java | 15 ++++- .../controllers/UgcPostFormController.java | 4 +- .../modules/ugc/mapping/UgcModelBuilder.java | 55 +++++++++++-------- .../WEB-INF/Views/Ugc/Entity/UgcComments.jsp | 14 ++--- .../Views/Ugc/Entity/UgcPostCommentForm.jsp | 10 ++-- 9 files changed, 91 insertions(+), 46 deletions(-) diff --git a/webapp-java/dxa-module-ugc/pom.xml b/webapp-java/dxa-module-ugc/pom.xml index 403a35734..c5736a733 100644 --- a/webapp-java/dxa-module-ugc/pom.xml +++ b/webapp-java/dxa-module-ugc/pom.xml @@ -21,6 +21,9 @@ scm:git:git@github.com:sdl/dxa-modules.git HEAD + + 11.0.0-SNAPSHOT + @@ -33,9 +36,14 @@ - com.sdl.web - cil - pom + com.sdl.delivery + udp-cil-api + ${ugc-cil.version} + + + com.sdl.delivery + udp-ugc-cil-api + ${ugc-cil.version} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index 3b54b721d..f1db3c496 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -12,11 +12,13 @@ import com.sdl.webapp.common.api.mapping.views.RegisteredViewModel; import com.sdl.webapp.common.api.mapping.views.RegisteredViewModels; import com.sdl.webapp.common.api.model.page.DefaultPageModel; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; +@Slf4j @Configuration @ComponentScan("com.sdl.dxa.modules.ugc") public class UgcInitializer { @@ -33,7 +35,6 @@ public class UgcInitializer { @RegisteredViewModel(viewName = "Comments", modelClass = UgcRegion.class), @RegisteredViewModel(viewName = "UgcComments", modelClass = UgcComments.class), @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class), - @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class), @RegisteredViewModel(viewName = "GeneralPage", modelClass = DefaultPageModel.class) }) @ModuleInfo(name = "UGC module", areaName = "Ugc", description = "Support for UGC views") diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index d8b13afd8..df4fb4b46 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -120,7 +120,9 @@ private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { } final Comment c = new Comment(); c.setId(comment.getIdLong()); - c.setParentId(comment.getParent().getIdLong()); + if (comment.getParent() != null) { + c.setParentId(comment.getParent().getIdLong()); + } c.setItemId(comment.getItemId()); c.setItemType(comment.getItemType()); c.setItemPublicationId(comment.getItemPublicationId()); @@ -133,6 +135,11 @@ private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { if (comment.getCreationDate() != null) { c.setCreationDate(convert(comment.getCreationDate())); } + if (comment.getLastModifiedDate() != null) { + c.setLastModifiedDate(convert(comment.getLastModifiedDate())); + } + c.setChildren(convert(comment.getChildren())); + return c; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index eb4943081..077b690a8 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -8,6 +8,7 @@ import com.sdl.dxa.modules.ugc.data.PubIdTitleLang; import com.sdl.webapp.common.controller.BaseController; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -25,6 +26,14 @@ @Slf4j public class UgcApiController extends BaseController { + @Autowired + private UgcService ugcService; + + @Autowired + public UgcApiController(UgcService ugcService) { + this.ugcService = ugcService; + } + @RequestMapping(method = GET, value = "/{publicationId}/{pageId}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @@ -42,7 +51,6 @@ public List getComments(@PathVariable("publicationId") Integer publicat @RequestParam(value = "skip", required = false, defaultValue = "0") Integer skip) { - final UgcService ugcService = new UgcService(context); return ugcService.getComments(publicationId, pageId, descending, status, top, skip); } @@ -51,7 +59,6 @@ public List getComments(@PathVariable("publicationId") Integer publicat consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Comment postComment(@RequestBody PostedComment input) { - final UgcService ugcService = new UgcService(context); Map metadata = new HashMap<>(); metadata.put("publicationTitle", input.getPublicationTitle()); metadata.put("publicationUrl", input.getPublicationUrl()); @@ -75,7 +82,6 @@ public Comment postComment(@RequestBody PostedComment input) { public String upVoteComment(@RequestParam(value = "commentId", required = false, defaultValue = "0") Integer commentId) { - final UgcService ugcService = new UgcService(context); ugcService.upVoteComment(commentId); return String.format("redirect:%s",context.getFullUrl()); } @@ -84,7 +90,6 @@ public String upVoteComment(@RequestParam(value = "commentId", public String downVoteComment(@RequestParam(value = "commentId", required = false, defaultValue = "0") Integer commentId) { - final UgcService ugcService = new UgcService(context); ugcService.downVoteComment(commentId); return String.format("redirect:%s",context.getFullUrl()); } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index ce2c6a1a1..6e8c7a287 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -8,15 +8,22 @@ import com.sdl.webapp.common.api.model.EntityModel; import com.sdl.webapp.common.api.model.ViewModel; import com.sdl.webapp.common.controller.EntityController; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @Controller +@RequestMapping({"/system/mvc/Framework/Ugc"}) public class UgcController extends EntityController { + @Autowired + private UgcService ugcService; + private static List createEntities(List comments) { final List ugcComments = new ArrayList<>(); @@ -26,6 +33,7 @@ private static List createEntities(List comments) { private static UgcComment createEntity(Comment comment) { final UgcComment ugcComment = new UgcComment(); + ugcComment.setComments(createEntities(comment.getChildren())); ugcComment.setCommentData(comment); return ugcComment; @@ -36,7 +44,6 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr if (model instanceof UgcComments) { final ViewModel enrichedModel = super.enrichModel(model, request); - final UgcService ugcService = new UgcService(context); final UgcComments ugcComments = (UgcComments) (enrichedModel instanceof EntityModel ? enrichedModel : model); final List comments = ugcService.getComments(ugcComments.getTarget().getPublicationId(), ugcComments.getTarget().getItemId(), false, new Integer[0], 0, 0); @@ -52,4 +59,10 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr } return model; } + + @RequestMapping({"Entity/{entityId}"}) + public String handleGetEntity(HttpServletRequest request, @PathVariable String entityId) throws Exception { + return this.handleEntityRequest(request, entityId); + } + } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index edc81bb68..a41f195de 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -26,6 +26,9 @@ public class UgcPostFormController { private final WebRequestContext webRequestContext; private final UgcPostCommentFormValidator ugcPostCommentFormValidator; + @Autowired + private UgcService ugcService; + @Autowired public UgcPostFormController(WebRequestContext webRequestContext, UgcPostCommentFormValidator ugcPostCommentFormValidator) { @@ -45,7 +48,6 @@ public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, Bin } log.trace("Comment Form complete and valid"); - UgcService ugcService = new UgcService(webRequestContext); ugcService.postComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 8d84dcad3..d3b69e24b 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -112,7 +112,7 @@ private static void addCommentsViews(PageModel pageModel, RegionModel region, Lo } if (entity.getExtensionData().containsKey(SHOW_COMMENTS_EXT_DATA) && - (boolean) entity.getExtensionData().get(SHOW_COMMENTS_EXT_DATA)) { + (Boolean) entity.getExtensionData().get(SHOW_COMMENTS_EXT_DATA)) { entities.add(createUgcCommentsEntity(localization, entity.getId(), TcmUtils.COMPONENT_ITEM_TYPE)); } if (entity.getExtensionData().containsKey(POST_COMMENTS_EXT_DATA) && entity.getExtensionData().get(POST_COMMENTS_EXT_DATA) != null) { @@ -129,31 +129,31 @@ private static void addCommentsViews(PageModel pageModel, RegionModel region, Lo }); } - private static UgcComments createUgcCommentsEntity(Localization localization, String id, int componentItemType) { + private static UgcComments createUgcCommentsEntity(Localization localization, String id, int itemType) { final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(COMMENTS_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) .create(); final UgcComments model = new UgcComments(); try { - model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, itemType))); } catch (ParseException e) { - log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType)); + log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, itemType)); } model.setMvcData(mvcData); return model; } - private static UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int componentItemType, ContentModelData postFormConfig) { + private static UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int itemType, ContentModelData postFormConfig) { final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(POST_FORM_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) .create(); final UgcPostCommentForm model = new UgcPostCommentForm(); try { - model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, componentItemType))); + model.setTarget(new TCMURI(TcmUtils.buildTcmUri(localization.getId(), id, itemType))); } catch (ParseException e) { - log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, componentItemType)); + log.error("Unable to process TCMURI '{}'.", TcmUtils.buildTcmUri(localization.getId(), id, itemType)); } model.setMvcData(mvcData); model.setUserNameLabel(getValue(postFormConfig, "userNameLabel", String.class)); @@ -175,25 +175,32 @@ private static ContentModelData ugcPostFormMetadata(ContentModelData ugcMetadata return ugcMetadata == null ? null : ugcMetadata.getAndCast(POST_FORM_CONFIG, ContentModelData.class); } - private static boolean showComments(ContentModelData ugcMetadata) { - return getValue(ugcMetadata, SHOW_COMMENTS_KEY, boolean.class); + private static Boolean showComments(ContentModelData ugcMetadata) { + return getValue(ugcMetadata, SHOW_COMMENTS_KEY, Boolean.class); } - private static boolean postComments(ContentModelData ugcMetadata) { - return getValue(ugcMetadata, ALLOW_POST_KEY, boolean.class); + private static Boolean postComments(ContentModelData ugcMetadata) { + return getValue(ugcMetadata, ALLOW_POST_KEY, Boolean.class); } private static T getValue(ContentModelData metadata, String name, Class type) { if (metadata == null || !metadata.containsKey(name)) { + if (type == Boolean.class) { + //noinspection unchecked + return (T) (Boolean.valueOf("No")); + } return null; } Object v = metadata.get(name); if (v == null) { - return null; + if (type == Boolean.class) { + //noinspection unchecked + return (T) Boolean.FALSE; + }return null; } if (type == Boolean.class) { //noinspection unchecked - return (T) Boolean.valueOf("Yes"); + return (T) (v.toString().equalsIgnoreCase("yes")? Boolean.TRUE:Boolean.FALSE); } //noinspection unchecked return (T) v; @@ -208,23 +215,24 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); String areaName = pageModel.getMvcData().getAreaName(); - RegionModel ugcRegion; + final RegionModel ugcRegion;RegionModel ugcRegion1; if (StringUtils.isEmpty(regionName)) { areaName = COMMENTS_AREA; regionName = COMMENTS_REGION; - ugcRegion = findRegion(pageModel.getRegions(), COMMENTS_REGION); - if (ugcRegion == null) { - createRegion(pageModel, areaName, regionName); + ugcRegion1 = findRegion(pageModel.getRegions(), COMMENTS_REGION); + if (ugcRegion1 == null) { + ugcRegion1 = createRegion(pageModel, areaName, regionName); } } else { - ugcRegion = findRegion(pageModel.getRegions(), regionName); - if (ugcRegion == null) { + ugcRegion1 = findRegion(pageModel.getRegions(), regionName); + if (ugcRegion1 == null) { log.error("Unable to locate region for comments '{}'.", regionName); } } // Entity Comments + ugcRegion = ugcRegion1; pageModel.getRegions().stream().forEach(region -> { addCommentsViews(pageModel, region, localization, ugcRegion); }); @@ -246,10 +254,11 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { final ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); - entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); - entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); - entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); - + if (ugcMetadata != null) { + entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); + entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); + entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + } return entityModel; } diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp index ea07962ff..fc1b0328c 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp @@ -4,27 +4,27 @@ scope="request"/>
-

Comments (${entity.Comments.size()})

+

Comments (${entity.comments.size()})


- +
- ${comment.User.Name} + ${comment.commentData.user.name} - - +
-

${comment.Content}

+

${comment.commentData.content}

- ${comment.Rating} - + ${comment.commentData.rating} + - Reply
diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp index 8f6403d2d..823358f5b 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp @@ -8,7 +8,7 @@
- <%--@elvariable id="errors" type="java.util.ArrayList"--%>
@@ -22,17 +22,17 @@
- +
- +
- +
- +
\ No newline at end of file From 403a2009c7d5ee4e0d8330eb4f9d24a27204113c Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Mon, 7 May 2018 10:41:17 +0200 Subject: [PATCH 40/78] Working Comment Post and Dummy up/downvote --- .../java/com/sdl/dxa/modules/ugc/UgcInitializer.java | 2 +- .../dxa/modules/ugc/controllers/UgcApiController.java | 10 ++++++---- .../dxa/modules/ugc/controllers/UgcController.java | 2 +- .../ugc/controllers/UgcPostFormController.java | 3 ++- .../modules/ugc/model/entity/UgcPostCommentForm.java | 11 +++++++++++ .../WEB-INF/Views/Ugc/Entity/UgcComments.jsp | 3 +-- .../WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp | 5 ++++- 7 files changed, 26 insertions(+), 10 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index f1db3c496..f3ef964e5 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -34,7 +34,7 @@ public class UgcInitializer { @RegisteredViewModels({ @RegisteredViewModel(viewName = "Comments", modelClass = UgcRegion.class), @RegisteredViewModel(viewName = "UgcComments", modelClass = UgcComments.class), - @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class), + @RegisteredViewModel(viewName = "UgcPostCommentForm", modelClass = UgcPostCommentForm.class, controllerName = "Ugc"), @RegisteredViewModel(viewName = "GeneralPage", modelClass = DefaultPageModel.class) }) @ModuleInfo(name = "UGC module", areaName = "Ugc", description = "Support for UGC views") diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index 077b690a8..38fa29604 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -13,6 +13,8 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -81,17 +83,17 @@ public Comment postComment(@RequestBody PostedComment input) { @RequestMapping("/upvote") public String upVoteComment(@RequestParam(value = "commentId", required = false, - defaultValue = "0") Integer commentId) { + defaultValue = "0") Integer commentId, HttpServletRequest request, HttpServletResponse response) { ugcService.upVoteComment(commentId); - return String.format("redirect:%s",context.getFullUrl()); + return String.format("redirect:%s",request.getHeader("referer")); } @RequestMapping("/downvote") public String downVoteComment(@RequestParam(value = "commentId", required = false, - defaultValue = "0") Integer commentId) { + defaultValue = "0") Integer commentId, HttpServletRequest request, HttpServletResponse response) { ugcService.downVoteComment(commentId); - return String.format("redirect:%s",context.getFullUrl()); + return String.format("redirect:%s",request.getHeader("referer")); } private void addPubIdTitleLangToCommentMetadata(@RequestBody PostedComment input, Map metadata) { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 6e8c7a287..8b15a0436 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -54,8 +54,8 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr if (model instanceof UgcPostCommentForm) { final ViewModel enrichedModel = super.enrichModel(model, request); final UgcPostCommentForm postForm = (UgcPostCommentForm) (enrichedModel instanceof EntityModel ? enrichedModel : model); - postForm.setFormUrl(context.getPage().getUrl()); + postForm.setFormUrl(context.getPage().getUrl()); } return model; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index a41f195de..a45985848 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; @@ -38,7 +39,7 @@ public UgcPostFormController(WebRequestContext webRequestContext, @RequestMapping(value = "/postcomment", method = RequestMethod.POST) public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes, - HttpServletRequest request, HttpServletResponse response) { + HttpServletRequest request, HttpServletResponse response) { ugcPostCommentFormValidator.validate(form, bindingResult); if (bindingResult.hasErrors()) { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java index bf083e3fd..3585c69d7 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java @@ -4,6 +4,7 @@ import com.sdl.dxa.caching.NeverCached; import com.sdl.webapp.common.api.mapping.semantic.annotations.SemanticMappingIgnore; import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import com.sdl.webapp.common.api.model.validation.DynamicCodeResolver; import com.sdl.webapp.common.api.model.validation.DynamicValidationMessage; import com.tridion.util.CMURI; import lombok.Data; @@ -115,4 +116,14 @@ public String getNoContentMessage() { return noContentMessage; } + /** + * Resolves error code using {@link DynamicCodeResolver}. + * + * @param code code to resolve + * @return resolved message + */ + public String resolveErrorCode(String code) { + return DynamicCodeResolver.resolveCode(code, this); + } + } diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp index fc1b0328c..f8286b25d 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp @@ -25,8 +25,7 @@ ${comment.commentData.rating} - - - Reply +
diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp index 823358f5b..aa6fada03 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp @@ -7,7 +7,7 @@
- + <%--@elvariable id="errors" type="java.util.ArrayList"--%> @@ -30,6 +30,9 @@
+ + +
From 603f3fffcddc50781681133e1bcd3745761505ff Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Tue, 8 May 2018 09:41:04 +0200 Subject: [PATCH 41/78] Minor improvements JavaDoc added where relevant --- .../com/sdl/dxa/modules/ugc/UgcService.java | 48 ++++++++--------- .../ugc/controllers/UgcApiController.java | 3 +- .../controllers/UgcPostFormController.java | 21 +++----- .../modules/ugc/mapping/UgcModelBuilder.java | 54 +++++++++++-------- .../ugc/mock/MockUgcVoteCommentApi.java | 10 +++- 5 files changed, 67 insertions(+), 69 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index df4fb4b46..87e524b18 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -6,7 +6,6 @@ import com.sdl.dxa.modules.ugc.data.Comment; import com.sdl.dxa.modules.ugc.data.User; import com.sdl.web.ugc.Status; -import com.sdl.webapp.common.api.WebRequestContext; import com.sdl.webapp.common.util.TcmUtils; import com.tridion.ambientdata.AmbientDataContext; import com.tridion.ambientdata.claimstore.ClaimStore; @@ -28,7 +27,7 @@ public class UgcService { private static final int maximumThreadsDepth = -1; - private final WebRequestContext webRequestContext; +// private final WebRequestContext webRequestContext; @Autowired private UgcCommentApi ugcCommentApi; @@ -37,24 +36,21 @@ public class UgcService { private UgcVoteCommentApi ugcVoteCommentApi; @Autowired - public UgcService(WebRequestContext webRequestContext) { - this.webRequestContext = webRequestContext; + public UgcService() { } /** - * @param publicationId - * @param pageId - * @param descending - * @param statuses - * @param top - * @param skip - * @return List of Comments + * @param publicationId Publication Id + * @param pageId Page Id + * @param descending Order + * @param statuses Limit to specific statuses + * @param top maximum number of comments to show + * @param skip number of comments to skip + * @return List of {@link Comment} */ public List getComments(int publicationId, int pageId, boolean descending, Integer[] statuses, int top, int skip) { final List statusStatuses = new ArrayList<>(); - Arrays.stream(statuses).forEach(status -> { - statusStatuses.add(Status.getStatusForId(status)); - }); + Arrays.stream(statuses).forEach(status -> statusStatuses.add(Status.getStatusForId(status))); final SimpleCommentsFilter filter = new SimpleCommentsFilter() .withTop(top) .withSkip(skip) @@ -65,14 +61,14 @@ public List getComments(int publicationId, int pageId, boolean descendi } /** - * @param publicationId - * @param pageId - * @param username - * @param email - * @param content - * @param parentId - * @param metadata - * @return Comment + * @param publicationId Publication Id + * @param pageId Page Id + * @param username User name + * @param email Email address + * @param content Post content + * @param parentId parent + * @param metadata Meta data + * @return {@link Comment} */ public Comment postComment(int publicationId, int pageId, String username, String email, String content, int parentId, Map metadata) { @@ -91,14 +87,14 @@ public Comment postComment(int publicationId, int pageId, String username, Strin } /** - * @param commentId + * @param commentId comment id */ public void upVoteComment(long commentId) { ugcVoteCommentApi.voteCommentUp(commentId); } /** - * @param commentId + * @param commentId comment id */ public void downVoteComment(long commentId) { ugcVoteCommentApi.voteCommentDown(commentId); @@ -107,9 +103,7 @@ public void downVoteComment(long commentId) { private List convert(List comments) { final List convertedComments = new ArrayList<>(); - comments.stream().forEach(comment -> { - convertedComments.add(convert(comment)); - }); + comments.forEach(comment -> convertedComments.add(convert(comment))); return convertedComments; } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index 38fa29604..637867e8f 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -32,8 +32,7 @@ public class UgcApiController extends BaseController { private UgcService ugcService; @Autowired - public UgcApiController(UgcService ugcService) { - this.ugcService = ugcService; + public UgcApiController() { } @RequestMapping(method = GET, value = "/{publicationId}/{pageId}", diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index a45985848..ffb03de78 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -3,20 +3,15 @@ import com.sdl.dxa.modules.ugc.UgcService; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; import com.sdl.dxa.modules.ugc.model.validator.UgcPostCommentFormValidator; -import com.sdl.webapp.common.api.WebRequestContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - @Controller @RequestMapping(value = {"/api/ugc", "/{path}/api/ugc"}) @Slf4j @@ -24,33 +19,29 @@ public class UgcPostFormController { private static final String REDIRECT_PREFIX = "redirect:"; - private final WebRequestContext webRequestContext; private final UgcPostCommentFormValidator ugcPostCommentFormValidator; @Autowired private UgcService ugcService; @Autowired - public UgcPostFormController(WebRequestContext webRequestContext, - UgcPostCommentFormValidator ugcPostCommentFormValidator) { - this.webRequestContext = webRequestContext; + public UgcPostFormController(UgcPostCommentFormValidator ugcPostCommentFormValidator) { this.ugcPostCommentFormValidator = ugcPostCommentFormValidator; } @RequestMapping(value = "/postcomment", method = RequestMethod.POST) - public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes, - HttpServletRequest request, HttpServletResponse response) { + public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) { ugcPostCommentFormValidator.validate(form, bindingResult); if (bindingResult.hasErrors()) { - log.trace("Comment Form has {} errors",bindingResult.getErrorCount()); + log.trace("Comment Form has {} errors", bindingResult.getErrorCount()); redirectAttributes.addFlashAttribute("errors", bindingResult.getAllErrors()); return REDIRECT_PREFIX + form.getFormUrl(); } - log.trace("Comment Form complete and valid"); + log.trace("Comment Form complete and valid"); - ugcService.postComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), - form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); + ugcService.postComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), + form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); log.trace("Comment posted succesful {}", form.getUserName()); return REDIRECT_PREFIX + form.getFormUrl(); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index d3b69e24b..94c7741ff 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -49,13 +49,10 @@ public class UgcModelBuilder implements PageModelBuilder, EntityModelBuilder { private static final String COMMENTS_QUALIFIED_NAME = "Ugc:Ugc:UgcComments"; private static final String POST_FORM_QUALIFIED_NAME = "Ugc:Ugc:UgcPostCommentForm"; - private final HttpServletRequest httpServletRequest; - private final WebRequestContext webRequestContext; @Autowired - public UgcModelBuilder(HttpServletRequest httpServletRequest, WebRequestContext webRequestContext) { - this.httpServletRequest = httpServletRequest; + public UgcModelBuilder(WebRequestContext webRequestContext) { this.webRequestContext = webRequestContext; } @@ -121,12 +118,8 @@ private static void addCommentsViews(PageModel pageModel, RegionModel region, Lo } } // Add our ugc views to either the same region as the entity we have comments enabled for or the ugc "Comments" region if available - regionEntities.stream().forEach(entity -> { - region.getEntities().add(entity); - }); - region.getRegions().stream().forEach(childRegion -> { - addCommentsViews(pageModel, childRegion, localization, ugcRegion); - }); + regionEntities.forEach(entity -> region.getEntities().add(entity)); + region.getRegions().forEach(childRegion -> addCommentsViews(pageModel, childRegion, localization, ugcRegion)); } private static UgcComments createUgcCommentsEntity(Localization localization, String id, int itemType) { @@ -196,16 +189,22 @@ private static T getValue(ContentModelData metadata, String name, Class t if (type == Boolean.class) { //noinspection unchecked return (T) Boolean.FALSE; - }return null; + } + return null; } if (type == Boolean.class) { //noinspection unchecked - return (T) (v.toString().equalsIgnoreCase("yes")? Boolean.TRUE:Boolean.FALSE); + return (T) (v.toString().equalsIgnoreCase("yes") ? Boolean.TRUE : Boolean.FALSE); } //noinspection unchecked return (T) v; } + /** + * {@inheritDoc} + * + * @dxa.publicApi + */ @Nullable @Override public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageModelData modelData) { @@ -215,27 +214,26 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); String areaName = pageModel.getMvcData().getAreaName(); - final RegionModel ugcRegion;RegionModel ugcRegion1; + final RegionModel ugcRegion; + RegionModel ugcRegionModel; if (StringUtils.isEmpty(regionName)) { areaName = COMMENTS_AREA; regionName = COMMENTS_REGION; - ugcRegion1 = findRegion(pageModel.getRegions(), COMMENTS_REGION); - if (ugcRegion1 == null) { - ugcRegion1 = createRegion(pageModel, areaName, regionName); + ugcRegionModel = findRegion(pageModel.getRegions(), COMMENTS_REGION); + if (ugcRegionModel == null) { + ugcRegionModel = createRegion(pageModel, areaName, regionName); } } else { - ugcRegion1 = findRegion(pageModel.getRegions(), regionName); - if (ugcRegion1 == null) { + ugcRegionModel = findRegion(pageModel.getRegions(), regionName); + if (ugcRegionModel == null) { log.error("Unable to locate region for comments '{}'.", regionName); } } // Entity Comments - ugcRegion = ugcRegion1; - pageModel.getRegions().stream().forEach(region -> { - addCommentsViews(pageModel, region, localization, ugcRegion); - }); + ugcRegion = ugcRegionModel; + pageModel.getRegions().forEach(region -> addCommentsViews(pageModel, region, localization, ugcRegion)); if (ugcRegion != null) { // Page Comments @@ -250,18 +248,28 @@ public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageMode return pageModel; } + /** + * {@inheritDoc} + * + * @dxa.publicApi + */ @Override public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { final ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); if (ugcMetadata != null) { - entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); + entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); } return entityModel; } + /** + * {@inheritDoc} + * + * @dxa.publicApi + */ @Override public int getOrder() { return 0; diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java index 627f0c045..92cfc6720 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java @@ -3,11 +3,17 @@ import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; public class MockUgcVoteCommentApi implements UgcVoteCommentApi { + /** + * @param id Comment Id + */ @Override - public void voteCommentUp(long l) { + public void voteCommentUp(long id) { } + /** + * @param id Comment Id + */ @Override - public void voteCommentDown(long l) { + public void voteCommentDown(long id) { } } From 8aad032db44d887501695a4eac4e9d31972d5edd Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Tue, 8 May 2018 09:42:12 +0200 Subject: [PATCH 42/78] First Unit tests added --- .../ugc/model/entity/UgcCommentTest.java | 119 ++++++++++++++++++ .../ugc/model/entity/UgcCommentsTest.java | 74 +++++++++++ 2 files changed, 193 insertions(+) create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java new file mode 100644 index 000000000..6221e7b2f --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java @@ -0,0 +1,119 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sdl.dxa.DxaSpringInitialization; +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.dxa.modules.ugc.data.User; +import com.sdl.webapp.common.util.ApplicationContextHolder; +import com.sdl.webapp.common.util.TcmUtils; +import org.joda.time.DateTime; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class) +@ActiveProfiles("test") +public class UgcCommentTest { + private static UgcComment ugcComment = new UgcComment(); + private static Comment commentData = new Comment(); + private static List comments = new ArrayList<>(); + private static UgcComment otherComment = new UgcComment(); + private static Comment.CommentDate commentDate = new Comment.CommentDate(); + private static DateTime time = DateTime.now(); + private static User user = new User(); + + static { + commentDate.setDateTime(time); + + user.setEmailAddress("test@test.test"); + user.setName("Tester"); + user.setExternalId("ExternalId"); + user.setId("Id"); + + commentData.setCreationDate(commentDate); + commentData.setLastModifiedDate(commentDate); + commentData.setContent("Comment"); + commentData.setId(1); + commentData.setItemId(2); + commentData.setItemPublicationId(3); + commentData.setParentId(4); + commentData.setItemType(TcmUtils.COMPONENT_ITEM_TYPE); + commentData.setRating(5); + commentData.setUser(user); + + otherComment.setCommentData(commentData); + otherComment.setComments(comments); + + ugcComment.setCommentData(commentData); + ugcComment.setComments(comments); + } + + @Test + public void shouldReturnCommentData() { + //given + + //when + + //then + assertEquals(commentData, ugcComment.getCommentData()); + } + + @Test + public void shouldReturnUserName() { + //given + + //when + + //then + assertEquals("Tester", ugcComment.getCommentData().getUser().getName()); + } + + @Test + public void shouldReturnComments() throws Exception { + //given + + //when + + //then + assertEquals(comments, ugcComment.getComments()); + } + + @Test + public void shouldReturnCreationDate() throws Exception { + //given + + //when + + //then + assertEquals(commentDate, ugcComment.getCommentData().getCreationDate()); + } + + + @Configuration + @Profile("test") + static class SpringContext { + + @Bean + public ApplicationContextHolder applicationContextHolder() { + return new ApplicationContextHolder(); + } + + @Bean + public ObjectMapper objectMapper() { + return new DxaSpringInitialization().objectMapper(); + } + } + +} \ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java new file mode 100644 index 000000000..204368e6b --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java @@ -0,0 +1,74 @@ +package com.sdl.dxa.modules.ugc.model.entity; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sdl.dxa.DxaSpringInitialization; +import com.sdl.webapp.common.util.ApplicationContextHolder; +import com.sdl.webapp.common.util.TcmUtils; +import com.tridion.util.CMURI; +import com.tridion.util.TCMURI; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class) +@ActiveProfiles("test") +public class UgcCommentsTest { + + private static UgcComments ugcComments = new UgcComments(); + private static UgcComment ugcComment = new UgcComment(); + private static List comments = new ArrayList<>(); + private static CMURI target; + + static { + } + + @Test + public void shouldReturnComments() { + //given + comments.add(ugcComment); + ugcComments.setComments(comments); + //when + + //then + assertEquals(ugcComment, ugcComments.getComments().get(0)); + } + + @Test + public void setTarget() throws Exception{ + //given + target = new TCMURI(TcmUtils.buildTcmUri(1, 2, TcmUtils.COMPONENT_ITEM_TYPE)); + ugcComments.setTarget(target); + //when + + //then + assertEquals(target, ugcComments.getTarget()); + } + + @Configuration + @Profile("test") + static class SpringContext { + + @Bean + public ApplicationContextHolder applicationContextHolder() { + return new ApplicationContextHolder(); + } + + @Bean + public ObjectMapper objectMapper() { + return new DxaSpringInitialization().objectMapper(); + } + } + +} \ No newline at end of file From 3aeb95c4ef02e4aff111f141cfcfa1c8bd9d87a2 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Wed, 9 May 2018 09:06:46 +0200 Subject: [PATCH 43/78] Added Javadoc Comments --- .../sdl/dxa/modules/ugc/UgcInitializer.java | 13 +++- .../com/sdl/dxa/modules/ugc/UgcService.java | 12 ++- .../ugc/controllers/UgcApiController.java | 73 ++++++++++++++----- .../ugc/controllers/UgcController.java | 13 ++++ .../controllers/UgcPostFormController.java | 12 +++ .../com/sdl/dxa/modules/ugc/data/Comment.java | 4 + .../dxa/modules/ugc/data/PostedComment.java | 4 + .../dxa/modules/ugc/data/PubIdTitleLang.java | 4 + .../com/sdl/dxa/modules/ugc/data/User.java | 3 + .../modules/ugc/mapping/UgcModelBuilder.java | 51 +++++++------ .../ugc/mock/MockUgcVoteCommentApi.java | 7 ++ .../modules/ugc/model/entity/UgcComment.java | 3 + .../modules/ugc/model/entity/UgcComments.java | 3 + .../ugc/model/entity/UgcPostCommentForm.java | 2 +- .../modules/ugc/model/entity/UgcRegion.java | 10 +-- .../UgcPostCommentFormValidator.java | 14 ++++ 16 files changed, 178 insertions(+), 50 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index f3ef964e5..8817db027 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -18,17 +18,26 @@ import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; +/** + *

Ugc Module initializer which initializes + * views registration in modules with {@link RegisteredViewModel} and {@link RegisteredViewModels}. + *

+ */ @Slf4j @Configuration @ComponentScan("com.sdl.dxa.modules.ugc") public class UgcInitializer { @Bean - public UgcCommentApi ugcCommentApi() {return new DefaultUgcCommentApi();} + public UgcCommentApi ugcCommentApi() { + return new DefaultUgcCommentApi(); + } //Todo: create or use real UgcVoteCommentApi implementation @Bean - public UgcVoteCommentApi ugcVoteCommentApi() {return new MockUgcVoteCommentApi();} + public UgcVoteCommentApi ugcVoteCommentApi() { + return new MockUgcVoteCommentApi(); + } @Component @RegisteredViewModels({ diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 87e524b18..8a0fc5d0c 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -22,12 +22,14 @@ import java.time.ZonedDateTime; import java.util.*; +/** + *

Service providing methods to create and retrieve comments

+ */ @Service @Slf4j public class UgcService { private static final int maximumThreadsDepth = -1; -// private final WebRequestContext webRequestContext; @Autowired private UgcCommentApi ugcCommentApi; @@ -40,6 +42,8 @@ public UgcService() { } /** + * retrieves a list of {@link Comment} items for a given page + * * @param publicationId Publication Id * @param pageId Page Id * @param descending Order @@ -61,6 +65,8 @@ public List getComments(int publicationId, int pageId, boolean descendi } /** + * Post {@link Comment} for a given page + * * @param publicationId Publication Id * @param pageId Page Id * @param username User name @@ -87,6 +93,8 @@ public Comment postComment(int publicationId, int pageId, String username, Strin } /** + * Upvote a {@link Comment} with a specific ID on a given page + * * @param commentId comment id */ public void upVoteComment(long commentId) { @@ -94,6 +102,8 @@ public void upVoteComment(long commentId) { } /** + * Downvote a {@link Comment} with a specific ID on a given page + * * @param commentId comment id */ public void downVoteComment(long commentId) { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index 637867e8f..7c2b4cc13 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,6 +22,9 @@ import static org.springframework.web.bind.annotation.RequestMethod.POST; +/** + *

Ugc API controller that handles requests to /api/comments/.

+ */ @Controller @RequestMapping(value = {"/api/comments", "/{path}/api/comments"}) @Slf4j @@ -35,26 +37,45 @@ public class UgcApiController extends BaseController { public UgcApiController() { } + /** + *

handles get request

+ *

listens to basepath/{publicationId}/{pageId}

+ * + * @param publicationId Publication Id + * @param pageId Page Id + * @param descending Sort descending + * @param status limit results to comments with a specific status + * @param top maximum number of comments to show + * @param skip number of comments to skip + * @return List of {@link Comment} + */ @RequestMapping(method = GET, value = "/{publicationId}/{pageId}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List getComments(@PathVariable("publicationId") Integer publicationId, - @PathVariable("pageId") Integer pageId, - @RequestParam(value = "descending", - required = false, - defaultValue = "false") Boolean descending, - @RequestParam(value = "status[]", - required = false, - defaultValue = "0") Integer[] status, - @RequestParam(value = "top", - required = false, - defaultValue = "0") Integer top, - @RequestParam(value = "skip", - required = false, - defaultValue = "0") Integer skip) { + @PathVariable("pageId") Integer pageId, + @RequestParam(value = "descending", + required = false, + defaultValue = "false") Boolean descending, + @RequestParam(value = "status[]", + required = false, + defaultValue = "0") Integer[] status, + @RequestParam(value = "top", + required = false, + defaultValue = "0") Integer top, + @RequestParam(value = "skip", + required = false, + defaultValue = "0") Integer skip) { return ugcService.getComments(publicationId, pageId, descending, status, top, skip); } + /** + *

handles post request

+ *

listens to basepath/add

+ * + * @param input {@link PostedComment} + * @return {@link Comment} + */ @RequestMapping(method = POST, value = "/add", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @@ -79,20 +100,36 @@ public Comment postComment(@RequestBody PostedComment input) { metadata); } + /** + *

handles upvote request

+ *

listens to basepath/upvote

+ * + * @param commentId Comment Id to upvote + * @param request {@link HttpServletRequest}, used to get the referer url + * @return redirect url + */ @RequestMapping("/upvote") public String upVoteComment(@RequestParam(value = "commentId", required = false, - defaultValue = "0") Integer commentId, HttpServletRequest request, HttpServletResponse response) { + defaultValue = "0") Integer commentId, HttpServletRequest request) { ugcService.upVoteComment(commentId); - return String.format("redirect:%s",request.getHeader("referer")); + return String.format("redirect:%s", request.getHeader("referer")); } + /** + *

handles downvote request

+ *

listens to basepath/downvote

+ * + * @param commentId Comment Id to downvote + * @param request {@link HttpServletRequest}, used to get the referer url + * @return redirect url + */ @RequestMapping("/downvote") public String downVoteComment(@RequestParam(value = "commentId", required = false, - defaultValue = "0") Integer commentId, HttpServletRequest request, HttpServletResponse response) { + defaultValue = "0") Integer commentId, HttpServletRequest request) { ugcService.downVoteComment(commentId); - return String.format("redirect:%s",request.getHeader("referer")); + return String.format("redirect:%s", request.getHeader("referer")); } private void addPubIdTitleLangToCommentMetadata(@RequestBody PostedComment input, Map metadata) { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java index 8b15a0436..cca78417a 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcController.java @@ -5,6 +5,7 @@ import com.sdl.dxa.modules.ugc.model.entity.UgcComment; import com.sdl.dxa.modules.ugc.model.entity.UgcComments; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import com.sdl.webapp.common.api.content.ContentProviderException; import com.sdl.webapp.common.api.model.EntityModel; import com.sdl.webapp.common.api.model.ViewModel; import com.sdl.webapp.common.controller.EntityController; @@ -17,6 +18,9 @@ import java.util.ArrayList; import java.util.List; +/** + *

Ugc entity controller that handles include requests to /system/mvc/Framework/Ugc/{entityId}.

+ */ @Controller @RequestMapping({"/system/mvc/Framework/Ugc"}) public class UgcController extends EntityController { @@ -60,6 +64,15 @@ protected ViewModel enrichModel(ViewModel model, HttpServletRequest request) thr return model; } + /** + * Handles a request for an entity. + * + * @param request The request. + * @param entityId The entity id. + * @return The name of the entity view that should be rendered for this request. + * @throws ContentProviderException If an error occurs so that the entity cannot not be retrieved. + * @throws java.lang.Exception if any. + */ @RequestMapping({"Entity/{entityId}"}) public String handleGetEntity(HttpServletRequest request, @PathVariable String entityId) throws Exception { return this.handleEntityRequest(request, entityId); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index ffb03de78..956dc1446 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -12,6 +12,9 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +/** + *

Ugc API controller that handles requests to /api/ugc/postcomment.

+ */ @Controller @RequestMapping(value = {"/api/ugc", "/{path}/api/ugc"}) @Slf4j @@ -29,6 +32,15 @@ public UgcPostFormController(UgcPostCommentFormValidator ugcPostCommentFormValid this.ugcPostCommentFormValidator = ugcPostCommentFormValidator; } + /** + *

handles post comment request

+ *

listens to /api/ugc/postcomment.

+ * + * @param form Posted Comment form + * @param bindingResult represents binding results + * @param redirectAttributes Redirect attributes + * @return redirect url + */ @RequestMapping(value = "/postcomment", method = RequestMethod.POST) public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) { ugcPostCommentFormValidator.validate(form, bindingResult); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java index 59fc41439..72a902d19 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java @@ -8,6 +8,10 @@ import java.util.List; import java.util.Map; +/** + *

Ugc comment

+ */ + @Data public class Comment { private long id; diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java index bdc1d07fd..1b0eb7f09 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PostedComment.java @@ -2,6 +2,10 @@ import lombok.Data; +/** + *

Ugc posted comment

+ */ + @Data public class PostedComment { private int publicationId; diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java index 84afda52a..c8962cbf6 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/PubIdTitleLang.java @@ -2,6 +2,10 @@ import lombok.Data; +/** + *

Publication Title and Language

+ */ + @Data public class PubIdTitleLang { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java index 1b5f0e5a9..4782462d5 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/User.java @@ -2,6 +2,9 @@ import lombok.Data; +/** + *

Ugc User information

+ */ @Data public class User { private String id; diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 94c7741ff..962551f19 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -23,11 +23,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.servlet.http.HttpServletRequest; import java.text.ParseException; import java.util.ArrayList; import java.util.List; +/** + *

Builds {@linkplain PageModel Page Model} ando{@linkplain EntityModel Entity Model}.

+ * + */ @Slf4j @Component public class UgcModelBuilder implements PageModelBuilder, EntityModelBuilder { @@ -201,74 +204,76 @@ private static T getValue(ContentModelData metadata, String name, Class t } /** - * {@inheritDoc} + *

Extends the pagemodel with a UGC region and entities

* - * @dxa.publicApi + * @param originalPageModel the strongly typed Page Model to build + * @param modelData the DXA R2 Data Model */ @Nullable @Override - public PageModel buildPageModel(@Nullable PageModel pageModel, @NotNull PageModelData modelData) { + public PageModel buildPageModel(@Nullable PageModel originalPageModel, @NotNull PageModelData modelData) { final ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); final ContentModelData ugcMetadata = ugcMetadata(metadata); final Localization localization = webRequestContext.getLocalization(); String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); - String areaName = pageModel.getMvcData().getAreaName(); + String areaName = originalPageModel.getMvcData().getAreaName(); final RegionModel ugcRegion; RegionModel ugcRegionModel; if (StringUtils.isEmpty(regionName)) { areaName = COMMENTS_AREA; regionName = COMMENTS_REGION; - ugcRegionModel = findRegion(pageModel.getRegions(), COMMENTS_REGION); + ugcRegionModel = findRegion(originalPageModel.getRegions(), COMMENTS_REGION); if (ugcRegionModel == null) { - ugcRegionModel = createRegion(pageModel, areaName, regionName); + ugcRegionModel = createRegion(originalPageModel, areaName, regionName); } } else { - ugcRegionModel = findRegion(pageModel.getRegions(), regionName); + ugcRegionModel = findRegion(originalPageModel.getRegions(), regionName); if (ugcRegionModel == null) { log.error("Unable to locate region for comments '{}'.", regionName); } } - // Entity Comments ugcRegion = ugcRegionModel; - pageModel.getRegions().forEach(region -> addCommentsViews(pageModel, region, localization, ugcRegion)); + originalPageModel.getRegions().forEach(region -> addCommentsViews(originalPageModel, region, localization, ugcRegion)); if (ugcRegion != null) { - // Page Comments if (showComments(ugcMetadata)) { - ugcRegion.getEntities().add(createUgcCommentsEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE)); + ugcRegion.getEntities().add(createUgcCommentsEntity(localization, originalPageModel.getId(), TcmUtils.PAGE_ITEM_TYPE)); } if (postComments(ugcMetadata)) { - ugcRegion.getEntities().add(createUgcPostCommentEntity(localization, pageModel.getId(), TcmUtils.PAGE_ITEM_TYPE, + ugcRegion.getEntities().add(createUgcPostCommentEntity(localization, originalPageModel.getId(), TcmUtils.PAGE_ITEM_TYPE, ugcPostFormMetadata(ugcMetadata))); } } - return pageModel; + return originalPageModel; } /** - * {@inheritDoc} + *

Extends the Entity Model with Ugc extension data. Never returns null.

* - * @dxa.publicApi + * @param originalEntityModel the strongly typed Entity Model to build. Is null for the first Entity Model Builder in the ModelBuilderPipelineImpl + * @param modelData the DXA R2 Data Model + * @param expectedClass required class of entity model, gets the priority if modelData contains MVC data + * @return the strongly typed Entity Model + * @throws DxaException when a DXA exception occurs */ @Override - public T buildEntityModel(@Nullable T entityModel, EntityModelData entityModelData, @Nullable Class expectedClass) throws DxaException { + public T buildEntityModel(@Nullable T originalEntityModel, EntityModelData modelData, @Nullable Class expectedClass) throws DxaException { - final ContentModelData ugcMetadata = ugcMetadata(entityModelData.getComponentTemplate().getMetadata()); + final ContentModelData ugcMetadata = ugcMetadata(modelData.getComponentTemplate().getMetadata()); if (ugcMetadata != null) { - entityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); - entityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); - entityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + originalEntityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); + originalEntityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); + originalEntityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); } - return entityModel; + return originalEntityModel; } /** * {@inheritDoc} * - * @dxa.publicApi */ @Override public int getOrder() { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java index 92cfc6720..e4c71a2a3 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java @@ -2,8 +2,13 @@ import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; +/** + *

Dummy implementation, to be replaced by an actual one in the ugc-client-api

+ */ public class MockUgcVoteCommentApi implements UgcVoteCommentApi { /** + *

Upvotes a comment, using the comment Id

+ * * @param id Comment Id */ @Override @@ -11,6 +16,8 @@ public void voteCommentUp(long id) { } /** + *

Downvotes a comment, using the comment Id

+ * * @param id Comment Id */ @Override diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java index 1f302bfd4..566553500 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComment.java @@ -7,6 +7,9 @@ import java.util.List; +/** + *

EntityModel for a single Ugc comment

+ */ @Data @EqualsAndHashCode(callSuper = true) public class UgcComment extends AbstractEntityModel { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java index 695a50b93..9d7a1a2c5 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcComments.java @@ -8,6 +8,9 @@ import java.util.List; +/** + *

EntityModel containing all comments related to a given page or component

+ */ @Data @EqualsAndHashCode(callSuper = true) public class UgcComments extends AbstractEntityModel { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java index 3585c69d7..2458b4244 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcPostCommentForm.java @@ -13,7 +13,7 @@ import java.util.Map; /** - * + *

EntityModel for Posted Comment model

*/ @Data @EqualsAndHashCode(callSuper = true) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java index af82a3e73..8aa0402e9 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** - * + *

RegionModel for the Ugc Comment region

*/ @EqualsAndHashCode(callSuper = true) @Data @@ -23,7 +23,7 @@ public UgcRegion(RegionModel other) { /** * @param name Region name - * @throws DxaException + * @throws DxaException if name is empty or null */ public UgcRegion(String name) throws DxaException { super(name); @@ -32,15 +32,15 @@ public UgcRegion(String name) throws DxaException { /** * @param name region name * @param qualifiedViewName view name - * @throws DxaException + * @throws DxaException if name is empty or null */ public UgcRegion(String name, String qualifiedViewName) throws DxaException { super(name, qualifiedViewName); } /** - * @param mvcData - * @throws DxaException + * @param mvcData {@link MvcData} + * @throws DxaException if name is empty or null */ public UgcRegion(MvcData mvcData) throws DxaException { super(mvcData); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java index 7dadfbcf1..99eaf2f3c 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java @@ -6,14 +6,28 @@ import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; +/** + *

Validator, validating Ugc comment Posts

+ */ @Component public class UgcPostCommentFormValidator implements Validator { + /** + * + * @param clazz supported form model class + * @return True/False + */ @Override public boolean supports(Class clazz) { return UgcPostCommentForm.class.isAssignableFrom(clazz); } + /** + *

Validates posted form

+ * + * @param target form to validate + * @param errors errors found during validation + */ @Override public void validate(Object target, Errors errors) { final UgcPostCommentForm form = (UgcPostCommentForm) target; From f8ed533e4320b91f9b26db85ef61a3e8f3ccdb26 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Wed, 9 May 2018 10:47:31 +0200 Subject: [PATCH 44/78] Removed MockUgcVoteCommentApi and all references minor reformatted code --- .../sdl/dxa/modules/ugc/UgcInitializer.java | 8 +--- .../com/sdl/dxa/modules/ugc/UgcService.java | 33 +++----------- .../ugc/controllers/UgcApiController.java | 33 -------------- .../controllers/UgcPostFormController.java | 4 +- .../modules/ugc/mapping/UgcModelBuilder.java | 7 +-- .../ugc/mock/MockUgcVoteCommentApi.java | 26 ----------- .../modules/ugc/model/entity/UgcRegion.java | 5 +-- .../UgcPostCommentFormValidator.java | 1 - .../WEB-INF/Views/Ugc/Entity/UgcComments.jsp | 45 +++++++++---------- .../Views/Ugc/Entity/UgcPostCommentForm.jsp | 8 ++-- .../WEB-INF/Views/Ugc/Page/GeneralPage.jsp | 12 ++--- .../ugc/model/entity/UgcCommentsTest.java | 2 +- 12 files changed, 45 insertions(+), 139 deletions(-) delete mode 100644 webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java index 8817db027..7260ee996 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcInitializer.java @@ -1,9 +1,7 @@ package com.sdl.dxa.modules.ugc; import com.sdl.delivery.ugc.client.comment.UgcCommentApi; -import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; import com.sdl.delivery.ugc.client.comment.impl.DefaultUgcCommentApi; -import com.sdl.dxa.modules.ugc.mock.MockUgcVoteCommentApi; import com.sdl.dxa.modules.ugc.model.entity.UgcComments; import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; import com.sdl.dxa.modules.ugc.model.entity.UgcRegion; @@ -33,11 +31,7 @@ public UgcCommentApi ugcCommentApi() { return new DefaultUgcCommentApi(); } - //Todo: create or use real UgcVoteCommentApi implementation - @Bean - public UgcVoteCommentApi ugcVoteCommentApi() { - return new MockUgcVoteCommentApi(); - } + //Todo: use UgcVoteCommentApi implementation when it becomes available @Component @RegisteredViewModels({ diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 8a0fc5d0c..1212255d0 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -1,7 +1,6 @@ package com.sdl.dxa.modules.ugc; import com.sdl.delivery.ugc.client.comment.UgcCommentApi; -import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; import com.sdl.delivery.ugc.client.comment.impl.SimpleCommentsFilter; import com.sdl.dxa.modules.ugc.data.Comment; import com.sdl.dxa.modules.ugc.data.User; @@ -34,8 +33,7 @@ public class UgcService { @Autowired private UgcCommentApi ugcCommentApi; - @Autowired - private UgcVoteCommentApi ugcVoteCommentApi; + //Todo: use UgcVoteCommentApi implementation when it becomes available @Autowired public UgcService() { @@ -69,11 +67,11 @@ public List getComments(int publicationId, int pageId, boolean descendi * * @param publicationId Publication Id * @param pageId Page Id - * @param username User name - * @param email Email address - * @param content Post content - * @param parentId parent - * @param metadata Meta data + * @param username User name + * @param email Email address + * @param content Post content + * @param parentId parent + * @param metadata Meta data * @return {@link Comment} */ public Comment postComment(int publicationId, int pageId, String username, String email, String content, @@ -92,25 +90,6 @@ public Comment postComment(int publicationId, int pageId, String username, Strin ugcCommentApi.postComment(TcmUtils.buildPageTcmUri(publicationId, pageId), username, email, content, parentId, metadata)); } - /** - * Upvote a {@link Comment} with a specific ID on a given page - * - * @param commentId comment id - */ - public void upVoteComment(long commentId) { - ugcVoteCommentApi.voteCommentUp(commentId); - } - - /** - * Downvote a {@link Comment} with a specific ID on a given page - * - * @param commentId comment id - */ - public void downVoteComment(long commentId) { - ugcVoteCommentApi.voteCommentDown(commentId); - } - - private List convert(List comments) { final List convertedComments = new ArrayList<>(); comments.forEach(comment -> convertedComments.add(convert(comment))); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java index 7c2b4cc13..7860075a9 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcApiController.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -100,38 +99,6 @@ public Comment postComment(@RequestBody PostedComment input) { metadata); } - /** - *

handles upvote request

- *

listens to basepath/upvote

- * - * @param commentId Comment Id to upvote - * @param request {@link HttpServletRequest}, used to get the referer url - * @return redirect url - */ - @RequestMapping("/upvote") - public String upVoteComment(@RequestParam(value = "commentId", - required = false, - defaultValue = "0") Integer commentId, HttpServletRequest request) { - ugcService.upVoteComment(commentId); - return String.format("redirect:%s", request.getHeader("referer")); - } - - /** - *

handles downvote request

- *

listens to basepath/downvote

- * - * @param commentId Comment Id to downvote - * @param request {@link HttpServletRequest}, used to get the referer url - * @return redirect url - */ - @RequestMapping("/downvote") - public String downVoteComment(@RequestParam(value = "commentId", - required = false, - defaultValue = "0") Integer commentId, HttpServletRequest request) { - ugcService.downVoteComment(commentId); - return String.format("redirect:%s", request.getHeader("referer")); - } - private void addPubIdTitleLangToCommentMetadata(@RequestBody PostedComment input, Map metadata) { PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); pubIdTitleLang.setId(input.getPublicationId()); diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index 956dc1446..9d979837f 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -36,8 +36,8 @@ public UgcPostFormController(UgcPostCommentFormValidator ugcPostCommentFormValid *

handles post comment request

*

listens to /api/ugc/postcomment.

* - * @param form Posted Comment form - * @param bindingResult represents binding results + * @param form Posted Comment form + * @param bindingResult represents binding results * @param redirectAttributes Redirect attributes * @return redirect url */ diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 962551f19..f393a412e 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -29,7 +29,6 @@ /** *

Builds {@linkplain PageModel Page Model} ando{@linkplain EntityModel Entity Model}.

- * */ @Slf4j @Component @@ -207,7 +206,7 @@ private static T getValue(ContentModelData metadata, String name, Class t *

Extends the pagemodel with a UGC region and entities

* * @param originalPageModel the strongly typed Page Model to build - * @param modelData the DXA R2 Data Model + * @param modelData the DXA R2 Data Model */ @Nullable @Override @@ -257,10 +256,9 @@ public PageModel buildPageModel(@Nullable PageModel originalPageModel, @NotNull * @param modelData the DXA R2 Data Model * @param expectedClass required class of entity model, gets the priority if modelData contains MVC data * @return the strongly typed Entity Model - * @throws DxaException when a DXA exception occurs */ @Override - public T buildEntityModel(@Nullable T originalEntityModel, EntityModelData modelData, @Nullable Class expectedClass) throws DxaException { + public T buildEntityModel(@Nullable T originalEntityModel, EntityModelData modelData, @Nullable Class expectedClass) { final ContentModelData ugcMetadata = ugcMetadata(modelData.getComponentTemplate().getMetadata()); if (ugcMetadata != null) { @@ -273,7 +271,6 @@ public T buildEntityModel(@Nullable T originalEntityMode /** * {@inheritDoc} - * */ @Override public int getOrder() { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java deleted file mode 100644 index e4c71a2a3..000000000 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mock/MockUgcVoteCommentApi.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sdl.dxa.modules.ugc.mock; - -import com.sdl.delivery.ugc.client.comment.UgcVoteCommentApi; - -/** - *

Dummy implementation, to be replaced by an actual one in the ugc-client-api

- */ -public class MockUgcVoteCommentApi implements UgcVoteCommentApi { - /** - *

Upvotes a comment, using the comment Id

- * - * @param id Comment Id - */ - @Override - public void voteCommentUp(long id) { - } - - /** - *

Downvotes a comment, using the comment Id

- * - * @param id Comment Id - */ - @Override - public void voteCommentDown(long id) { - } -} diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java index 8aa0402e9..d78f7d598 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/entity/UgcRegion.java @@ -1,6 +1,5 @@ package com.sdl.dxa.modules.ugc.model.entity; -import com.sdl.dxa.caching.NeverCached; import com.sdl.webapp.common.api.model.MvcData; import com.sdl.webapp.common.api.model.RegionModel; import com.sdl.webapp.common.api.model.region.RegionModelImpl; @@ -13,7 +12,7 @@ */ @EqualsAndHashCode(callSuper = true) @Data -public class UgcRegion extends RegionModelImpl { +public class UgcRegion extends RegionModelImpl { /** * @param other other Region */ @@ -30,7 +29,7 @@ public UgcRegion(String name) throws DxaException { } /** - * @param name region name + * @param name region name * @param qualifiedViewName view name * @throws DxaException if name is empty or null */ diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java index 99eaf2f3c..bbd8a3f70 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidator.java @@ -13,7 +13,6 @@ public class UgcPostCommentFormValidator implements Validator { /** - * * @param clazz supported form model class * @return True/False */ diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp index f8286b25d..aaebd4f17 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp @@ -5,31 +5,28 @@

Comments (${entity.comments.size()})

-
+
- -
-
- -
-
-
- ${comment.commentData.user.name} - - - -
-
-

${comment.commentData.content}

-
-
- - ${comment.commentData.rating} - - -
-
-
-
+ +
+
+ +
+
+
+ ${comment.commentData.user.name} + - + +
+
+

${comment.commentData.content}

+
+
+
+
+
+
diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp index aa6fada03..7aaf86b7c 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcPostCommentForm.jsp @@ -8,7 +8,7 @@
- + <%--@elvariable id="errors" type="java.util.ArrayList"--%>
@@ -22,13 +22,13 @@
- +
- +
- +
diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp index 86eaa2c7e..b79ad48fa 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Page/GeneralPage.jsp @@ -31,10 +31,10 @@
- +
- - + +
@@ -49,9 +49,9 @@
-
- -
+
+ +
diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java index 204368e6b..48a28779c 100644 --- a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentsTest.java @@ -46,7 +46,7 @@ public void shouldReturnComments() { } @Test - public void setTarget() throws Exception{ + public void setTarget() throws Exception { //given target = new TCMURI(TcmUtils.buildTcmUri(1, 2, TcmUtils.COMPONENT_ITEM_TYPE)); ugcComments.setTarget(target); From 31df94d31ac70dd622976af14aad9bb6cc041712 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 9 May 2018 10:46:56 +0100 Subject: [PATCH 45/78] TSI-3070 : Initial commit --- .../TridionDocsSearchController.cs | 40 +++++++++++++++++++ webapp-net/Search/Data/SearchParameters.cs | 20 ++++++++++ webapp-net/Search/Data/SearchResult.cs | 31 ++++++++++++++ webapp-net/Search/Data/SearchResultSet.cs | 16 ++++++++ .../Search/Providers/IQSearchProvider.cs | 14 +++++++ .../Search/Sdl.Web.Modules.Search.csproj | 12 ++++-- 6 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 webapp-net/Search/Controllers/TridionDocsSearchController.cs create mode 100644 webapp-net/Search/Data/SearchParameters.cs create mode 100644 webapp-net/Search/Data/SearchResult.cs create mode 100644 webapp-net/Search/Data/SearchResultSet.cs create mode 100644 webapp-net/Search/Providers/IQSearchProvider.cs diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs new file mode 100644 index 000000000..768ef6c1d --- /dev/null +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.IO; +using System.Web.Mvc; +using Newtonsoft.Json; +using Sdl.Web.Delivery.IQQuery.API; +using Sdl.Web.Delivery.IQQuery.Client; +using Sdl.Web.Delivery.IQQuery.Model.Field; +using Sdl.Web.Modules.Search.Data; +using Sdl.Web.Mvc.Controllers; + +namespace Sdl.Web.Modules.Search.Controllers +{ + public class TridionDocsSearchController : BaseController + { + [Route("~/api/search")] + [HttpPost] + public virtual ActionResult Search() + { + Stream req = Request.InputStream; + req.Seek(0, System.IO.SeekOrigin.Begin); + string json = new StreamReader(req).ReadToEnd(); + + SearchParameters searchParams = JsonConvert.DeserializeObject(json); + + IQSearchClient search = new IQSearchClient(); + + var results = + search.Search( + new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd( + new List { "dynamic.FISHDITADLVRREMOTESTATUS.lng.element", "content.english" }, + new List + { + new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE"), + new DefaultTermValue(searchParams.SearchQuery, TermTypes.Wildcard) + }).Compile()); + + return Json(results); + } + } +} diff --git a/webapp-net/Search/Data/SearchParameters.cs b/webapp-net/Search/Data/SearchParameters.cs new file mode 100644 index 000000000..816b466a7 --- /dev/null +++ b/webapp-net/Search/Data/SearchParameters.cs @@ -0,0 +1,20 @@ +namespace Sdl.Web.Modules.Search.Data +{ + public class SearchParameters + { + private static readonly string DefaultLanguage = "en"; + private static readonly int DefaultStartIndex = 0; + private static readonly int DefaultResultCount = 10; + private static readonly string DefaultSearchQuery = ""; + + public int? PublicationId { get; set; } + + public string Language { get; set; } = DefaultLanguage; + + public string SearchQuery { get; set; } = DefaultSearchQuery; + + public int? StartIndex { get; set; } = DefaultStartIndex; + + public int? Count { get; set; } = DefaultResultCount; + } +} diff --git a/webapp-net/Search/Data/SearchResult.cs b/webapp-net/Search/Data/SearchResult.cs new file mode 100644 index 000000000..72ee21bf3 --- /dev/null +++ b/webapp-net/Search/Data/SearchResult.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Sdl.Web.Delivery.IQQuery.API; + +namespace Sdl.Web.Modules.Search.Data +{ + public class SearchResult : IQueryResult + { + public string Id { get; set; } + + public Dictionary Fields { get; set; } + + public string Locale { get; set; } = "en"; + + public Dictionary> Highlighted { get; set; } + + public string Content { get; set; } + + public string CreatedDate { get; set; } + + public string ModifiedDate { get; set; } + + public int PublicationId { get; set; } + + public string PublicationTitle { get; set; } + + public string ProductFamilyName { get; set; } + + public string ProductReleaseName { get; set; } + } + +} diff --git a/webapp-net/Search/Data/SearchResultSet.cs b/webapp-net/Search/Data/SearchResultSet.cs new file mode 100644 index 000000000..c424ecf9e --- /dev/null +++ b/webapp-net/Search/Data/SearchResultSet.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Sdl.Web.Delivery.IQQuery.API; + +namespace Sdl.Web.Modules.Search.Data +{ + public class SearchResultSet : IQueryResultData + { + public int Hits { get; set; } + + public int Count { get; set; } + + public int StartIndex { get; set; } + + public IList QueryResults { get; set; } + } +} diff --git a/webapp-net/Search/Providers/IQSearchProvider.cs b/webapp-net/Search/Providers/IQSearchProvider.cs new file mode 100644 index 000000000..5fd1d3851 --- /dev/null +++ b/webapp-net/Search/Providers/IQSearchProvider.cs @@ -0,0 +1,14 @@ +using System; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Modules.Search.Models; + +namespace Sdl.Web.Modules.Search.Providers +{ + public class IQSearchProvider : ISearchProvider + { + public void ExecuteQuery(SearchQuery searchQuery, Type resultType, ILocalization localization) + { + throw new NotImplementedException(); + } + } +} diff --git a/webapp-net/Search/Sdl.Web.Modules.Search.csproj b/webapp-net/Search/Sdl.Web.Modules.Search.csproj index fc0d8c1f6..0e337d6aa 100644 --- a/webapp-net/Search/Sdl.Web.Modules.Search.csproj +++ b/webapp-net/Search/Sdl.Web.Modules.Search.csproj @@ -1,9 +1,7 @@  - - - + Debug AnyCPU @@ -44,6 +42,9 @@ ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Common.dll False + + ..\packages\Sdl.Web.Delivery.11.0.0-beta-201804191206\lib\net452\Sdl.Web.Delivery.IQQuery.dll + ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll False @@ -61,8 +62,13 @@ + + + + + From 41dc3f3445ceef5e04fef4957f36f2d167b3ef9d Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 9 May 2018 11:12:20 +0100 Subject: [PATCH 46/78] TSI-3202 : TOC is now sorted correctly on topic. --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- webapp-net/ExperienceOptimization/packages.config | 2 +- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- .../Search/SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- .../Navigation/TridionDocsNavigationProvider.cs | 11 +++++++++++ webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/packages.config | 2 +- 16 files changed, 26 insertions(+), 15 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index aa2ad3ec3..b20ea81ae 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 7b8d0c446..1671243b3 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 8b18c162e..921e407d1 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 1d2d02bd9..5c79b5c79 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 5942ba98e..90541fbc6 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 494701483..08ddd765f 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,7 +10,7 @@ 2.1.0-beta-201804241437 - 2.1.0-beta-201804251327 + 2.1.0-beta-201805091146 11.0.0-beta-201804191206 9.0.0-beta-201804031026 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 5a10a67bf..0197c5e64 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index 55868620a..915ffc4ac 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index 55868620a..915ffc4ac 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index 55868620a..915ffc4ac 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 63421bb4c..908232c78 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index 029379a6e..bfa0f197a 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index 55868620a..915ffc4ac 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs index 930139919..44ea603b0 100644 --- a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs +++ b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs @@ -9,11 +9,17 @@ using Sdl.Web.Tridion.ContentManager; using Tridion.ContentDelivery.Meta; using Tridion.ContentDelivery.Taxonomies; +using System.Text.RegularExpressions; namespace Sdl.Web.Modules.TridionDocs.Navigation { + /// + /// Tridion Docs Navigation Provider + /// public class TridionDocsNavigationProvider : Tridion.Navigation.CILImpl.DynamicNavigationProvider { + private static readonly Regex RegEx = new Regex("^(?:\\w)(\\d+)(?:-\\w)(\\d+)", RegexOptions.Compiled); + public string GetBaseUrl() { var request = HttpContext.Current.Request; @@ -27,6 +33,11 @@ public string GetBaseUrl() return baseUrl; } + protected override List SortTaxonomyNodes(IList taxonomyNodes) + // Sort by topic id since the base impl sorts alphabetically using the title + => taxonomyNodes.OrderBy(x => int.Parse(RegEx.Match(x.Id).Groups[1].Value)). + ThenBy(x => int.Parse(RegEx.Match(x.Id).Groups[2].Value)).ToList(); + protected override TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLevels, NavigationFilter filter, ILocalization localization) { TaxonomyNode node = base.CreateTaxonomyNode(keyword, expandLevels, filter, localization); diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index 45c66e6f8..56e308845 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 3f8298bc9..8e603f728 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From f9ab855fd7d108be0b038ffe4c1e3edb85a5238e Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 9 May 2018 13:15:59 +0100 Subject: [PATCH 47/78] TSI-3203 : Added exception page --- .../Views/TridionDocsPage/ErrorPage.cshtml | 29 +++++++++++++++++++ .../Controllers/TridionDocsPageController.cs | 18 ++++++++++-- .../TridionDocsModuleAreaRegistration.cs | 1 + 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/ErrorPage.cshtml diff --git a/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/ErrorPage.cshtml b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/ErrorPage.cshtml new file mode 100644 index 000000000..8274961ab --- /dev/null +++ b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsPage/ErrorPage.cshtml @@ -0,0 +1,29 @@ + + + + + + SDL Documentation Error + + + + + + + + + + +
+ + + + + + + + + diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs index c551659ca..0ede7070b 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs @@ -44,11 +44,12 @@ protected ActionResult GetPage(int publicationId) protected ActionResult GetPage(int publicationId, int pageId) { - ILocalization localization = SetupLocalization(publicationId); using (new Tracer(publicationId, pageId)) { try - { + { + ILocalization localization = SetupLocalization(publicationId); + PageModel pageModel; try { @@ -74,6 +75,17 @@ protected ActionResult GetPage(int publicationId, int pageId) return ServerError(); } } - } + } + + public ActionResult ServerError() + { + using (new Tracer()) + { + Response.StatusCode = 404; + ViewResult r = View("ErrorPage"); + r.ViewData.Add("statusCode", Response.StatusCode); + return r; + } + } } } diff --git a/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs b/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs index d98476e13..7afa386fc 100644 --- a/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs +++ b/webapp-net/TridionDocs/TridionDocsModuleAreaRegistration.cs @@ -18,6 +18,7 @@ protected override void RegisterAllViewModels() // Page Views RegisterViewModel("GeneralPage", typeof(PageModel)); + RegisterViewModel("ErrorPage", typeof(PageModel)); } } } From be8d77fabb84d3d8bbb85318c7f312bdf4f91fee Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Wed, 9 May 2018 16:31:52 +0200 Subject: [PATCH 48/78] Added Controller test classes --- .../ugc/controllers/UgControllerTest.java | 60 +++++++++++ .../ugc/controllers/UgcApiControllerTest.java | 101 ++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgcApiControllerTest.java diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java new file mode 100644 index 000000000..bc7e475a7 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java @@ -0,0 +1,60 @@ +package com.sdl.dxa.modules.ugc.controllers; + +import com.sdl.dxa.modules.ugc.UgcService; +import com.sdl.dxa.modules.ugc.model.entity.UgcComment; +import com.sdl.dxa.modules.ugc.model.entity.UgcComments; +import com.sdl.webapp.common.api.model.ViewModel; +import com.tridion.util.TCMURI; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class UgControllerTest { + + @Mock + private UgcService ugcService; + + @Mock + private List ugcComments; + @InjectMocks + @Spy + private UgcController controller; + + @Test + public void shouldIgnoreModelIfItIsNotUgcComments() throws Exception { + //given + ViewModel model = mock(ViewModel.class); + + //when + controller.enrichModel(model, null); + + //then + verifyZeroInteractions(model); + } + + @Test + public void shouldProcessModelIfItIsUgcComments() throws Exception { + //given + UgcComments model = mock(UgcComments.class); + ugcComments = new ArrayList<>(); + when(model.getTarget()).thenReturn(new TCMURI("tcm:1-2-16")); + when(model.getComments()).thenReturn(ugcComments); + when(ugcService.getComments(any(int.class), any(int.class), any(boolean.class), any(Integer[].class), any(int.class), any(int.class))).thenReturn(new ArrayList<>()); + + //when + ViewModel result = controller.enrichModel(model, null); + + //then + assertEquals(model.getClass(),result.getClass()); + } +} \ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgcApiControllerTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgcApiControllerTest.java new file mode 100644 index 000000000..a446abed8 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgcApiControllerTest.java @@ -0,0 +1,101 @@ +package com.sdl.dxa.modules.ugc.controllers; + +import com.sdl.dxa.modules.ugc.UgcService; +import com.sdl.dxa.modules.ugc.data.Comment; +import com.sdl.dxa.modules.ugc.data.PostedComment; +import com.sdl.dxa.modules.ugc.data.User; +import com.sdl.webapp.common.api.WebRequestContext; +import com.sdl.webapp.common.api.localization.Localization; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyMapOf; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +@ActiveProfiles("test") +public class UgcApiControllerTest { + + private static final int PAGE_ID = 12451; + private static final int PUBLICATION_ID = 4574; + private static final String COMMENT_TEXT = "comment"; + private static final String USER_EMAIL = "email"; + private static final String USER_NAME = "name"; + + @Mock + private WebRequestContext webRequestContext; + + @Mock + private Localization localization; + + @Mock + private List comments; + + @Mock + private Comment comment; + + @Mock + private UgcService ugcService; + + @InjectMocks + @Spy + private UgcApiController ugcApiController; + + @Before + public void init() { + comments = new ArrayList<>(); + when(webRequestContext.getLocalization()).thenReturn(localization); + when(localization.getPath()).thenReturn("path"); + when(ugcService.getComments(any(int.class), any(int.class), any(boolean.class), any(Integer[].class), any(int.class), any(int.class))).thenReturn(comments); + when(ugcService.postComment(any(int.class), any(int.class), any(String.class), any(String.class), + any(String.class), any(int.class), anyMapOf(String.class,String.class))).thenReturn(comment); + } + + /** + * + */ + @Test + public void shouldReturnComments() { + //given + //when + List retrievedComments = ugcApiController.getComments(PUBLICATION_ID, PAGE_ID, false, null, 0, 0); + + //then + assertEquals(comments, retrievedComments); + } + + @Test + public void testPostComment() { + //given + PostedComment postedComment = mock(PostedComment.class); + User user= mock(User.class); + + when(postedComment.getUsername()).thenReturn(USER_NAME); + when(postedComment.getEmail()).thenReturn(USER_EMAIL); + when(postedComment.getContent()).thenReturn(COMMENT_TEXT); + when(comment.getUser()).thenReturn(user); + when(user.getName()).thenReturn(USER_NAME); + when(user.getEmailAddress()).thenReturn(USER_EMAIL); + when(comment.getContent()).thenReturn(COMMENT_TEXT); + + + //when + Comment result = ugcApiController.postComment(postedComment); + //then + assertEquals(USER_NAME, result.getUser().getName()); + assertEquals(USER_EMAIL, result.getUser().getEmailAddress()); + + } +} \ No newline at end of file From 87a527e5016098f93f1ddbbd6d5eea95ae6858e6 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 10 May 2018 08:52:37 +0100 Subject: [PATCH 49/78] TSI-3203 : Added missing file to project --- webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj index 73f2e2589..8c8c64b30 100644 --- a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj +++ b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj @@ -109,6 +109,7 @@
+ From 5bdee7c014e1488c70eb1c3b270ba84a2bc51b9c Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 10 May 2018 15:23:53 +0100 Subject: [PATCH 50/78] TSI-3206 : Fixed issue with ugc service not deserializing metadata due to escaping --- .../Ugc/Controllers/UgcApiController.cs | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index f06dbb066..a47d1d4b6 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -2,6 +2,7 @@ using Sdl.Web.Mvc.Controllers; using System.IO; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web.Mvc; using Newtonsoft.Json; @@ -21,8 +22,7 @@ public class UgcApiController : BaseController [HttpGet] public ActionResult GetComments(int? publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) { - UgcService ugc = new UgcService(); - + UgcService ugc = new UgcService(); var comments = ugc.GetComments( publicationId ?? int.Parse(WebRequestContext.Localization.Id), pageId, descending, status ?? new int[] {}, top, skip); @@ -41,24 +41,20 @@ public ActionResult GetComments(int? publicationId, int pageId, bool descending public ActionResult PostComment(int publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) { UgcService ugc = new UgcService(); - Stream req = Request.InputStream; req.Seek(0, SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); - PostedComment posted = JsonConvert.DeserializeObject(json); - - Dictionary metadata = new Dictionary(); - - metadata.Add("publicationTitle", posted.PublicationTitle); - metadata.Add("publicationUrl", posted.PublicationUrl); - metadata.Add("itemTitle", posted.PageTitle); - metadata.Add("itemUrl", posted.PageUrl); - metadata.Add("language", posted.Language); - metadata.Add("status", "0"); - - AddPubIdTitleLangToCommentMetadata(posted, metadata); - + Dictionary metadata = new Dictionary + { + {"publicationTitle", "\""+Regex.Escape(posted.PublicationTitle)+"\""}, + {"publicationUrl", "\""+posted.PublicationUrl+"\""}, + {"itemTitle", "\""+Regex.Escape(posted.PageTitle)+"\""}, + {"itemUrl", "\""+posted.PageUrl+"\""}, + {"language", "\""+posted.Language+"\""}, + {"status", "0"} + }; + AddPubIdTitleLangToCommentMetadata(posted, metadata); Comment result = ugc.PostComment(posted.PublicationId, posted.PageId, posted.Username, @@ -66,7 +62,6 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = posted.Content, posted.ParentId, metadata); - return new ContentResult { ContentType = "application/json", @@ -102,14 +97,15 @@ public async Task RemoveComment(int commentId) return Redirect(Request.UrlReferrer?.AbsolutePath); } - private void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) + private static void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) { - PubIdTitleLang pubIdTitleLang = new PubIdTitleLang(); - pubIdTitleLang.Id = comment.PublicationId; - pubIdTitleLang.Lang = comment.Language; - pubIdTitleLang.Title = comment.PublicationTitle; - string pubIdTitleLangJson = JsonConvert.SerializeObject(pubIdTitleLang); - metadata.Add("pubIdTitleLang", pubIdTitleLangJson); + PubIdTitleLang pubIdTitleLang = new PubIdTitleLang + { + Id = comment.PublicationId, + Lang = comment.Language, + Title = comment.PublicationTitle + }; + metadata.Add("pubIdTitleLang", JsonConvert.SerializeObject(pubIdTitleLang)); } } } From fabcee667b613327435fe0cba4b89254ecddcdb8 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 11 May 2018 12:11:03 +0100 Subject: [PATCH 51/78] TSI-3207 : Updated to latest framework + stopped expansion of classified pages --- webapp-net/51Degrees/packages.config | 2 +- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/AzureWebApp/packages.config | 2 +- webapp-net/ContextExpressions/packages.config | 2 +- webapp-net/Core/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- webapp-net/ExperienceOptimization/packages.config | 2 +- webapp-net/GoogleAnalytics/packages.config | 2 +- webapp-net/Impress/packages.config | 2 +- webapp-net/MediaManager/packages.config | 2 +- webapp-net/Search/SI4T.Query.CloudSearch/packages.config | 2 +- webapp-net/Search/packages.config | 2 +- webapp-net/Test/packages.config | 2 +- .../TridionDocs/Navigation/TridionDocsNavigationProvider.cs | 4 ++++ webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/packages.config | 2 +- 16 files changed, 19 insertions(+), 15 deletions(-) diff --git a/webapp-net/51Degrees/packages.config b/webapp-net/51Degrees/packages.config index b20ea81ae..5652a8fd7 100644 --- a/webapp-net/51Degrees/packages.config +++ b/webapp-net/51Degrees/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index 1671243b3..f4962c113 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -6,6 +6,6 @@ - + \ No newline at end of file diff --git a/webapp-net/AzureWebApp/packages.config b/webapp-net/AzureWebApp/packages.config index 921e407d1..0a739b6de 100644 --- a/webapp-net/AzureWebApp/packages.config +++ b/webapp-net/AzureWebApp/packages.config @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/webapp-net/ContextExpressions/packages.config b/webapp-net/ContextExpressions/packages.config index 5c79b5c79..1abcd5f29 100644 --- a/webapp-net/ContextExpressions/packages.config +++ b/webapp-net/ContextExpressions/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Core/packages.config b/webapp-net/Core/packages.config index 90541fbc6..6015e2506 100644 --- a/webapp-net/Core/packages.config +++ b/webapp-net/Core/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index 08ddd765f..bfc9491e8 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -10,7 +10,7 @@ 2.1.0-beta-201804241437 - 2.1.0-beta-201805091146 + 2.1.0-beta-201805111302 11.0.0-beta-201804191206 9.0.0-beta-201804031026 8.5.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 0197c5e64..4ec47f403 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/webapp-net/GoogleAnalytics/packages.config b/webapp-net/GoogleAnalytics/packages.config index 915ffc4ac..8cefb486f 100644 --- a/webapp-net/GoogleAnalytics/packages.config +++ b/webapp-net/GoogleAnalytics/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Impress/packages.config b/webapp-net/Impress/packages.config index 915ffc4ac..8cefb486f 100644 --- a/webapp-net/Impress/packages.config +++ b/webapp-net/Impress/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/MediaManager/packages.config b/webapp-net/MediaManager/packages.config index 915ffc4ac..8cefb486f 100644 --- a/webapp-net/MediaManager/packages.config +++ b/webapp-net/MediaManager/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config index 908232c78..9a8bfc3c8 100644 --- a/webapp-net/Search/SI4T.Query.CloudSearch/packages.config +++ b/webapp-net/Search/SI4T.Query.CloudSearch/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Search/packages.config b/webapp-net/Search/packages.config index bfa0f197a..9d2df9523 100644 --- a/webapp-net/Search/packages.config +++ b/webapp-net/Search/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Test/packages.config b/webapp-net/Test/packages.config index 915ffc4ac..8cefb486f 100644 --- a/webapp-net/Test/packages.config +++ b/webapp-net/Test/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs index 44ea603b0..b6ff9e312 100644 --- a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs +++ b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs @@ -50,6 +50,10 @@ protected override TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLe return node; } + protected override SitemapItem[] ExpandClassifiedPages(Keyword keyword, string taxonomyId, + ILocalization localization) + => new SitemapItem[] {}; + public SitemapItem SiteMap { get diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index 56e308845..c603c03f0 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 8e603f728..4928c1a38 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -5,6 +5,6 @@ - + \ No newline at end of file From 14e524f6fb6385ce79b216f86adda06caf706c5d Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Fri, 11 May 2018 18:08:36 +0200 Subject: [PATCH 52/78] Added Test class for UgcModelBuilder Made static methods non-static in UgcModelBuilder Replaced CommentDate internal class with DateTime and updated JSP to match --- .../com/sdl/dxa/modules/ugc/UgcService.java | 25 +-- .../com/sdl/dxa/modules/ugc/data/Comment.java | 34 +--- .../modules/ugc/mapping/UgcModelBuilder.java | 32 ++-- .../WEB-INF/Views/Ugc/Entity/UgcComments.jsp | 2 +- .../ugc/mapping/UgcModelBuilderTest.java | 158 ++++++++++++++++++ .../ugc/model/entity/UgcCommentTest.java | 12 +- 6 files changed, 189 insertions(+), 74 deletions(-) create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilderTest.java diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java index 1212255d0..efba18abb 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/UgcService.java @@ -16,8 +16,6 @@ import java.net.URI; import java.net.URISyntaxException; -import java.time.DayOfWeek; -import java.time.Month; import java.time.ZonedDateTime; import java.util.*; @@ -126,25 +124,10 @@ private Comment convert(com.sdl.delivery.ugc.client.odata.edm.Comment comment) { return c; } - private Comment.CommentDate convert(ZonedDateTime creationDate) { - final Comment.CommentDate commentDate = new Comment.CommentDate(); - final DateTime dt = new DateTime( - creationDate.toInstant().toEpochMilli(), - DateTimeZone.forTimeZone(TimeZone.getTimeZone(creationDate.getZone()))); - commentDate.setDateTime(dt); - commentDate.setDayOfMonth(dt.getMonthOfYear()); - commentDate.setDayOfWeek(DayOfWeek.of(dt.getDayOfWeek()).name()); - commentDate.setDayOfYear(dt.getDayOfYear()); - commentDate.setMonth(Month.of(dt.getMonthOfYear()).name()); - commentDate.setMonthValue(dt.getMonthOfYear()); - commentDate.setYear(dt.getYear()); - commentDate.setHour(dt.getHourOfDay()); - commentDate.setMinute(dt.getMinuteOfHour()); - commentDate.setSecond(dt.getSecondOfMinute()); - commentDate.setNano(dt.getMillisOfSecond()); - - return commentDate; - + private DateTime convert(ZonedDateTime zonedDateTime) { + return new DateTime( + zonedDateTime.toInstant().toEpochMilli(), + DateTimeZone.forTimeZone(TimeZone.getTimeZone(zonedDateTime.getZone()))); } private User convert(com.sdl.delivery.ugc.client.odata.edm.User user) { diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java index 72a902d19..4a906934f 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/data/Comment.java @@ -25,9 +25,11 @@ public class Comment { private int itemType; - private CommentDate creationDate; +// private CommentDate creationDate; + private DateTime creationDate; - private CommentDate lastModifiedDate; +// private CommentDate lastModifiedDate; + private DateTime lastModifiedDate; private String content; @@ -39,32 +41,6 @@ public class Comment { private int rating = 0; @JsonIgnore - private Map metadata = new HashMap(); - - @Data - public static class CommentDate { - @JsonIgnore - private DateTime dateTime; - - private int dayOfMonth; - - private String dayOfWeek; - - private int dayOfYear; - - private int hour; - - private int minute; - - private String month; - - private int monthValue; - - private int nano; - - private int second; - - private int year; - } + private Map metadata = new HashMap<>(); } diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index f393a412e..5f3374fb2 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -58,7 +58,7 @@ public UgcModelBuilder(WebRequestContext webRequestContext) { this.webRequestContext = webRequestContext; } - private static RegionModel findRegion(RegionModelSet regionModelSet, String regionName) { + private RegionModel findRegion(RegionModelSet regionModelSet, String regionName) { for (RegionModel region : regionModelSet) { if (region.getName().equals(regionName)) { return region; @@ -71,7 +71,7 @@ private static RegionModel findRegion(RegionModelSet regionModelSet, String regi return null; } - private static UgcRegion createRegion(PageModel pageModel, String areaName, String regionName) { + private UgcRegion createRegion(PageModel pageModel, String areaName, String regionName) { UgcRegion ugcRegion = null; if (!pageModel.getRegions().containsClass(UgcRegion.class)) { try { @@ -94,7 +94,7 @@ private static UgcRegion createRegion(PageModel pageModel, String areaName, Stri return ugcRegion; } - private static void addCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { + private void addCommentsViews(PageModel pageModel, RegionModel region, Localization localization, RegionModel ugcRegion) { final List regionEntities = new ArrayList<>(); for (EntityModel entity : region.getEntities()) { if (entity.getExtensionData() == null) { @@ -124,7 +124,7 @@ private static void addCommentsViews(PageModel pageModel, RegionModel region, Lo region.getRegions().forEach(childRegion -> addCommentsViews(pageModel, childRegion, localization, ugcRegion)); } - private static UgcComments createUgcCommentsEntity(Localization localization, String id, int itemType) { + private UgcComments createUgcCommentsEntity(Localization localization, String id, int itemType) { final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(COMMENTS_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) @@ -139,7 +139,7 @@ private static UgcComments createUgcCommentsEntity(Localization localization, St return model; } - private static UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int itemType, ContentModelData postFormConfig) { + private UgcPostCommentForm createUgcPostCommentEntity(Localization localization, String id, int itemType, ContentModelData postFormConfig) { final MvcData mvcData = MvcDataCreator.creator() .fromQualifiedName(POST_FORM_QUALIFIED_NAME) .defaults(DefaultsMvcData.ENTITY) @@ -162,23 +162,23 @@ private static UgcPostCommentForm createUgcPostCommentEntity(Localization locali return model; } - private static ContentModelData ugcMetadata(ContentModelData metadata) { + private ContentModelData ugcMetadata(ContentModelData metadata) { return metadata == null ? null : metadata.getAndCast(COMMENTS_CONFIG, ContentModelData.class); } - private static ContentModelData ugcPostFormMetadata(ContentModelData ugcMetadata) { + private ContentModelData ugcPostFormMetadata(ContentModelData ugcMetadata) { return ugcMetadata == null ? null : ugcMetadata.getAndCast(POST_FORM_CONFIG, ContentModelData.class); } - private static Boolean showComments(ContentModelData ugcMetadata) { + private Boolean showComments(ContentModelData ugcMetadata) { return getValue(ugcMetadata, SHOW_COMMENTS_KEY, Boolean.class); } - private static Boolean postComments(ContentModelData ugcMetadata) { + private Boolean postComments(ContentModelData ugcMetadata) { return getValue(ugcMetadata, ALLOW_POST_KEY, Boolean.class); } - private static T getValue(ContentModelData metadata, String name, Class type) { + private T getValue(ContentModelData metadata, String name, Class type) { if (metadata == null || !metadata.containsKey(name)) { if (type == Boolean.class) { //noinspection unchecked @@ -211,21 +211,22 @@ private static T getValue(ContentModelData metadata, String name, Class t @Nullable @Override public PageModel buildPageModel(@Nullable PageModel originalPageModel, @NotNull PageModelData modelData) { + if (originalPageModel == null) { + log.error("Original page model is null"); + return null; + } + final ContentModelData metadata = modelData.getPageTemplate() == null ? null : modelData.getPageTemplate().getMetadata(); final ContentModelData ugcMetadata = ugcMetadata(metadata); final Localization localization = webRequestContext.getLocalization(); String regionName = getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class); - String areaName = originalPageModel.getMvcData().getAreaName(); final RegionModel ugcRegion; RegionModel ugcRegionModel; if (StringUtils.isEmpty(regionName)) { - areaName = COMMENTS_AREA; - regionName = COMMENTS_REGION; - ugcRegionModel = findRegion(originalPageModel.getRegions(), COMMENTS_REGION); if (ugcRegionModel == null) { - ugcRegionModel = createRegion(originalPageModel, areaName, regionName); + ugcRegionModel = createRegion(originalPageModel, COMMENTS_AREA, COMMENTS_REGION); } } else { ugcRegionModel = findRegion(originalPageModel.getRegions(), regionName); @@ -259,7 +260,6 @@ public PageModel buildPageModel(@Nullable PageModel originalPageModel, @NotNull */ @Override public T buildEntityModel(@Nullable T originalEntityModel, EntityModelData modelData, @Nullable Class expectedClass) { - final ContentModelData ugcMetadata = ugcMetadata(modelData.getComponentTemplate().getMetadata()); if (ugcMetadata != null) { originalEntityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); diff --git a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp index aaebd4f17..aec04868b 100644 --- a/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp +++ b/webapp-java/dxa-module-ugc/src/main/resources/META-INF/resources/WEB-INF/Views/Ugc/Entity/UgcComments.jsp @@ -17,7 +17,7 @@ ${comment.commentData.user.name} - + class="meta small">${markup.formatDateDiff(comment.commentData.lastModifiedDate)}

${comment.commentData.content}

diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilderTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilderTest.java new file mode 100644 index 000000000..3b14f858b --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilderTest.java @@ -0,0 +1,158 @@ +package com.sdl.dxa.modules.ugc.mapping; + +import com.sdl.dxa.api.datamodel.model.*; +import com.sdl.webapp.common.api.WebRequestContext; +import com.sdl.webapp.common.api.localization.Localization; +import com.sdl.webapp.common.api.model.EntityModel; +import com.sdl.webapp.common.api.model.PageModel; +import com.sdl.webapp.common.api.model.RegionModel; +import com.sdl.webapp.common.api.model.RegionModelSet; +import com.sdl.webapp.common.api.model.entity.AbstractEntityModel; +import com.sdl.webapp.common.api.model.region.RegionModelImpl; +import com.sdl.webapp.common.api.model.region.RegionModelSetImpl; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mock; + +@RunWith(MockitoJUnitRunner.class) +public class UgcModelBuilderTest { + + private static final String COMMENTS_CONFIG = "ugcConfig"; + private static final String POST_FORM_CONFIG = "postFormConfig"; + private static final String COMMENTS_REGION_KEY = "commentsRegion"; + private static final String SHOW_COMMENTS_KEY = "showComments"; + private static final String ALLOW_POST_KEY = "allowPost"; + private static final String SHOW_COMMENTS_EXT_DATA = "UgcShowComments"; + private static final String POST_COMMENTS_EXT_DATA = "UgcPostComments"; + private static final String COMMENTS_ENTITY_REGION_EXT_DATA = "CommentsEntityRegion"; + + @Mock + private WebRequestContext webRequestContext; + + @Mock + private Localization localization; + + @InjectMocks + private UgcModelBuilder builder; + + @Test + public void shouldNotChangeEntityBecauseTemplateExtensionDataIsNullOrHasNoUgcMetadata() { + //given + TestEntity testEntity = new TestEntity(); + EntityModelData entityModelData = new EntityModelData(); + ComponentTemplateData componentTemplate = new ComponentTemplateData(); + ContentModelData metadata = new ContentModelData(); + entityModelData.setComponentTemplate(componentTemplate); + + //when + EntityModel entityR2 = builder.buildEntityModel(testEntity, entityModelData, null); + + //then + Assert.assertSame(testEntity, entityR2); + + //when + componentTemplate.setMetadata(metadata); + entityR2 = builder.buildEntityModel(testEntity, entityModelData, null); + Assert.assertNull(entityR2.getExtensionData()); + + //then + Assert.assertSame(testEntity, entityR2); + Assert.assertNull(entityR2.getExtensionData()); + } + + /** + * + */ + @Test + public void shouldChangeEntity() { + //given + TestEntity testEntity = new TestEntity(); + EntityModelData entityModelData = getUgcEntityModelData(); + + //when + EntityModel entityR2 = builder.buildEntityModel(testEntity, entityModelData, null); + + //then + Assert.assertEquals(entityR2.getExtensionData().get(SHOW_COMMENTS_EXT_DATA), true); + Assert.assertEquals(entityR2.getExtensionData().get(COMMENTS_ENTITY_REGION_EXT_DATA), "comment"); + Assert.assertEquals(entityR2.getExtensionData().get(POST_COMMENTS_EXT_DATA), new ContentModelData()); + } + + @Test + public void shouldNotChangePageModel() { + //given + PageModel testPage = mock(PageModel.class); + + PageModelData pageModelData = new PageModelData(); + PageTemplateData pageTemplate = new PageTemplateData(); + ContentModelData metadata = new ContentModelData(); + ContentModelData ugcMetadata = new ContentModelData(); + ugcMetadata.put(COMMENTS_REGION_KEY, "comment"); + metadata.put(COMMENTS_CONFIG, ugcMetadata); + + RegionModel regionmodel = mock(RegionModelImpl.class); + RegionModelSet regionModelSet = new RegionModelSetImpl(); + regionModelSet.add(regionmodel); + + TestEntity testEntity = new TestEntity(); + EntityModel entityR2 = builder.buildEntityModel(testEntity, getUgcEntityModelData(), null); + ((TestEntity) entityR2).setId("2"); + + List regionEntities = new ArrayList<>(); + regionEntities.add(entityR2); + + pageTemplate.setMetadata(metadata); + pageModelData.setPageTemplate(pageTemplate); + + when(webRequestContext.getLocalization()).thenReturn(localization); + when(localization.getPath()).thenReturn("path"); + when(localization.getId()).thenReturn("1"); + when(testPage.getRegions()).thenReturn(regionModelSet); + when(regionmodel.getEntities()).thenReturn(regionEntities); + when(regionmodel.getRegions()).thenReturn(new RegionModelSetImpl()); + when(regionmodel.getName()).thenReturn("comment"); + + + //when + PageModel pageR2 = builder.buildPageModel(testPage, pageModelData); + + //then + Assert.assertSame(testPage, pageR2); + Assert.assertEquals(((RegionModel)testPage.getRegions().get(regionmodel.getClass()).toArray()[0]).getEntities().size(),3); + + + } + + private EntityModelData getUgcEntityModelData() { + EntityModelData entityModelData = new EntityModelData(); + ComponentTemplateData componentTemplate = new ComponentTemplateData(); + ContentModelData metadata = new ContentModelData(); + ContentModelData ugcMetadata = new ContentModelData(); + ContentModelData ugcPostMetadata = new ContentModelData(); + + ugcMetadata.put(SHOW_COMMENTS_KEY, "yes"); + ugcMetadata.put(ALLOW_POST_KEY, "yes"); + ugcMetadata.put(COMMENTS_REGION_KEY, "comment"); + ugcMetadata.put(POST_FORM_CONFIG, ugcPostMetadata); + + metadata.put(COMMENTS_CONFIG, ugcMetadata); + + componentTemplate.setMetadata(metadata); + entityModelData.setComponentTemplate(componentTemplate); + return entityModelData; + } + + private static class TestEntity extends AbstractEntityModel { + + } + +} \ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java index 6221e7b2f..ef2e8352a 100644 --- a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/entity/UgcCommentTest.java @@ -30,20 +30,18 @@ public class UgcCommentTest { private static Comment commentData = new Comment(); private static List comments = new ArrayList<>(); private static UgcComment otherComment = new UgcComment(); - private static Comment.CommentDate commentDate = new Comment.CommentDate(); private static DateTime time = DateTime.now(); private static User user = new User(); static { - commentDate.setDateTime(time); user.setEmailAddress("test@test.test"); user.setName("Tester"); user.setExternalId("ExternalId"); user.setId("Id"); - commentData.setCreationDate(commentDate); - commentData.setLastModifiedDate(commentDate); + commentData.setCreationDate(time); + commentData.setLastModifiedDate(time); commentData.setContent("Comment"); commentData.setId(1); commentData.setItemId(2); @@ -81,7 +79,7 @@ public void shouldReturnUserName() { } @Test - public void shouldReturnComments() throws Exception { + public void shouldReturnComments() { //given //when @@ -91,13 +89,13 @@ public void shouldReturnComments() throws Exception { } @Test - public void shouldReturnCreationDate() throws Exception { + public void shouldReturnCreationDate() { //given //when //then - assertEquals(commentDate, ugcComment.getCommentData().getCreationDate()); + assertEquals(time, ugcComment.getCommentData().getCreationDate()); } From 6112c0ff233e5f7b469f66c53090a40d6f8f46d0 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Fri, 11 May 2018 19:11:17 +0200 Subject: [PATCH 53/78] Added test classes for UgcService and UgcPostCommentFormValidator --- .../sdl/dxa/modules/ugc/UgcServiceTest.java | 58 +++++++++++++++ .../ugc/controllers/UgControllerTest.java | 1 + .../UgcPostCommentFormValidatorTest.java | 71 +++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/UgcServiceTest.java create mode 100644 webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidatorTest.java diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/UgcServiceTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/UgcServiceTest.java new file mode 100644 index 000000000..1ae01ce7c --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/UgcServiceTest.java @@ -0,0 +1,58 @@ +package com.sdl.dxa.modules.ugc; + +import com.sdl.delivery.ugc.client.comment.UgcCommentApi; +import com.sdl.dxa.modules.ugc.data.Comment; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyMapOf; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class UgcServiceTest { + + + @Mock + private UgcCommentApi ugcCommentApi; + + @Mock + private Comment comment; + + @Mock + private UgcService ugcService; + + @Test + public void shouldProcessGetComments() { + //given + List comments = new ArrayList<>(); + comments.add(comment); + when(ugcService.getComments(any(int.class), any(int.class), any(boolean.class), any(Integer[].class), any(int.class), any(int.class))).thenReturn(comments); + + //when + List result = ugcService.getComments(1,1,false,new Integer[]{},0,0); + + //then + Assert.assertEquals(result,comments); + + } + + @Test + public void shouldProcessPostComment(){ + //given + when(ugcService.postComment(any(int.class), any(int.class), any(String.class), any(String.class), any(String.class), any(int.class), anyMapOf(String.class, String.class))).thenReturn(comment); + + //when + Comment result = ugcService.postComment(1,1,"userName","test@test.com","message",0, new HashMap<>()); + + //then + Assert.assertEquals(result,comment); + } +} \ No newline at end of file diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java index bc7e475a7..ff591bf53 100644 --- a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/controllers/UgControllerTest.java @@ -26,6 +26,7 @@ public class UgControllerTest { @Mock private List ugcComments; + @InjectMocks @Spy private UgcController controller; diff --git a/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidatorTest.java b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidatorTest.java new file mode 100644 index 000000000..5e36185c1 --- /dev/null +++ b/webapp-java/dxa-module-ugc/src/test/java/com/sdl/dxa/modules/ugc/model/validator/UgcPostCommentFormValidatorTest.java @@ -0,0 +1,71 @@ +package com.sdl.dxa.modules.ugc.model.validator; + +import com.sdl.dxa.modules.ugc.model.entity.UgcPostCommentForm; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.validation.BeanPropertyBindingResult; +import org.springframework.validation.BindingResult; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class UgcPostCommentFormValidatorTest { + + @Mock + private UgcPostCommentFormValidator ugcPostCommentFormValidator; + + @Test + public void shouldSupportUgcPostCommentFormClass() { + //given + ugcPostCommentFormValidator = new UgcPostCommentFormValidator(); + //when + boolean result = ugcPostCommentFormValidator.supports(UgcPostCommentForm.class); + //then + Assert.assertTrue(result); + } + + @Test + public void shouldNotSupportOtherClass() { + //given + ugcPostCommentFormValidator = new UgcPostCommentFormValidator(); + //when + boolean result = ugcPostCommentFormValidator.supports(Object.class); + //then + Assert.assertFalse(result); + } + + @Test + public void shouldFailOnValidation() { + //given + ugcPostCommentFormValidator = new UgcPostCommentFormValidator(); + UgcPostCommentForm ugcPostCommentForm = mock(UgcPostCommentForm.class); + BindingResult bindingResult = new BeanPropertyBindingResult(ugcPostCommentForm, "Test"); + + //when + ugcPostCommentFormValidator.validate(ugcPostCommentForm, bindingResult); + //then + Assert.assertEquals(bindingResult.getErrorCount(), 3); + } + + @Test + public void shouldSucceedOnValidation() { + //given + ugcPostCommentFormValidator = new UgcPostCommentFormValidator(); + UgcPostCommentForm ugcPostCommentForm = mock(UgcPostCommentForm.class); + BindingResult bindingResult = new BeanPropertyBindingResult(ugcPostCommentForm, "Test"); + when(ugcPostCommentForm.getUserName()).thenReturn("userName"); + when(ugcPostCommentForm.getEmailAddress()).thenReturn("test@test.com"); + when(ugcPostCommentForm.getContent()).thenReturn("message"); + + //when + ugcPostCommentFormValidator.validate(ugcPostCommentForm, bindingResult); + + //then + Assert.assertEquals(bindingResult.getErrorCount(), 0); + } + +} \ No newline at end of file From c19ff8a3405446c2e9187e30b85a3a1eec75b178 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 14 May 2018 11:39:33 +0100 Subject: [PATCH 54/78] TSI-3208 : Added missing meta data to page model that caused issues with navigation --- .../Controllers/TridionDocsApiController.cs | 9 ++-- .../Providers/TridionDocsContentProvider.cs | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index c3569de4e..8210bdc53 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -16,18 +16,17 @@ public class TridionDocsApiController : BaseController private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); [Route("~/api/page/{publicationId:int}/{pageId:int}")] - [Route("~/api/page/{publicationId:int}/{pageId:int}/{*path}")] + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] [HttpGet] - [FormatData] - public virtual ActionResult Page(int publicationId, int pageId, string path, string conditions = "") + public virtual ActionResult Page(int publicationId, int pageId, string conditions = "") { if (!string.IsNullOrEmpty(conditions)) { AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } return Json(TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId))); - } - + } + [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] [Route("~/api/binary/{publicationId:int}/{binaryId:int}/{*content}")] [HttpGet] diff --git a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs index 2e0516182..8b8fd750c 100644 --- a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs +++ b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs @@ -1,10 +1,14 @@ using System; +using System.Collections; using Sdl.Web.Common; +using Sdl.Web.Common.Interfaces; +using Sdl.Web.Common.Models; using Sdl.Web.Modules.TridionDocs.Exceptions; using Sdl.Web.Tridion.Mapping; using Tridion.ContentDelivery.DynamicContent.Query; using Tridion.ContentDelivery.Meta; using Sdl.Web.Tridion.ContentManager; +using Query = Tridion.ContentDelivery.DynamicContent.Query.Query; namespace Sdl.Web.Modules.TridionDocs.Providers { @@ -15,6 +19,8 @@ public class TridionDocsContentProvider : DefaultContentProvider { private static readonly string RefFieldName = "ishlogicalref.object.id"; private static readonly string DefaultPublishData = "1900-01-01 00:00:00.000"; + private static readonly string TocNaventriesMeta = "tocnaventries.generated.value"; + private static readonly string PageConditionsUsedMeta = "conditionsused.generated.value"; public class ItemImpl : IItem { @@ -39,6 +45,47 @@ public Category[] GetCategories() public int OwningPublicationId { get; } } + public override PageModel GetPageModel(int pageId, ILocalization localization, bool addIncludes = true) + { + PageModel pageModel = base.GetPageModel(pageId, localization, addIncludes); + if (pageModel != null) + { + // Enhance the page model with custom metadata + PageMetaFactory pageMetaFactory = new PageMetaFactory(int.Parse(localization.Id)); + string cmId = $"ish:{localization.Id}-{pageId}-16"; + var pageMeta = pageMetaFactory.GetMeta(cmId); + if (pageMeta != null) + { + var customMeta = pageMeta.CustomMeta; + + // Put the information about the toc entries on the metadata + // This is required by the UI so it knows the location of the page in the Toc + if (customMeta.GetFirstValue(TocNaventriesMeta) != null) + { + NameValuePair pair = (NameValuePair)customMeta.NameValues[TocNaventriesMeta]; + var values = (ArrayList) pair.MultipleValues; + if (values != null) + { + pageModel.Meta.Add(TocNaventriesMeta, string.Join(", ", values.ToArray())); + } + } + + // Put the information about used conditions form page metadata + if (customMeta.GetFirstValue(PageConditionsUsedMeta) != null) + { + pageModel.Meta.Add(PageConditionsUsedMeta, (string)customMeta.GetFirstValue(PageConditionsUsedMeta)); + } + + // Add logical Ref ID information + if (customMeta.GetFirstValue(RefFieldName) != null) + { + pageModel.Meta.Add(RefFieldName, (string)customMeta.GetFirstValue(RefFieldName)); + } + } + } + return pageModel; + } + public IItem GetPageIdByIshLogicalReference(int publicationId, string ishLogicalRefValue) { try From 47dcdccda917c3fd5748ce75afdfa1b9da25accc Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 14 May 2018 12:30:09 +0100 Subject: [PATCH 55/78] TSI-3210 : Make sure active page model is captured --- .../TridionDocs/Controllers/TridionDocsApiController.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index 8210bdc53..eea28c0ae 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -4,6 +4,7 @@ using Sdl.Web.Common.Models; using Sdl.Web.Delivery.ServicesCore.ClaimStore; using Sdl.Web.Modules.TridionDocs.Providers; +using Sdl.Web.Mvc.Configuration; using Sdl.Web.Mvc.Formats; namespace Sdl.Web.Modules.TridionDocs.Controllers @@ -24,7 +25,9 @@ public virtual ActionResult Page(int publicationId, int pageId, string condition { AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } - return Json(TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId))); + PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + WebRequestContext.PageModel = model; + return Json(model); } [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] From 3864b369421828c3c119fd6d540c397cc7dea4fa Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 14 May 2018 15:43:52 +0100 Subject: [PATCH 56/78] TSI-3070 : Rename property --- webapp-net/Search/Data/SearchResult.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp-net/Search/Data/SearchResult.cs b/webapp-net/Search/Data/SearchResult.cs index 72ee21bf3..a07eb3479 100644 --- a/webapp-net/Search/Data/SearchResult.cs +++ b/webapp-net/Search/Data/SearchResult.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Newtonsoft.Json; using Sdl.Web.Delivery.IQQuery.API; namespace Sdl.Web.Modules.Search.Data @@ -7,6 +8,7 @@ public class SearchResult : IQueryResult { public string Id { get; set; } + [JsonProperty(PropertyName = "meta")] public Dictionary Fields { get; set; } public string Locale { get; set; } = "en"; From 60fe5f914c37e08e196b2ef26020174acf2e6c6b Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 14 May 2018 16:13:43 +0100 Subject: [PATCH 57/78] TSI-3070 : Wrapped IQ search results so it can be seralized properly for js --- .../TridionDocsSearchController.cs | 6 +-- webapp-net/Search/Data/SearchResult.cs | 33 +++++++++++++++- webapp-net/Search/Data/SearchResultSet.cs | 38 +++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs index 768ef6c1d..e04e89b40 100644 --- a/webapp-net/Search/Controllers/TridionDocsSearchController.cs +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -31,10 +31,10 @@ public virtual ActionResult Search() new List { new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE"), - new DefaultTermValue(searchParams.SearchQuery, TermTypes.Wildcard) + new DefaultTermValue(searchParams.SearchQuery, TermTypes.Exact) }).Compile()); - - return Json(results); + + return Json(new SearchResultSetWrapped(results)); } } } diff --git a/webapp-net/Search/Data/SearchResult.cs b/webapp-net/Search/Data/SearchResult.cs index a07eb3479..4c84a0a7f 100644 --- a/webapp-net/Search/Data/SearchResult.cs +++ b/webapp-net/Search/Data/SearchResult.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using Newtonsoft.Json; using Sdl.Web.Delivery.IQQuery.API; namespace Sdl.Web.Modules.Search.Data @@ -8,7 +7,6 @@ public class SearchResult : IQueryResult { public string Id { get; set; } - [JsonProperty(PropertyName = "meta")] public Dictionary Fields { get; set; } public string Locale { get; set; } = "en"; @@ -30,4 +28,35 @@ public class SearchResult : IQueryResult public string ProductReleaseName { get; set; } } + public class SearchResultWrapped : IQueryResult + { + private readonly SearchResult _wrapped; + + public SearchResultWrapped(SearchResult searchResult) + { + _wrapped = searchResult; + } + + public string Id => _wrapped.Id; + + public Dictionary Meta => _wrapped.Fields; + + public string Locale => _wrapped.Locale; + + public Dictionary> Highlighted => _wrapped.Highlighted; + + public string Content => _wrapped.Content; + + public string CreatedDate => _wrapped.CreatedDate; + + public string ModifiedDate => _wrapped.ModifiedDate; + + public int PublicationId => _wrapped.PublicationId; + + public string PublicationTitle => _wrapped.PublicationTitle; + + public string ProductFamilyName => _wrapped.ProductFamilyName; + + public string ProductReleaseName => _wrapped.ProductFamilyName; + } } diff --git a/webapp-net/Search/Data/SearchResultSet.cs b/webapp-net/Search/Data/SearchResultSet.cs index c424ecf9e..321d97c4f 100644 --- a/webapp-net/Search/Data/SearchResultSet.cs +++ b/webapp-net/Search/Data/SearchResultSet.cs @@ -13,4 +13,42 @@ public class SearchResultSet : IQueryResultData public IList QueryResults { get; set; } } + + public class SearchResultSetWrapped : IQueryResultData + { + private readonly SearchResultSet _searchResultSet; + private readonly List _results; + public SearchResultSetWrapped(SearchResultSet searchResultSet) + { + _searchResultSet = searchResultSet; + _results = new List(); + foreach (var x in _searchResultSet.QueryResults) + { + _results.Add(new SearchResultWrapped(x)); + } + } + + public int Hits + { + get { return _searchResultSet.Hits; } + set { } + } + + public int Count + { + get { return _searchResultSet.Count; } + set { } + } + + public int StartIndex + { + get { return _searchResultSet.StartIndex; } + set { } + } + public IList QueryResults + { + get { return _results; } + set { } + } + } } From 11cd9397a8f51e1924c7286ba38dcba766ad3115 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 14 May 2018 16:29:17 +0100 Subject: [PATCH 58/78] TSI-3070 : Updated refs --- webapp-net/Search/Sdl.Web.Modules.Search.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-net/Search/Sdl.Web.Modules.Search.csproj b/webapp-net/Search/Sdl.Web.Modules.Search.csproj index 0e337d6aa..e74f2d8ce 100644 --- a/webapp-net/Search/Sdl.Web.Modules.Search.csproj +++ b/webapp-net/Search/Sdl.Web.Modules.Search.csproj @@ -43,7 +43,7 @@ False - ..\packages\Sdl.Web.Delivery.11.0.0-beta-201804191206\lib\net452\Sdl.Web.Delivery.IQQuery.dll + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.IQQuery.dll ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\lib\net452\Sdl.Web.Mvc.dll From 1a6f5a912d38fdd70c06d5e8a0f81138ecfc0ded Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 15 May 2018 09:30:02 +0100 Subject: [PATCH 59/78] TSI-3209 : Fixed malformed url --- .../TridionDocs/Navigation/TridionDocsNavigationProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs index b6ff9e312..452a5ab2f 100644 --- a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs +++ b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs @@ -45,7 +45,7 @@ protected override TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLe if (ishRefUri != null) { var ish = CmUri.FromString(ishRefUri); - node.Url = $"{GetBaseUrl()}/{ish.PublicationId}/{ish.ItemId}"; + node.Url = $"{GetBaseUrl().TrimEnd('/')}/{ish.PublicationId}/{ish.ItemId}"; } return node; } From 9dcdf52c529a41e4c98d1098f5917de5b3b956e4 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 15 May 2018 14:48:02 +0100 Subject: [PATCH 60/78] TSI-3214 : Fix conditions format --- .../Controllers/TridionDocsApiController.cs | 8 ++++- .../Providers/ConditionProvider.cs | 29 ++++++++++++------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index eea28c0ae..c77f443f7 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -6,6 +6,7 @@ using Sdl.Web.Modules.TridionDocs.Providers; using Sdl.Web.Mvc.Configuration; using Sdl.Web.Mvc.Formats; +using System.Text; namespace Sdl.Web.Modules.TridionDocs.Controllers { @@ -51,7 +52,12 @@ public virtual ActionResult Publications() [Route("~/api/conditions/{publicationId:int}")] public virtual ActionResult Conditions(int publicationId) { - return Json(new ConditionProvider().GetConditions(publicationId)); + return new ContentResult + { + ContentType = "application/json", + Content = new ConditionProvider().GetConditions(publicationId), + ContentEncoding = Encoding.UTF8 + }; } [Route("~/api/sitemap.xml")] diff --git a/webapp-net/TridionDocs/Providers/ConditionProvider.cs b/webapp-net/TridionDocs/Providers/ConditionProvider.cs index a40108e1b..f5048396d 100644 --- a/webapp-net/TridionDocs/Providers/ConditionProvider.cs +++ b/webapp-net/TridionDocs/Providers/ConditionProvider.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using Newtonsoft.Json; using Sdl.Web.Common; using Tridion.ContentDelivery.Meta; @@ -13,21 +14,27 @@ public class ConditionProvider private static readonly string ConditionMetadata = "conditionmetadata.generated.value"; private static readonly string ConditionValues = "values"; + private class Condition + { + [JsonProperty("datatype")] + public string Datatype { get; set; } + [JsonProperty("range")] + public bool Range { get; set; } + [JsonProperty("values")] + public string[] Values { get; set; } + } + public string GetConditions(int publicationId) { var conditionUsed = GetMetadata(publicationId, ConditionUsed); var conditionMetadata = GetMetadata(publicationId, ConditionMetadata); - - JObject o1 = JObject.Parse(conditionUsed); - JObject o2 = JObject.Parse(conditionMetadata); - - o1.Merge(o2, new JsonMergeSettings + Dictionary d1 = JsonConvert.DeserializeObject>(conditionUsed); + Dictionary d2 = JsonConvert.DeserializeObject>(conditionMetadata); + foreach (var v in d1) { - // union array values together to avoid duplicates - MergeArrayHandling = MergeArrayHandling.Union - }); - - return o1.ToString(); + d2[v.Key].Values = v.Value; + } + return JsonConvert.SerializeObject(d2); } private string GetMetadata(int publicationId, string metadataName) From 044aec2b09359eae19768a1643f89a7eb93e6ad9 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 16 May 2018 11:22:13 +0100 Subject: [PATCH 61/78] TSI-3214 : Fixed up some more stuff --- webapp-net/AudienceManager/packages.config | 2 +- webapp-net/DxaModulesCommon.Props | 2 +- .../ExperienceOptimization/packages.config | 2 +- .../Controllers/TridionDocsApiController.cs | 16 ++++++++++++---- webapp-net/TridionDocs/packages.config | 2 +- webapp-net/Ugc/Controllers/UgcApiController.cs | 16 +++++++++++++--- webapp-net/Ugc/packages.config | 2 +- 7 files changed, 30 insertions(+), 12 deletions(-) diff --git a/webapp-net/AudienceManager/packages.config b/webapp-net/AudienceManager/packages.config index f4962c113..c313affea 100644 --- a/webapp-net/AudienceManager/packages.config +++ b/webapp-net/AudienceManager/packages.config @@ -7,5 +7,5 @@ - + \ No newline at end of file diff --git a/webapp-net/DxaModulesCommon.Props b/webapp-net/DxaModulesCommon.Props index bfc9491e8..3075e41be 100644 --- a/webapp-net/DxaModulesCommon.Props +++ b/webapp-net/DxaModulesCommon.Props @@ -11,7 +11,7 @@ 2.1.0-beta-201804241437 2.1.0-beta-201805111302 - 11.0.0-beta-201804191206 + 11.0.0-beta-201805161005 9.0.0-beta-201804031026 8.5.0 10.1.0 diff --git a/webapp-net/ExperienceOptimization/packages.config b/webapp-net/ExperienceOptimization/packages.config index 4ec47f403..663cead72 100644 --- a/webapp-net/ExperienceOptimization/packages.config +++ b/webapp-net/ExperienceOptimization/packages.config @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index c77f443f7..1e78c18c2 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -18,9 +18,17 @@ public class TridionDocsApiController : BaseController private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); [Route("~/api/page/{publicationId:int}/{pageId:int}")] - [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] [HttpGet] - public virtual ActionResult Page(int publicationId, int pageId, string conditions = "") + public virtual ActionResult Page(int publicationId, int pageId) + { + PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + WebRequestContext.PageModel = model; + return Json(model); + } + + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] + [HttpPost] + public virtual ActionResult Page(int publicationId, int pageId, string conditions) { if (!string.IsNullOrEmpty(conditions)) { @@ -29,8 +37,8 @@ public virtual ActionResult Page(int publicationId, int pageId, string condition PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); WebRequestContext.PageModel = model; return Json(model); - } - + } + [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] [Route("~/api/binary/{publicationId:int}/{binaryId:int}/{*content}")] [HttpGet] diff --git a/webapp-net/TridionDocs/packages.config b/webapp-net/TridionDocs/packages.config index c603c03f0..da2616e98 100644 --- a/webapp-net/TridionDocs/packages.config +++ b/webapp-net/TridionDocs/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index a47d1d4b6..c00990e1b 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Sdl.Web.Mvc.Controllers; using System.IO; using System.Text; @@ -9,6 +10,7 @@ using Newtonsoft.Json.Serialization; using Sdl.Web.Modules.Ugc.Data; using Sdl.Web.Mvc.Configuration; +using Tridion.ContentDelivery.AmbientData; namespace Sdl.Web.Modules.Ugc.Controllers { @@ -54,10 +56,18 @@ public ActionResult PostComment(int publicationId, int pageId, bool descending = {"language", "\""+posted.Language+"\""}, {"status", "0"} }; - AddPubIdTitleLangToCommentMetadata(posted, metadata); + + AddPubIdTitleLangToCommentMetadata(posted, metadata); + + string userId = posted.Username; + if (string.IsNullOrEmpty(userId)) + { + userId = "Anonymous"; + } + Comment result = ugc.PostComment(posted.PublicationId, posted.PageId, - posted.Username, + userId, posted.Email, posted.Content, posted.ParentId, diff --git a/webapp-net/Ugc/packages.config b/webapp-net/Ugc/packages.config index 4928c1a38..d2496af24 100644 --- a/webapp-net/Ugc/packages.config +++ b/webapp-net/Ugc/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file From 6bd16d86e351ea0334c32b80b959fe69981611cd Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 16 May 2018 14:08:54 +0100 Subject: [PATCH 62/78] TSI-3216 : Search on correct publication with correct language --- .../TridionDocsSearchController.cs | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs index e04e89b40..33bfa9fd8 100644 --- a/webapp-net/Search/Controllers/TridionDocsSearchController.cs +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Web.Mvc; using Newtonsoft.Json; using Sdl.Web.Delivery.IQQuery.API; using Sdl.Web.Delivery.IQQuery.Client; using Sdl.Web.Delivery.IQQuery.Model.Field; +using Sdl.Web.Delivery.IQQuery.Model.Result; using Sdl.Web.Modules.Search.Data; using Sdl.Web.Mvc.Controllers; @@ -23,18 +25,30 @@ public virtual ActionResult Search() SearchParameters searchParams = JsonConvert.DeserializeObject(json); IQSearchClient search = new IQSearchClient(); - - var results = - search.Search( - new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd( - new List { "dynamic.FISHDITADLVRREMOTESTATUS.lng.element", "content.english" }, - new List - { - new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE"), - new DefaultTermValue(searchParams.SearchQuery, TermTypes.Exact) - }).Compile()); - + search.WithResultFilter(new SearchResultFilter + { + StartOfRange = searchParams.StartIndex, + EndOfRange = searchParams.StartIndex + searchParams.Count, + IsHighlightingEnabled = true + }); + var fields = new List(); + var values = new List(); + if (searchParams.PublicationId != null) + { + fields.Add("publicationId"); + values.Add(new DefaultTermValue(searchParams.PublicationId.Value.ToString())); + } + fields.Add("dynamic.FISHDITADLVRREMOTESTATUS.lng.element"); + fields.Add($"content.{CultureInfo.GetCultureInfo(searchParams.Language).EnglishName.ToLower()}"); + values.Add(new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE")); + values.Add(new DefaultTermValue(searchParams.SearchQuery, TermTypes.Exact)); + var results = search.WithResultFilter(new SearchResultFilter + { + StartOfRange = searchParams.StartIndex, + EndOfRange = searchParams.StartIndex + searchParams.Count, + IsHighlightingEnabled = true + }).Search(new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd(fields, values).Compile()); return Json(new SearchResultSetWrapped(results)); - } + } } } From b0ed5636575fbacd8ac0a549882892d0bb924337 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 18 May 2018 09:46:23 +0100 Subject: [PATCH 63/78] TSI-3218 : Handle invalid urls with correct error page --- .../TridionDocs/Views/Page/ErrorPage.cshtml | 29 +++++++++++++++++++ .../Controllers/TridionDocsPageController.cs | 2 -- .../Providers/TridionDocsContentProvider.cs | 8 +++++ .../Sdl.Web.Modules.TridionDocs.csproj | 1 + 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 webapp-net/TridionDocs/Areas/TridionDocs/Views/Page/ErrorPage.cshtml diff --git a/webapp-net/TridionDocs/Areas/TridionDocs/Views/Page/ErrorPage.cshtml b/webapp-net/TridionDocs/Areas/TridionDocs/Views/Page/ErrorPage.cshtml new file mode 100644 index 000000000..64887740d --- /dev/null +++ b/webapp-net/TridionDocs/Areas/TridionDocs/Views/Page/ErrorPage.cshtml @@ -0,0 +1,29 @@ + + + + + + SDL Documentation Error + + + + + + + + + + +
+ + + + + + + + + diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs index 0ede7070b..ac73e1ace 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsPageController.cs @@ -18,7 +18,6 @@ public class TridionDocsPageController : BaseController [Route("~/publications/{*content}")] public ActionResult Home() { - System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; return View("GeneralPage"); } @@ -37,7 +36,6 @@ public virtual ActionResult Page(int publicationId, int pageId, string path = "" protected ActionResult GetPage(int publicationId) { - System.Web.HttpContext.Current.Items["ActiveFeatures"] = "commenting"; SetupLocalization(publicationId); return View("GeneralPage"); } diff --git a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs index 8b8fd750c..04a9d36a7 100644 --- a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs +++ b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs @@ -86,6 +86,14 @@ public override PageModel GetPageModel(int pageId, ILocalization localization, b return pageModel; } + public override PageModel GetPageModel(string urlPath, ILocalization localization, bool addIncludes = true) + { + return new PageModel + { + MvcData = new MvcData { ViewName = "ErrorPage", AreaName = "TridionDocs"} + }; + } + public IItem GetPageIdByIshLogicalReference(int publicationId, string ishLogicalRefValue) { try diff --git a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj index 8c8c64b30..4763570bf 100644 --- a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj +++ b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj @@ -109,6 +109,7 @@ + From fff6067c28d8e23ed5d6971e9dff403572e7c275 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 18 May 2018 12:26:37 +0100 Subject: [PATCH 64/78] TSI-3218 : Tweak of search module result set --- .../TridionDocsSearchController.cs | 10 ++++++-- webapp-net/Search/Data/SearchResultSet.cs | 23 ++++--------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs index 33bfa9fd8..be42a1f06 100644 --- a/webapp-net/Search/Controllers/TridionDocsSearchController.cs +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -47,8 +47,14 @@ public virtual ActionResult Search() StartOfRange = searchParams.StartIndex, EndOfRange = searchParams.StartIndex + searchParams.Count, IsHighlightingEnabled = true - }).Search(new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd(fields, values).Compile()); - return Json(new SearchResultSetWrapped(results)); + }).Search(new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd(fields, values).Compile()); + var resultSet = new SearchResultSetWrapped(results) + { + Hits = results.Hits, + Count = searchParams.Count.Value, + StartIndex = searchParams.StartIndex.Value + }; + return Json(resultSet); } } } diff --git a/webapp-net/Search/Data/SearchResultSet.cs b/webapp-net/Search/Data/SearchResultSet.cs index 321d97c4f..105961c82 100644 --- a/webapp-net/Search/Data/SearchResultSet.cs +++ b/webapp-net/Search/Data/SearchResultSet.cs @@ -16,35 +16,20 @@ public class SearchResultSet : IQueryResultData public class SearchResultSetWrapped : IQueryResultData { - private readonly SearchResultSet _searchResultSet; private readonly List _results; public SearchResultSetWrapped(SearchResultSet searchResultSet) { - _searchResultSet = searchResultSet; _results = new List(); - foreach (var x in _searchResultSet.QueryResults) + foreach (var x in searchResultSet.QueryResults) { _results.Add(new SearchResultWrapped(x)); } } - public int Hits - { - get { return _searchResultSet.Hits; } - set { } - } - - public int Count - { - get { return _searchResultSet.Count; } - set { } - } + public int Hits { get; set; } + public int Count { get; set; } + public int StartIndex { get; set; } - public int StartIndex - { - get { return _searchResultSet.StartIndex; } - set { } - } public IList QueryResults { get { return _results; } From c3a9f032fd216e14c5838ff21d0ac2e924f53336 Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Tue, 22 May 2018 08:55:50 +0200 Subject: [PATCH 65/78] Minor: Updated trace logging messages --- .../dxa/modules/ugc/controllers/UgcPostFormController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java index 9d979837f..9dc05f54e 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/controllers/UgcPostFormController.java @@ -46,16 +46,16 @@ public String postComment(@ModelAttribute("entity") UgcPostCommentForm form, Bin ugcPostCommentFormValidator.validate(form, bindingResult); if (bindingResult.hasErrors()) { - log.trace("Comment Form has {} errors", bindingResult.getErrorCount()); + log.trace("Comment Form for {} has {} errors", form.getTarget(), bindingResult.getErrorCount()); redirectAttributes.addFlashAttribute("errors", bindingResult.getAllErrors()); return REDIRECT_PREFIX + form.getFormUrl(); } - log.trace("Comment Form complete and valid"); + log.trace("Comment Form for {} complete and valid",form.getTarget()); ugcService.postComment(form.getTarget().getPublicationId(), form.getTarget().getItemId(), form.getUserName(), form.getEmailAddress(), form.getContent(), form.getParentId(), form.getMetadata()); - log.trace("Comment posted succesful {}", form.getUserName()); + log.trace("Comment on {} by {} posted succesful", form.getTarget(),form.getUserName()); return REDIRECT_PREFIX + form.getFormUrl(); } From 5da3d9e752ef2d2226a9db0e679f64963eaf33ff Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 23 May 2018 12:10:16 +0100 Subject: [PATCH 66/78] TSI-3221 : Handle exceptions of api/page --- .../Controllers/TridionDocsApiController.cs | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index 1e78c18c2..efe94d87d 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -7,6 +7,7 @@ using Sdl.Web.Mvc.Configuration; using Sdl.Web.Mvc.Formats; using System.Text; +using Sdl.Web.Common.Logging; namespace Sdl.Web.Modules.TridionDocs.Controllers { @@ -21,22 +22,38 @@ public class TridionDocsApiController : BaseController [HttpGet] public virtual ActionResult Page(int publicationId, int pageId) { - PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); - WebRequestContext.PageModel = model; - return Json(model); + try + { + PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + WebRequestContext.PageModel = model; + return Json(model); + } + catch(Exception ex) + { + Log.Error(ex); + return ServerError(); + } } - + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] [HttpPost] public virtual ActionResult Page(int publicationId, int pageId, string conditions) { - if (!string.IsNullOrEmpty(conditions)) + try { - AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + if (!string.IsNullOrEmpty(conditions)) + { + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + } + PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); + WebRequestContext.PageModel = model; + return Json(model); + } + catch (Exception ex) + { + Log.Error(ex); + return ServerError(); } - PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); - WebRequestContext.PageModel = model; - return Json(model); } [Route("~/binary/{publicationId:int}/{binaryId:int}/{*content}")] @@ -110,5 +127,16 @@ public virtual ActionResult TopicIdInTargetPublication(int publicationId, string } return Json(TridionDocsContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); } + + public new ActionResult ServerError() + { + using (new Tracer()) + { + Response.StatusCode = 404; + ViewResult r = View("ErrorPage"); + r.ViewData.Add("statusCode", Response.StatusCode); + return r; + } + } } } From 50f61ba6736574dbda0109858164141f05a7a10c Mon Sep 17 00:00:00 2001 From: Jacques Kors Date: Thu, 24 May 2018 16:44:17 +0200 Subject: [PATCH 67/78] Fixed bug, where modelData can have a null ComponentTemplate --- .../sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java index 5f3374fb2..9434f51ca 100644 --- a/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java +++ b/webapp-java/dxa-module-ugc/src/main/java/com/sdl/dxa/modules/ugc/mapping/UgcModelBuilder.java @@ -260,11 +260,13 @@ public PageModel buildPageModel(@Nullable PageModel originalPageModel, @NotNull */ @Override public T buildEntityModel(@Nullable T originalEntityModel, EntityModelData modelData, @Nullable Class expectedClass) { - final ContentModelData ugcMetadata = ugcMetadata(modelData.getComponentTemplate().getMetadata()); - if (ugcMetadata != null) { - originalEntityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); - originalEntityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); - originalEntityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + if (modelData != null && modelData.getComponentTemplate() != null ) { + final ContentModelData ugcMetadata = ugcMetadata(modelData.getComponentTemplate().getMetadata()); + if (ugcMetadata != null) { + originalEntityModel.addExtensionData(SHOW_COMMENTS_EXT_DATA, showComments(ugcMetadata)); + originalEntityModel.addExtensionData(POST_COMMENTS_EXT_DATA, (postComments(ugcMetadata) ? ugcPostFormMetadata(ugcMetadata) : null)); + originalEntityModel.addExtensionData(COMMENTS_ENTITY_REGION_EXT_DATA, getValue(ugcMetadata, COMMENTS_REGION_KEY, String.class)); + } } return originalEntityModel; } From 1204201a5daad1fea06af385ae3ffce2a7e8d807 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 25 May 2018 13:28:15 +0100 Subject: [PATCH 68/78] TSI-3220 : Fixed issue with quotes --- .../Controllers/TridionDocsSearchController.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs index be42a1f06..b471fc082 100644 --- a/webapp-net/Search/Controllers/TridionDocsSearchController.cs +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -9,11 +9,14 @@ using Sdl.Web.Delivery.IQQuery.Model.Result; using Sdl.Web.Modules.Search.Data; using Sdl.Web.Mvc.Controllers; +using System.Text.RegularExpressions; namespace Sdl.Web.Modules.Search.Controllers { public class TridionDocsSearchController : BaseController { + private static readonly Regex RegexpDoubleQuotes = new Regex("^\"(.*)\"$", RegexOptions.Compiled); + [Route("~/api/search")] [HttpPost] public virtual ActionResult Search() @@ -41,7 +44,15 @@ public virtual ActionResult Search() fields.Add("dynamic.FISHDITADLVRREMOTESTATUS.lng.element"); fields.Add($"content.{CultureInfo.GetCultureInfo(searchParams.Language).EnglishName.ToLower()}"); values.Add(new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE")); - values.Add(new DefaultTermValue(searchParams.SearchQuery, TermTypes.Exact)); + + string searchQuery = searchParams.SearchQuery; + Match match = RegexpDoubleQuotes.Match(searchQuery); + if (match.Success) + { + searchQuery = match.Groups[1].Value; + } + + values.Add(new DefaultTermValue(searchQuery, TermTypes.Exact)); var results = search.WithResultFilter(new SearchResultFilter { StartOfRange = searchParams.StartIndex, From ab9e7f915cdf869346185227798dc67f52fa00aa Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 4 Jun 2018 08:49:01 +0100 Subject: [PATCH 69/78] TSI-3218 : Added correct response code --- webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs index 04a9d36a7..f5bfdfa84 100644 --- a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs +++ b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Web; using Sdl.Web.Common; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; @@ -88,6 +89,7 @@ public override PageModel GetPageModel(int pageId, ILocalization localization, b public override PageModel GetPageModel(string urlPath, ILocalization localization, bool addIncludes = true) { + HttpContext.Current.Response.StatusCode = 404; return new PageModel { MvcData = new MvcData { ViewName = "ErrorPage", AreaName = "TridionDocs"} From da88f72938c8060feda7386cfd9f3083ddc2fab7 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 4 Jun 2018 14:58:21 +0100 Subject: [PATCH 70/78] TSI-3221 : Added missing files --- .../Views/TridionDocsApi/ErrorPage.cshtml | 29 +++++++++++++++++ .../Views/TridionDocsApi/GeneralPage.cshtml | 31 +++++++++++++++++++ .../Sdl.Web.Modules.TridionDocs.csproj | 2 ++ 3 files changed, 62 insertions(+) create mode 100644 webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/ErrorPage.cshtml create mode 100644 webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/GeneralPage.cshtml diff --git a/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/ErrorPage.cshtml b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/ErrorPage.cshtml new file mode 100644 index 000000000..8274961ab --- /dev/null +++ b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/ErrorPage.cshtml @@ -0,0 +1,29 @@ + + + + + + SDL Documentation Error + + + + + + + + + + +
+ + + + + + + + + diff --git a/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/GeneralPage.cshtml b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/GeneralPage.cshtml new file mode 100644 index 000000000..7309a6233 --- /dev/null +++ b/webapp-net/TridionDocs/Areas/TridionDocs/Views/TridionDocsApi/GeneralPage.cshtml @@ -0,0 +1,31 @@ + + + + + + SDL Documentation + + + + + + + + + + +
+ + + + + + + + + diff --git a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj index 4763570bf..cb8f55e1e 100644 --- a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj +++ b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj @@ -110,6 +110,8 @@
+ + From b648658600072feae147610ec94a79e957aaa60d Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 4 Jun 2018 15:59:54 +0100 Subject: [PATCH 71/78] Use installed NuGet --- webapp-net/ciBuild.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-net/ciBuild.proj b/webapp-net/ciBuild.proj index 521e5baf8..29ef778ac 100644 --- a/webapp-net/ciBuild.proj +++ b/webapp-net/ciBuild.proj @@ -27,7 +27,7 @@ $(JenkinsUrl)/job/DXA%20$(DxaBuildType)%20CI%20Web%20App%20.NET/lastSuccessfulBuild/artifact/Site/bin - "$(ProjectDirectory)\_tools\NuGet.exe" + "NuGet.exe" C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe From a3b1e6ab290837a87ea88eab88b761e7b42c9590 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Mon, 4 Jun 2018 16:30:08 +0100 Subject: [PATCH 72/78] TSI-3221 : return json --- .../Controllers/TridionDocsApiController.cs | 16 ++++++---------- .../TridionDocs/Providers/PublicationProvider.cs | 13 ++++++++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index efe94d87d..46b96cb7e 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -31,7 +31,7 @@ public virtual ActionResult Page(int publicationId, int pageId) catch(Exception ex) { Log.Error(ex); - return ServerError(); + return ServerError(ex); } } @@ -52,7 +52,7 @@ public virtual ActionResult Page(int publicationId, int pageId, string condition catch (Exception ex) { Log.Error(ex); - return ServerError(); + return ServerError(ex); } } @@ -128,15 +128,11 @@ public virtual ActionResult TopicIdInTargetPublication(int publicationId, string return Json(TridionDocsContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); } - public new ActionResult ServerError() + public ActionResult ServerError(Exception ex) { - using (new Tracer()) - { - Response.StatusCode = 404; - ViewResult r = View("ErrorPage"); - r.ViewData.Add("statusCode", Response.StatusCode); - return r; - } + Response.StatusCode = 404; + if (ex.InnerException != null) ex = ex.InnerException; + return Content("{ \"Message\": \"" + ex.Message + "\" }", "application/json"); } } } diff --git a/webapp-net/TridionDocs/Providers/PublicationProvider.cs b/webapp-net/TridionDocs/Providers/PublicationProvider.cs index 71c601ea0..0017f59b7 100644 --- a/webapp-net/TridionDocs/Providers/PublicationProvider.cs +++ b/webapp-net/TridionDocs/Providers/PublicationProvider.cs @@ -70,7 +70,7 @@ public void CheckPublicationOnline(int publicationId) } if (meta == null || !IsPublicationOnline(meta)) { - throw new DxaItemNotFoundException($"Unable to find publication {publicationId}"); + throw new DxaException($"Unable to find publication {publicationId}"); } } @@ -78,8 +78,15 @@ public bool IsPublicationOnline(PublicationMeta publicationMeta) { var customMeta = publicationMeta.CustomMeta; if (customMeta == null) return false; - var status = customMeta.GetFirstValue(PublicationOnlineStatusMeta); - return status != null && PublicationOnlineValue.Equals(status.ToString()); + try + { + var status = customMeta.GetFirstValue(PublicationOnlineStatusMeta); + return status != null && PublicationOnlineValue.Equals(status.ToString()); + } + catch (Exception) + { + return false; + } } private Publication BuildPublicationFrom(PublicationMeta publicationMeta) From 3f2d9e5130c1dd6a7f564793358b380d972bd7b7 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 5 Jun 2018 10:56:02 +0100 Subject: [PATCH 73/78] Remove NuGet.exe from repo and use pre-installed one to avoid old versions --- webapp-net/_tools/NuGet.exe | Bin 18432 -> 0 bytes webapp-net/ciBuild.proj | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 webapp-net/_tools/NuGet.exe diff --git a/webapp-net/_tools/NuGet.exe b/webapp-net/_tools/NuGet.exe deleted file mode 100644 index be85ec2c4ca7dd7044e7c6742215d8d58155963c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 zcmeHudw5(&mFKySzWr|Lc3YAiThX=TM_Z4!HQ>RXyI#suB_0D(QK?)J6_`dZP(HD^NXN!RUHkd_m zqV0hIWq{Q&!&0#N&}A zp6ETpL^~vf{)h4MZojpkkSs-|5YZ-3knm^Il>i35*Wk5kgKrkx1# zH>4p;>u$7BFr7wUG$+dBKzGa@@kw0~`vZPHqA3>o6iLSc?63Lcbb@IO08#s&<`SW~ z7IQG_k(8>dK}$zYS3_1(r15YkE$meYlGsGLlL9%?bxl%A&qMCQ)mt^I37M8vJJZda z9!$3&NzVspGtvt8XTf12ZJnZ0OS%=v(r7%Xh=$tYt8YDV zAxP;qfHQr|L}yZJb1Kl)qN{qqGC+@MAt6K$w7fGF&;z<^Ee3hjnKPtW?Z{~uBa+Zr zbei7tLFz-Xw99UiVBHRsr!mhW&1a>~3+41uWII25Lc(N`+cLLekfjqaftp^10&6+I z(w^8dw_Ko|U$pxn=vfSzoCbTuS^?mo$;d2ANp~@=n^Bh2xnEYS9$<>_mwV)SopO357&0L_-HUX!EO*KkXe&ju9^{=q5Thr+t;U;EYS+B5uHG99 zDk05+b7CxE3yf^|_QI-Hg53WU#uI(u7@#k>4LJyEwkM(bgIbI2h;+VvlSpS-Z07|h zFx6GRF1i8Fhrgy_NG&2Chago+O4e#L*VE|Y7*v6G%fZfhRdZe_ABO`$QmR*@OCbj? ztvi<>jRw`5xM;4>pkTMwK=3k8u1gA@)es3ZXDv#si@3ORliU_xU|o#7vkss$p&C6K*z!&7wL;TacM|RYsacPwLoAUS@`{BX5DG_*yTjkL zE0{_o6Rz0PuGmCXY+tA+qicGAg*LFz7QMk0>Z<80Ddf3R%T+uT)HN-QX{&|0kxj$K zngS(;gf3q1kg%6?Z1ekV4TF#hu|?T{7D7hVK6=nXhyxn3wy_u&)kCT1i*YEP3hQAD zo)bwUcxb7J9_fjLvK^GRNJc(;K^0lu6z*;`xU&vIWhDAy_u04JI(tDd)tGFYW8cQA zAzJl_1t-*m!&`6ZQJ#|nm>zIrdIC-V9O);3 zz{#qgm7w1M>>;FVLQGSM*BwMs-Y)2J1yF{UrsN8yj1&!W&xap)-BKpU%t{o}l>giDsWoryD zqMeAKrRMZLAkkoYKayAo6`0=uKT35ueW0H8oy;m^1g(R}ckUO6{c-eB2%Tk-Fc`;` zV~_zi*5{qouu^EwyHMc-2x1E~*C22I6x8{*VZ7lO&CezvtG2jVS#Ver01pOR(m9c)^Gq`V zv<227PO9ObW3EhR&>lLfw=GIfqF5L(eHgijW-peZ0_USar+|c4u4e0624S*9!~cl3G-5@&9Wu6bcu_DTG~Ro%z-(yAg|n7*Ov4&NWt_Gz_bmJ z3MPYT2bm5ihR>2M7cC0eYoUo%1~rsMj6!9um97Xv7YKD_%_;3noc9|X^0hP6f^gpn zdtv1ux{x0EE=4i%G3QjmcoIygr;kEV^KDQ|vaUxKUEj?O!fz1JG<%eh86aITx1`0w z6oyrrGSQ$Wb~P;rS7~BP)Tsqq-f102v2`OrC;M@UP;=eeP#3CW@1e}=ipus8)@4>y>j~N~0qcrt)=3aVdr|xESuTu+4Ux7? zs3ZzvLAyo4{I}kNqMmfnUJNY#UPcy%>Wku`T2YtO5)bz@+Dn;NgE`#|FU$$wk>~=X zh*6lE?}HpnkeiX5iPU+%Yj+u|dZ@wmarQZQ3BfP)^!vG5TP*znr0EX=$kr)9>q87~ z0XPGn;ldX>dHiJTP%d1;TLg@xw{tioJGX-2CKP*{2?Q`G#Tz8H-%jvi6@iY3w3x)* z3*_U>t68ut_8HdgNO)hQbt-A>SFnqlha7e>TFm7Pxtxl}8SdoJ1lcORiWI)2%g4Dv zu{pE{VXEfz8qt>6!1fGj&Yz(TjNQR%Sxjz81??H&dQdROLoRbu*iGZXP}sQx)vVJ1 z!A>Dp3@hAa2}nI9ttF|ZKa6a5PFLIdz1h-K_!yS- z|HQml0&g$0^ew^$U2DD{i%Ptlsx{dv&?G&t1|C&rM|8*OKm14PKoBbuTQns_jZevenqFBgXX3mUR*O{gM ziHk4JuFb8zsBiu1HD>R+^&NlQSfx}hOqqV`qh=X<4)Lswg!T*!@&7Fk?0VnW^{+mB z*JmGj?ibJHfBN@t-IHwnUnkaH3zmoR?ZNj)_%7s5;bTAsHdHp5l*hM3WhzjXisaBZ z?Lp4L-}PjHBQGkfdwXUZY{zJZ&d(7;^^NB*8mGNz`v_G49cXZVu9Xn*wyN$!MH5Qy zg343Kje&X7FbJ%ajlK+`poBjQ^7jbp6ip+)O_UF!%DMf&1|k-*VyqGiF(Jf)2yTfD z^(`<+kv&<*x!$t#8w_djo}!s`Og>#YTF8s^*o=|0&Af@B%NCstQpY(gb%n+u%QlYp z-n2oA>~l4Myvt*PHo5ucvQ^^*M(Q+kUu#DZ)+%gNv7Olx{BL{E4 z&VVj{Lp!r2v}YS79Jd+SQr^fNHo>ucpjfo7cRR!C=B?{XMJt;(rV5TzC`}sEuA-1! zu^FGJ6pH!Ga^s*?;qyELcAl#utM8cQGBdNDX6b0bwn}Ur<7n0{2>UJ{7Iqdk^fbgw zV@oV&EtZ$d?S|Mj;%%B-iZ&Ur*xq0!EhLL=(kH( za}ed$cjJq-Rm94TNH4+{RS8i{ESyk*W287E!#d_PeNws`@Ym8ypbyDRd9Q5B5&ApiBh;(tN`yYGF#QRIr9BB4 zp%HIgMCCof|0q+#>lLCHPz~{o; z;_t&h4M(Uy!gc>!gylRf;12;cdOgBzMWRf9ca(c{51>Ym3(AWk|C-1*#JIErP@~IZ z!?9*M6)OUM6i}nj#aLQbd~sZ(Apu7OJQ-&l9*lG8lYkL=C7zT1oSNWA8ucZZ|Gfg< zCg8&f=KNd01ih<)t$I@fTlJ$2O#e>9;&_B2jYGm&U5{nYeE?%VkFW_wp8pyt11x}? zOtaX2ZTB!uU|E4FcxL5#CqzA!pR!Qz&qSGu=L#*)K&IYzOrkamLP?MQNGPGcGkr0n9pHn;WTJl*OozPJ**X zU@2Np3b5NFEHg!ypj4JS08{dEz#e%eEv9?r1IRxtXGzmeDi6{A*;C4=0Ph7{OpDc5 zQMy|FCHB0(jeTFad^QzWPM6Ov6tDxZk5&e5kQP%Va02kgzz3xiJtN-=o3GLybSD*k zGjIyyC(#}Q%F?S6V*z?YV0Y1DQZst|{l#2%n!Y0~1on>td;k3Br8Z!{6xdzVA$PKE z+6CwQ2f`aM*LDc(BXmkyjoF*`u-)=zJmq|&juW9re7+gT%G+TvA3G)OLG1XA;JhpJ zm~3(sfx%rp_W;}OVO(z>-6yb*(AVW_5q=&Qn5$dxc*^@{5Bq`gBb==0 z%iXd+C}+r^T>@i0e}>bDs|5CHm|O3lBObeZsug{4ylU_fxRlRt-I+)fxVaBAGk~Ep=sVM(n@NCF;IE`rWP8||z~|w;7uWgH zTH5Sl^g!gl$ZH`_qF-aFlIb^q3jH1skq3+1+tcTX(#3!>bpmp&#zw!^DnVzNz67SY z`Fbd09@psHx?j3UNZ0|W&=r6x9Rdu{Q9y}K)j@7urVrOqJ}&YP3HXG7{~F_3Ul;jr z3HYplFVs<7ZO>?pjWWF~==J)zrQDX^BUguq5&vZRbcEw}5OXMm7!t#rh#_r+uRcM~ zOK;%)62qqjd``e01OB!28sImiUjeq!n*y$&3qnszlEnOB0awue&@AcFky>|IV{@h zlkN@o$^(d<7t15kSHoKX|7Umvl;@@0a#jjO4gfBU%+d%gi5v%99l1&_NIN4FfceNI zAorpGU!Rg=^q$Cv0Y4M@j64q#{yXwti99W@pqC>50LV6piFQwkT1%)Y`UiQ07DeyJ zO0g^|D}8iPG^mVtkSQayEgDxA(KX;)M0PZ(bfZ=)=uayhN`W{M-6P!^?NIKKJ{3)a z^LeRN(TSr_pY&98S~*GIgM>$=Uqxq-{~caM6=+DgS^1iDQS27w6meuL(B@bhJtw^@ z_F?5YDHpq2`LXnH?7u3nNneV64)EKtuYvMBD9=e9^0$;FqIcZ_7HC!c1?5d?EdH|c zE9vU^YtYS%|4zwD#rOgFpmcj&Qp56H@u0e1`fNO|_DRpiQ|d|jVf+n5jNisvLGMU( zseSTAiB;-7kogAPLz@zDWxcdFp-T7AWa15aQ@SzHC9juVcwb_jIwF5Qu~~gn`f6er z`4I_+zCgAU3Q4G*dZWrs^)$%nvsLFiF6E8pDkB;YL#SVyG4Z1}FKOJ8XCKHv`< zo>w2Bml|FI{55JFk&nQ)*9e)9(%FXN$g_t$D*DL&Pk~3pSg)XDqZU{}iyFDD6^(j; zJ@Za=4Q1uNKp!1bHi7ebX*e)KD;xKKb5L+T6@66gqtV8FpkEDo2ygWt!5lW|F|6>t z)Q0`u8d@XCw3fb%{5l#%{t4tW*em4%89b*xhFx8Xo<@EleIKxkLRtoIA#}h?=mPEI zf`=sLGz82_e=9vkgEB)S!0=_MRlZ(+pM0PEqMT6*$`i^n$}g2AYF@oVy=c+o(k+1&4%PS6Y zsvn6ikrXJZjaCfW;@N~r8+TgyO3~az;>j{& z9y4iVuzDh}$2}>)xdlJF6FnSdr@p1Z zEFQ1xxJUWXmPWRh%hLzU2}qsh=Xn}|M#pB(WgeTEHfgVUq=F~n?KoX9Z91po0XsX* z+<5wCrb2vnRmLg-i z59;V?Hov1#G6$SF^c2}aCs!#T|UQOe|CLSK+SEDkEWr-S|gjoarE(4-A>cqf9a znb+=k7QIJFAtz34M$y=m>5v#7VS5^IYMpQgX&|5Xbr`gYMOcVOJ_AqknqjB%vO@(? znzd)HSw-Wysu#MF#tS8d1OqyNS!NE~HfGFrRK&42@gXOt{sAiI$1S@sStw<_ zqjq-)&*L(enkCaNJi6~C^-O>@q zZCGF!O7zs6&e|rTl;=A%X3y+3akyt5WvV#HC&Uw)W@n??1QVWbgL4MwfP@hj?+@75 znU&9qaZv60V_hwW^B7aVwQ0Bg8d{CiwU*qeT*INfFWz%ANI6=tDo)jD#S9_S4cunl z^Q}XLB7C5Hn6m6VRZBu$9&ItuCS8Xi%eyY=y9P#|-%@0}7a-i`ODrK`;#XRK2EyOp+oSG=kj1|g7v&QI?2Qe++AcxC;T;#P^D;P2-DwC6ZwtFrO zI$=@9-0~dDS9uV}>*%#TYT8E&=p`a26GSZDYZkM|M9!&+^C~hMiYCN*S1YZ$E!NrU znp`WkrpJem;JlnyA52hjSih@MEY{}CNC`tz$nVCwDq60Uz?|c|{h1;Tm;J4SJJERY za&y(SjIchk^#`jVkZ>kG?!Rdeh`ZYP^U)WHc`1gQV*oZMJWaWMKiy%LCgCPb8m!ok zW$!Q#mFv(kYZ|L7Ry!`+V>tz0prF>2brd7xiyAzfwP^qwf>K^&c?sqgJZ~Jvix0P1 zE_G;U_Bu?9Y<_pCID-&bJa4i(`yee2?P0qENhwcw>Dj4(@p&6T?N`0xyi`nWui;XOaj3obe{Lzg%M4B7oG! z%AMBCIOM*EsTDaw6Oa5ygY0mOy3{PY5pLtA-1s=JGsW!8U@`09?#4!JAT~{mkN4v3 zTaKA|Lm?Kw)r9PBd*5^(F^G3l?B`Yq%YfKhZL{nt*blPn=J$)FftZkLCIW+S_ zyjfu2Q7{`vb9jg6bMUl3YT9KQv$o=8=0$6~DadnR4q;zu+LcKghw3&Wt~23<>*$h= zo7Rty3)jsLl&sRs6qcQxX8Ev{A2N&PB>V%9x$Zmlk=;DiO*|Z+JH9nM$~FXLV&LHj zh$XR~fU47YeeP|2T&p2w;*DNyckNG6G1DNsI^+By@xp6q($z#r**)r)j<{|PTe-`q z=kb>nhkLT9_n-+#C+_HoV)cA}{<<%FT)8RscBO1cz|1 znNhsa#kzoJ6->lQo*V8H#8AP;kXrVPU_5~64#%hwhmRE;%+(s9nsej1*j!X;>=Wh~ zmTuRx%DG**Bn91eWSz3GHka)yBSs({ozCJ_`t2VMvBCUzG; ze2l`Ca^+Fwu;!0as?EaleSgC@*`+$`EzMJ z|AZynD(-F;7UEekH_GfptJz7{k_e*g85}?_E1-J_u?TG(Qn_7Tf5m8wPGct^NM0bT z?q->7U;;}oMxWP*5ohbnG-9`z=iza^w#w|DG6;xSG8Bk5|DRos zp#Jk;()iP^a?tv>tL7x#-jtf4`KTGlbnhk6^7EIo1?F6_+Wc?XtG?{~_L1;@`YN15w!S~M z@%8V0e(1BeG#~!fRUi8*g&x1*%KZ!0{Nz;BP?LJHDY-yT%Q)LiwkkL=#TZJ8mRu}r z36-QoLeW|iQDVkWaw!;btcyIV1r1q3WnD8QM#EZDa)rzU)Lz8m7HPx`O=<{v6^FDv z0Ldmakl;+8nr2d(NokOf=?fT=lw80P7bKfxEu?5V{{#z1w0xf0Oo8OursR4lxwI+S z513q%oSzJFGe&YP?k&hk1Lwq2av*6yiD4ma7##?xkc;k6asXVR)&x2#&=H_g(uF%k z{_=U}8=VW!N30F$vhx?8JEG8O0h?(bo9Q615q!4@El1cQ2LpzjNXXougUKeS13sbD zQuK=J7r4-i!3Ezadc70YK;X0iA1tBIeQ!a12FvToiKU`oenW?D8#%9 zND9kQ(4IbfT1H+8#e-V16_|o=g8AfxMoMDQA`Boq0}i%BP;d4V`s_oHoSgkMyFmhJ z0M?y-l)JHj4Xq3Owy>eV2T*<+loAR(mS~0GpakeUOvsSs6g8$KE$BOt4jOw^QipsL zrle?7a`p*@DUgje7tK!@N(%QaQj#d)j4xq(7>3kmzoO56E!d>bJ}v1zFgyDV^h*&d z2^ko9oejV)FQc42im5KcT4A{7HUyJN!;>M)p%8paPp(bQKEp2O)6Yr$Cea%sIUFJd zqpHvTK-H47FT%HBz88hGC)L7aW z48a3;CP(nSJOmb@ExVhHxi5vFgB*ezpbzi`Ie|H>pov5P`Q!+cNS^FT@W`{>&^+1? z1yv>{~Bmq zp}E#XtC9>x6Ul>68*{TYA-6&y(L@h>IC~eIHhGYBLrh~oL1Y7^Nred)0Eg>hghb#n zC0dc$H9S^5=<49^FsdcS8pEw%c=aQQ z2JXuuS}jrL>kk<_3pv|ztV3mE(6Xm3_pB&m;2NbN&dMCV(upH2lka7O_?j1gkO_&* zg?tHYOm5~kIJ>M;bt5}=*tV|64-?&w|J!G-ydB^B@k^Tf`-%3B4vjwb;uZb-7cSrR zz-{r|C(nMnz;(Gckk0K4 zyEEQ9zYYEHdFWh!mcg8l>-l$p_7~T{*WFnoIJV@7e&!Yn{C;^2()~1wYv%j$o3Fjd zjo^mvF5n}8+r({MqOYj0pLO36`@-B5Kll_M#1x^shl*rK(Dq}OXhTjx?0ZMVe%cb{ zONeWYiG4NSOfQ1d-(L#`dPMy_bd{hJ?{N#LJ9!>SKN38>cph;7)?km_3ju5JE?=th z4`GLlw-Q1QU!M1#i@;agXXD;8B1^5#InPkwU4^Ho-s+dz;G2@%D}KJP#qPZbiSAAQ zdfC+{5{y>{b#{P%5`0B*Gk+S-2;9R-;++|Odr1bKy7(E4cj*qkhd?(3uZ_JsKR?y1 zl|jh>Bo&d?q&NcOUbALL0rO}Xul0q_yFE^}Dr@175M%r+g!AjZM%c%F(#_)uAqTC_ zwbHpZS|{oZKo8brN<0D0K(~Ld9#o*$zx36On~zNu4IJx~F_0 zV$ZsE!@=9%JTB{(%>MQn(`nzlDIVF#2Mzp2#(;p5)8AgPOB)=1F`adKru>zs2j^cK zvd&cIXkWX51D(PlTomwEKhYXQ8Aesui1F!Sp&MgseP|HoodB=jgt1Wz`5^ f*tpUkAs{^3{||l;%yCtcw(t)f{^Rriody0kTGMI& diff --git a/webapp-net/ciBuild.proj b/webapp-net/ciBuild.proj index 29ef778ac..92bd06ec4 100644 --- a/webapp-net/ciBuild.proj +++ b/webapp-net/ciBuild.proj @@ -27,7 +27,7 @@ $(JenkinsUrl)/job/DXA%20$(DxaBuildType)%20CI%20Web%20App%20.NET/lastSuccessfulBuild/artifact/Site/bin - "NuGet.exe" + NuGet.exe C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe From b59bd28d51b7f537cd86d6fbb93a72ad8f4972b4 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Tue, 5 Jun 2018 16:42:33 +0100 Subject: [PATCH 74/78] TSI-3285 : Fix responses to invalid api requests --- .../TridionDocsSearchController.cs | 98 ++++++++++--------- .../Controllers/TridionDocsApiController.cs | 97 +++++++++++++----- .../Providers/ConditionProvider.cs | 35 ++++--- .../Providers/PublicationProvider.cs | 3 +- 4 files changed, 149 insertions(+), 84 deletions(-) diff --git a/webapp-net/Search/Controllers/TridionDocsSearchController.cs b/webapp-net/Search/Controllers/TridionDocsSearchController.cs index b471fc082..801b6bcab 100644 --- a/webapp-net/Search/Controllers/TridionDocsSearchController.cs +++ b/webapp-net/Search/Controllers/TridionDocsSearchController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Web.Mvc; @@ -16,56 +17,65 @@ namespace Sdl.Web.Modules.Search.Controllers public class TridionDocsSearchController : BaseController { private static readonly Regex RegexpDoubleQuotes = new Regex("^\"(.*)\"$", RegexOptions.Compiled); - + [Route("~/api/search")] [HttpPost] public virtual ActionResult Search() { - Stream req = Request.InputStream; - req.Seek(0, System.IO.SeekOrigin.Begin); - string json = new StreamReader(req).ReadToEnd(); - - SearchParameters searchParams = JsonConvert.DeserializeObject(json); - - IQSearchClient search = new IQSearchClient(); - search.WithResultFilter(new SearchResultFilter - { - StartOfRange = searchParams.StartIndex, - EndOfRange = searchParams.StartIndex + searchParams.Count, - IsHighlightingEnabled = true - }); - var fields = new List(); - var values = new List(); - if (searchParams.PublicationId != null) + try { - fields.Add("publicationId"); - values.Add(new DefaultTermValue(searchParams.PublicationId.Value.ToString())); - } - fields.Add("dynamic.FISHDITADLVRREMOTESTATUS.lng.element"); - fields.Add($"content.{CultureInfo.GetCultureInfo(searchParams.Language).EnglishName.ToLower()}"); - values.Add(new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE")); + Stream req = Request.InputStream; + req.Seek(0, System.IO.SeekOrigin.Begin); + string json = new StreamReader(req).ReadToEnd(); - string searchQuery = searchParams.SearchQuery; - Match match = RegexpDoubleQuotes.Match(searchQuery); - if (match.Success) - { - searchQuery = match.Groups[1].Value; - } + SearchParameters searchParams = JsonConvert.DeserializeObject(json); - values.Add(new DefaultTermValue(searchQuery, TermTypes.Exact)); - var results = search.WithResultFilter(new SearchResultFilter - { - StartOfRange = searchParams.StartIndex, - EndOfRange = searchParams.StartIndex + searchParams.Count, - IsHighlightingEnabled = true - }).Search(new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd(fields, values).Compile()); - var resultSet = new SearchResultSetWrapped(results) + IQSearchClient search = + new IQSearchClient(); + search.WithResultFilter(new SearchResultFilter + { + StartOfRange = searchParams.StartIndex, + EndOfRange = searchParams.StartIndex + searchParams.Count, + IsHighlightingEnabled = true + }); + var fields = new List(); + var values = new List(); + if (searchParams.PublicationId != null) + { + fields.Add("publicationId"); + values.Add(new DefaultTermValue(searchParams.PublicationId.Value.ToString())); + } + fields.Add("dynamic.FISHDITADLVRREMOTESTATUS.lng.element"); + fields.Add($"content.{CultureInfo.GetCultureInfo(searchParams.Language).EnglishName.ToLower()}"); + values.Add(new DefaultTermValue("VDITADLVRREMOTESTATUSONLINE")); + + string searchQuery = searchParams.SearchQuery; + Match match = RegexpDoubleQuotes.Match(searchQuery); + if (match.Success) + { + searchQuery = match.Groups[1].Value; + } + + values.Add(new DefaultTermValue(searchQuery, TermTypes.Exact)); + var results = search.WithResultFilter(new SearchResultFilter + { + StartOfRange = searchParams.StartIndex, + EndOfRange = searchParams.StartIndex + searchParams.Count, + IsHighlightingEnabled = true + }).Search(new Delivery.IQQuery.Model.Search.SearchQuery().GroupedAnd(fields, values).Compile()); + var resultSet = new SearchResultSetWrapped(results) + { + Hits = results.Hits, + Count = searchParams.Count.Value, + StartIndex = searchParams.StartIndex.Value + }; + return Json(resultSet); + } + catch (Exception) { - Hits = results.Hits, - Count = searchParams.Count.Value, - StartIndex = searchParams.StartIndex.Value - }; - return Json(resultSet); - } + Response.StatusCode = 405; + return new EmptyResult(); + } + } } } diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index 46b96cb7e..1912502ce 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -62,27 +62,49 @@ public virtual ActionResult Page(int publicationId, int pageId, string condition [FormatData] public virtual ActionResult Binary(int publicationId, int binaryId) { - StaticContentItem content = TridionDocsContentProvider.GetStaticContentItem(binaryId, SetupLocalization(publicationId)); - return new FileStreamResult(content.GetContentStream(), content.ContentType); + try + { + StaticContentItem content = TridionDocsContentProvider.GetStaticContentItem(binaryId, + SetupLocalization(publicationId)); + return new FileStreamResult(content.GetContentStream(), content.ContentType); + } + catch (Exception ex) + { + return ServerError(ex); + } } [Route("~/api/publications")] [HttpGet] public virtual ActionResult Publications() { - PublicationProvider provider = new PublicationProvider(); - return Json(provider.PublicationList); + try + { + PublicationProvider provider = new PublicationProvider(); + return Json(provider.PublicationList); + } + catch (Exception ex) + { + return ServerError(ex); + } } [Route("~/api/conditions/{publicationId:int}")] public virtual ActionResult Conditions(int publicationId) { - return new ContentResult + try + { + return new ContentResult + { + ContentType = "application/json", + Content = new ConditionProvider().GetConditions(publicationId), + ContentEncoding = Encoding.UTF8 + }; + } + catch (Exception ex) { - ContentType = "application/json", - Content = new ConditionProvider().GetConditions(publicationId), - ContentEncoding = Encoding.UTF8 - }; + return ServerError(ex); + } } [Route("~/api/sitemap.xml")] @@ -95,37 +117,60 @@ public virtual ActionResult SitemapXml() [Route("~/api/toc/{publicationId:int}")] public virtual ActionResult RootToc(int publicationId, string conditions = "") { - SetupLocalization(publicationId); - if (!string.IsNullOrEmpty(conditions)) + try { - AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(conditions)) + { + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + } + TocProvider tocProvider = new TocProvider(); + return Json(tocProvider.GetToc(publicationId)); + } + catch (Exception ex) + { + return ServerError(ex); } - TocProvider tocProvider = new TocProvider(); - return Json(tocProvider.GetToc(publicationId)); } [Route("~/api/toc/{publicationId:int}/{sitemapItemId}")] - public virtual ActionResult Toc(int publicationId, string sitemapItemId, string conditions = "", bool includeAncestors = false) + public virtual ActionResult Toc(int publicationId, string sitemapItemId, string conditions = "", + bool includeAncestors = false) { - SetupLocalization(publicationId); - if (!string.IsNullOrEmpty(conditions)) + try { - AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(conditions)) + { + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + } + TocProvider tocProvider = new TocProvider(); + var sitemapItems = tocProvider.GetToc(publicationId, sitemapItemId, includeAncestors); + return Json(sitemapItems); + } + catch (Exception ex) + { + return ServerError(ex); } - TocProvider tocProvider = new TocProvider(); - var sitemapItems = tocProvider.GetToc(publicationId, sitemapItemId, includeAncestors); - return Json(sitemapItems); } [Route("~/api/pageIdByReference/{publicationId:int}/{ishFieldValue}")] public virtual ActionResult TopicIdInTargetPublication(int publicationId, string ishFieldValue) { - SetupLocalization(publicationId); - if (!string.IsNullOrEmpty(ishFieldValue)) + try { - throw new DxaItemNotFoundException("Unable to use empty 'ishlogicalref.object.id' value as a search criteria."); - } - return Json(TridionDocsContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); + SetupLocalization(publicationId); + if (!string.IsNullOrEmpty(ishFieldValue)) + { + throw new DxaItemNotFoundException( + "Unable to use empty 'ishlogicalref.object.id' value as a search criteria."); + } + return Json(TridionDocsContentProvider.GetPageIdByIshLogicalReference(publicationId, ishFieldValue)); + } + catch (Exception ex) + { + return ServerError(ex); + } } public ActionResult ServerError(Exception ex) diff --git a/webapp-net/TridionDocs/Providers/ConditionProvider.cs b/webapp-net/TridionDocs/Providers/ConditionProvider.cs index f5048396d..64d366fa4 100644 --- a/webapp-net/TridionDocs/Providers/ConditionProvider.cs +++ b/webapp-net/TridionDocs/Providers/ConditionProvider.cs @@ -1,6 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Newtonsoft.Json; -using Sdl.Web.Common; +using Sdl.Web.Modules.TridionDocs.Exceptions; using Tridion.ContentDelivery.Meta; namespace Sdl.Web.Modules.TridionDocs.Providers @@ -28,8 +29,10 @@ public string GetConditions(int publicationId) { var conditionUsed = GetMetadata(publicationId, ConditionUsed); var conditionMetadata = GetMetadata(publicationId, ConditionMetadata); - Dictionary d1 = JsonConvert.DeserializeObject>(conditionUsed); - Dictionary d2 = JsonConvert.DeserializeObject>(conditionMetadata); + Dictionary d1 = + JsonConvert.DeserializeObject>(conditionUsed); + Dictionary d2 = + JsonConvert.DeserializeObject>(conditionMetadata); foreach (var v in d1) { d2[v.Key].Values = v.Value; @@ -39,17 +42,25 @@ public string GetConditions(int publicationId) private string GetMetadata(int publicationId, string metadataName) { - PublicationMetaFactory factory = new PublicationMetaFactory(); - PublicationMeta meta = factory.GetMeta(publicationId); - if (meta?.CustomMeta == null) + try { - throw new DxaItemNotFoundException( + PublicationMetaFactory factory = new PublicationMetaFactory(); + PublicationMeta meta = factory.GetMeta(publicationId); + if (meta?.CustomMeta == null) + { + throw new TridionDocsApiException( + $"Metadata '{metadataName}' is not found for publication {publicationId}."); + } + + object metadata = meta.CustomMeta.GetFirstValue(metadataName); + string metadataString = metadata != null ? (string) metadata : "{}"; + return metadataString; + } + catch (Exception) + { + throw new TridionDocsApiException( $"Metadata '{metadataName}' is not found for publication {publicationId}."); } - - object metadata = meta.CustomMeta.GetFirstValue(metadataName); - string metadataString = metadata != null ? (string)metadata : "{}"; - return metadataString; } } } diff --git a/webapp-net/TridionDocs/Providers/PublicationProvider.cs b/webapp-net/TridionDocs/Providers/PublicationProvider.cs index 0017f59b7..45ab44b77 100644 --- a/webapp-net/TridionDocs/Providers/PublicationProvider.cs +++ b/webapp-net/TridionDocs/Providers/PublicationProvider.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Sdl.Web.Common; using Sdl.Web.Common.Logging; using Sdl.Web.Modules.TridionDocs.Models; using Tridion.ContentDelivery.Meta; @@ -70,7 +69,7 @@ public void CheckPublicationOnline(int publicationId) } if (meta == null || !IsPublicationOnline(meta)) { - throw new DxaException($"Unable to find publication {publicationId}"); + throw new TridionDocsApiException($"Unable to find publication {publicationId}"); } } From 08835528707b59d0151ddfa81631dfffb6c2e919 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Wed, 6 Jun 2018 15:12:22 +0100 Subject: [PATCH 75/78] TSI-3091 : Fixed unit tests for Ugc --- .../Controllers/TridionDocsApiController.cs | 10 ++ .../Ugc/Controllers/UgcApiController.cs | 127 ++++++++++++------ webapp-net/Ugc/Data/Comment.cs | 1 - webapp-net/Ugc/Data/PostedComment.cs | 4 +- webapp-net/Ugc/Data/PubIdTitleLang.cs | 2 +- webapp-net/Ugc/UgcService.cs | 14 +- 6 files changed, 105 insertions(+), 53 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index 1912502ce..e669370e9 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -74,6 +74,15 @@ public virtual ActionResult Binary(int publicationId, int binaryId) } } + [Route("~/binary/{publicationId}/{binaryId}")] + [Route("~/api/binary/{publicationId}/{binaryId}")] + [HttpGet] + [FormatData] + public virtual ActionResult Binary(string publicationId, string binaryId) + { + return ServerError(null); + } + [Route("~/api/publications")] [HttpGet] public virtual ActionResult Publications() @@ -176,6 +185,7 @@ public virtual ActionResult TopicIdInTargetPublication(int publicationId, string public ActionResult ServerError(Exception ex) { Response.StatusCode = 404; + if(ex == null) return new EmptyResult(); if (ex.InnerException != null) ex = ex.InnerException; return Content("{ \"Message\": \"" + ex.Message + "\" }", "application/json"); } diff --git a/webapp-net/Ugc/Controllers/UgcApiController.cs b/webapp-net/Ugc/Controllers/UgcApiController.cs index c00990e1b..bc4b3c52a 100644 --- a/webapp-net/Ugc/Controllers/UgcApiController.cs +++ b/webapp-net/Ugc/Controllers/UgcApiController.cs @@ -10,7 +10,6 @@ using Newtonsoft.Json.Serialization; using Sdl.Web.Modules.Ugc.Data; using Sdl.Web.Mvc.Configuration; -using Tridion.ContentDelivery.AmbientData; namespace Sdl.Web.Modules.Ugc.Controllers { @@ -18,21 +17,26 @@ namespace Sdl.Web.Modules.Ugc.Controllers /// Ugc Api Controller /// public class UgcApiController : BaseController - { + { [Route("{localization}/api/comments/{pageId:int}")] [Route("~/api/comments/{publicationId:int}/{pageId:int}")] [HttpGet] - public ActionResult GetComments(int? publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) - { - UgcService ugc = new UgcService(); + public ActionResult GetComments(int? publicationId, int pageId, bool descending = false, int[] status = null, + int top = 0, int skip = 0) + { + UgcService ugc = new UgcService(); var comments = ugc.GetComments( publicationId ?? int.Parse(WebRequestContext.Localization.Id), pageId, descending, status ?? new int[] {}, top, skip); + if(comments == null) + return ServerError(null); return new ContentResult { ContentType = "application/json", - Content = JsonConvert.SerializeObject(comments, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), + Content = + JsonConvert.SerializeObject(comments, + new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()}), ContentEncoding = Encoding.UTF8 }; } @@ -40,44 +44,53 @@ public ActionResult GetComments(int? publicationId, int pageId, bool descending [Route("~/api/comments/add")] [Route("{localization}/api/comments/add")] [HttpPost] - public ActionResult PostComment(int publicationId, int pageId, bool descending = false, int[] status = null, int top = 0, int skip = 0) + public ActionResult PostComment(int? publicationId, int? pageId, bool descending = false, int[] status = null, + int top = 0, int skip = 0) { - UgcService ugc = new UgcService(); - Stream req = Request.InputStream; - req.Seek(0, SeekOrigin.Begin); - string json = new StreamReader(req).ReadToEnd(); - PostedComment posted = JsonConvert.DeserializeObject(json); - Dictionary metadata = new Dictionary + try { - {"publicationTitle", "\""+Regex.Escape(posted.PublicationTitle)+"\""}, - {"publicationUrl", "\""+posted.PublicationUrl+"\""}, - {"itemTitle", "\""+Regex.Escape(posted.PageTitle)+"\""}, - {"itemUrl", "\""+posted.PageUrl+"\""}, - {"language", "\""+posted.Language+"\""}, - {"status", "0"} - }; + if (pageId == null || publicationId == null) + { + Response.StatusCode = 200; + return new EmptyResult(); + } + UgcService ugc = new UgcService(); + Stream req = Request.InputStream; + req.Seek(0, SeekOrigin.Begin); + string json = new StreamReader(req).ReadToEnd(); + PostedComment posted = JsonConvert.DeserializeObject(json); + Dictionary metadata = CreateMetadata(posted, true); - AddPubIdTitleLangToCommentMetadata(posted, metadata); + string userId = posted.Username; + if (string.IsNullOrEmpty(userId)) + { + userId = "Anonymous"; + } - string userId = posted.Username; - if (string.IsNullOrEmpty(userId)) - { - userId = "Anonymous"; - } - - Comment result = ugc.PostComment(posted.PublicationId, - posted.PageId, + Comment result = ugc.PostComment(posted.PublicationId, + posted.PageId.Value, userId, posted.Email, posted.Content, - posted.ParentId, + posted.ParentId ?? 0, metadata); - return new ContentResult + + if(result == null) + return ServerError(null); + result.Metadata = CreateMetadata(posted, false); + return new ContentResult + { + ContentType = "application/json", + Content = + JsonConvert.SerializeObject(result, + new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()}), + ContentEncoding = Encoding.UTF8 + }; + } + catch (Exception ex) { - ContentType = "application/json", - Content = JsonConvert.SerializeObject(result, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), - ContentEncoding = Encoding.UTF8 - }; + return ServerError(ex); + } } [Route("~/api/comments/upvote")] @@ -106,16 +119,46 @@ public async Task RemoveComment(int commentId) await ugc.RemoveComment(commentId); return Redirect(Request.UrlReferrer?.AbsolutePath); } - - private static void AddPubIdTitleLangToCommentMetadata(PostedComment comment, Dictionary metadata) + + private static Dictionary CreateMetadata(PostedComment posted, bool escape) { - PubIdTitleLang pubIdTitleLang = new PubIdTitleLang + string pubTitle = posted.PublicationTitle; + string pubUrl = posted.PublicationUrl; + string itemTitle = posted.PageTitle; + string pageUrl = posted.PageUrl; + string lang = posted.Language; + + if (escape) + { + pubTitle = $"\"{Regex.Escape(pubTitle)}\""; + pubUrl = $"\"{pubUrl}\""; + pageUrl = $"\"{pageUrl}\""; + itemTitle = $"\"{itemTitle}\""; + lang = $"\"{lang}\""; + } + + var metadata = new Dictionary { - Id = comment.PublicationId, - Lang = comment.Language, - Title = comment.PublicationTitle + {"publicationTitle", pubTitle}, + {"publicationUrl", pubUrl}, + {"itemTitle", itemTitle}, + {"itemUrl", pageUrl}, + {"language", lang}, + {"status", "0"} }; - metadata.Add("pubIdTitleLang", JsonConvert.SerializeObject(pubIdTitleLang)); + metadata.Add("pubIdTitleLang", $"{{\"id\":{posted.PublicationId},\"title\":\"{posted.PublicationTitle}\",\"lang\":\"{posted.Language}\"}}"); + return metadata; + } + + public ActionResult ServerError(Exception ex) + { + Response.StatusCode = 405; + if (ex == null) + { + return new EmptyResult(); + } + if (ex.InnerException != null) ex = ex.InnerException; + return Content("{ \"Message\": \"" + ex.Message + "\" }", "application/json"); } } } diff --git a/webapp-net/Ugc/Data/Comment.cs b/webapp-net/Ugc/Data/Comment.cs index 4052293be..54c6b7367 100644 --- a/webapp-net/Ugc/Data/Comment.cs +++ b/webapp-net/Ugc/Data/Comment.cs @@ -23,7 +23,6 @@ public class Comment [JsonIgnore] public int Rating { get; set; } = 0; - [JsonIgnore] public Dictionary Metadata { get; set; } = new Dictionary(); } diff --git a/webapp-net/Ugc/Data/PostedComment.cs b/webapp-net/Ugc/Data/PostedComment.cs index a15ca1694..c1fcf4a51 100644 --- a/webapp-net/Ugc/Data/PostedComment.cs +++ b/webapp-net/Ugc/Data/PostedComment.cs @@ -7,7 +7,7 @@ public class PostedComment { public int PublicationId { get; set; } - public int PageId { get; set; } + public int? PageId { get; set; } public string Username { get; set; } @@ -15,7 +15,7 @@ public class PostedComment public string Content { get; set; } - public int ParentId { get; set; } = 0; + public int? ParentId { get; set; } = 0; public string PublicationTitle { get; set; } diff --git a/webapp-net/Ugc/Data/PubIdTitleLang.cs b/webapp-net/Ugc/Data/PubIdTitleLang.cs index 35f42f496..77c35d2c1 100644 --- a/webapp-net/Ugc/Data/PubIdTitleLang.cs +++ b/webapp-net/Ugc/Data/PubIdTitleLang.cs @@ -2,7 +2,7 @@ { public class PubIdTitleLang { - public int Id { get; set; } + public string Id { get; set; } public string Title { get; set; } public string Lang { get; set; } } diff --git a/webapp-net/Ugc/UgcService.cs b/webapp-net/Ugc/UgcService.cs index 60a251a05..2816c75b1 100644 --- a/webapp-net/Ugc/UgcService.cs +++ b/webapp-net/Ugc/UgcService.cs @@ -26,17 +26,17 @@ public UgcService() { _api = UgcInstanceProvider.Instance.UgcCommunityClient(); _votingApi = (IUgcVoteCommentApi) _api; - } + } public List GetComments(int publicationId, int pageId, bool descending, int[] status, int top, int skip) - { + { SimpleCommentsFilter filter = new SimpleCommentsFilter { Top = top, Skip = skip, Depth = MaximumThreadsDepth, - Statuses = new List(new List(status).Select(x => (Status)x)) - }; + Statuses = new List(new List(status).Select(x => (Status) x)) + }; return Convert(_api.RetrieveThreadedComments(CreateUri(publicationId, pageId), filter, descending, true)); } @@ -74,7 +74,7 @@ private static CmUri CreateUri(int publicationId, int pageId) return CmUri.Create(localization.CmUriScheme, publicationId, pageId, ItemType.Page); } - private static List Convert(IEnumerable comments) + private static List Convert(IEnumerable comments) => comments?.Select(Convert).ToList(); private static Comment Convert(IComment comment) @@ -114,7 +114,7 @@ private static Comment Convert(IComment comment) private static Dictionary Convert(List meta) { var metadata = new Dictionary(); - if(meta == null) return metadata; + if (meta == null) return metadata; foreach (var m in meta.Where(m => !metadata.ContainsKey(m.KeyName))) { metadata.Add(m.KeyName, m.KeyValue); @@ -133,7 +133,7 @@ private static Comment Convert(IComment comment) private static CommentDate Convert(DateTime dt) => new CommentDate { DateTime = dt, - DayOfMonth = dt.Month, + DayOfMonth = dt.Month, DayOfWeek = dt.DayOfWeek.ToString(), DayOfYear = dt.DayOfYear, Month = new DateTimeFormatInfo().GetMonthName(dt.Month), From b5eb46394238f583725937c44a61f97700e810f7 Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 7 Jun 2018 09:52:14 +0100 Subject: [PATCH 76/78] TSI-3091 : Fix more unit tests --- .../Controllers/TridionDocsApiController.cs | 50 +++++++++++++------ .../Exceptions/TridionDocsApiException.cs | 4 ++ .../TridionDocsNavigationProvider.cs | 22 +++++++- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index e669370e9..b8c5b0fab 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -7,7 +7,10 @@ using Sdl.Web.Mvc.Configuration; using Sdl.Web.Mvc.Formats; using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; using Sdl.Web.Common.Logging; +using Sdl.Web.Modules.TridionDocs.Exceptions; namespace Sdl.Web.Modules.TridionDocs.Controllers { @@ -17,7 +20,7 @@ namespace Sdl.Web.Modules.TridionDocs.Controllers public class TridionDocsApiController : BaseController { private static readonly Uri UserConditionsUri = new Uri("taf:ish:userconditions"); - + [Route("~/api/page/{publicationId:int}/{pageId:int}")] [HttpGet] public virtual ActionResult Page(int publicationId, int pageId) @@ -31,19 +34,27 @@ public virtual ActionResult Page(int publicationId, int pageId) catch(Exception ex) { Log.Error(ex); - return ServerError(ex); + return ServerError(new TridionDocsApiException($"Page not found: [{publicationId}] {pageId}/index.html")); } } + [Route("~/api/page/{publicationId}/{pageId}")] + [HttpGet] + public virtual ActionResult Page(string publicationId, string pageId) + { + return ServerError(new TridionDocsApiException($"Page not found: [{publicationId}] {pageId}/index.html"), 400); + } + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] [HttpPost] public virtual ActionResult Page(int publicationId, int pageId, string conditions) { try { - if (!string.IsNullOrEmpty(conditions)) + string c = Request.QueryString["conditions"]; + if (!string.IsNullOrEmpty(c)) { - AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, c); } PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); WebRequestContext.PageModel = model; @@ -80,7 +91,7 @@ public virtual ActionResult Binary(int publicationId, int binaryId) [FormatData] public virtual ActionResult Binary(string publicationId, string binaryId) { - return ServerError(null); + return ServerError(null, 400); } [Route("~/api/publications")] @@ -90,7 +101,7 @@ public virtual ActionResult Publications() try { PublicationProvider provider = new PublicationProvider(); - return Json(provider.PublicationList); + return JsonResult(provider.PublicationList); } catch (Exception ex) { @@ -103,12 +114,7 @@ public virtual ActionResult Conditions(int publicationId) { try { - return new ContentResult - { - ContentType = "application/json", - Content = new ConditionProvider().GetConditions(publicationId), - ContentEncoding = Encoding.UTF8 - }; + return JsonResult(new ConditionProvider().GetConditions(publicationId)); } catch (Exception ex) { @@ -163,6 +169,12 @@ public virtual ActionResult RootToc(int publicationId, string conditions = "") } } + [Route("~/api/toc/{publicationId}/{sitemapItemId}")] + public virtual ActionResult Toc(string publicationId, string sitemapItemId) + { + return ServerError(null, 400); + } + [Route("~/api/pageIdByReference/{publicationId:int}/{ishFieldValue}")] public virtual ActionResult TopicIdInTargetPublication(int publicationId, string ishFieldValue) { @@ -182,12 +194,22 @@ public virtual ActionResult TopicIdInTargetPublication(int publicationId, string } } - public ActionResult ServerError(Exception ex) + public ActionResult ServerError(Exception ex, int statusCode = 404) { - Response.StatusCode = 404; + Response.StatusCode = statusCode; if(ex == null) return new EmptyResult(); if (ex.InnerException != null) ex = ex.InnerException; return Content("{ \"Message\": \"" + ex.Message + "\" }", "application/json"); } + + private ContentResult JsonResult(object result) + { + return new ContentResult + { + ContentType = "application/json", + Content = JsonConvert.SerializeObject(result, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-ddThh:mm:ssZ" }), + ContentEncoding = Encoding.UTF8 + }; + } } } diff --git a/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs b/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs index fa5922ff2..f79a2cbd3 100644 --- a/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs +++ b/webapp-net/TridionDocs/Exceptions/TridionDocsApiException.cs @@ -7,6 +7,10 @@ namespace Sdl.Web.Modules.TridionDocs.Exceptions /// public class TridionDocsApiException : Exception { + public TridionDocsApiException() + { + } + public TridionDocsApiException(string msg) : base(msg) { } diff --git a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs index 452a5ab2f..692481f30 100644 --- a/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs +++ b/webapp-net/TridionDocs/Navigation/TridionDocsNavigationProvider.cs @@ -10,6 +10,7 @@ using Tridion.ContentDelivery.Meta; using Tridion.ContentDelivery.Taxonomies; using System.Text.RegularExpressions; +using Sdl.Web.Modules.TridionDocs.Exceptions; namespace Sdl.Web.Modules.TridionDocs.Navigation { @@ -45,11 +46,28 @@ protected override TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLe if (ishRefUri != null) { var ish = CmUri.FromString(ishRefUri); - node.Url = $"{GetBaseUrl().TrimEnd('/')}/{ish.PublicationId}/{ish.ItemId}"; + node.Url = $"/{ish.PublicationId}/{ish.ItemId}"; } + node.Visible = true; return node; } + protected override IEnumerable ExpandDescendants(string keywordUri, string taxonomyUri, + NavigationFilter filter, ILocalization localization) + { + TaxonomyFactory taxonomyFactory = new TaxonomyFactory(); + TaxonomyFilter taxonomyFilter = new DepthFilter(filter.DescendantLevels, DepthFilter.FilterDown); + Keyword contextKeyword = taxonomyFactory.GetTaxonomyKeywords(taxonomyUri, taxonomyFilter, keywordUri); + if (contextKeyword == null) + { + throw new TridionDocsApiException(); + } + + TaxonomyNode contextTaxonomyNode = CreateTaxonomyNode(contextKeyword, filter.DescendantLevels, filter, + localization); + return contextTaxonomyNode.Items; + } + protected override SitemapItem[] ExpandClassifiedPages(Keyword keyword, string taxonomyId, ILocalization localization) => new SitemapItem[] {}; @@ -68,6 +86,6 @@ public SitemapItem SiteMap } return root; } - } + } } } From 8217f5303001506be1f203d38670a7894049ce0c Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Thu, 7 Jun 2018 11:03:05 +0100 Subject: [PATCH 77/78] TSI-3091 : fix --- .../Controllers/TridionDocsApiController.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs index b8c5b0fab..fc0f6adac 100644 --- a/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs +++ b/webapp-net/TridionDocs/Controllers/TridionDocsApiController.cs @@ -45,16 +45,16 @@ public virtual ActionResult Page(string publicationId, string pageId) return ServerError(new TridionDocsApiException($"Page not found: [{publicationId}] {pageId}/index.html"), 400); } - [Route("~/api/page/{publicationId:int}/{pageId:int}/{*conditions}")] + [Route("~/api/page/{publicationId:int}/{pageId:int}/{*content}")] [HttpPost] - public virtual ActionResult Page(int publicationId, int pageId, string conditions) + public virtual ActionResult Page(int publicationId, int pageId, string content) { try { - string c = Request.QueryString["conditions"]; - if (!string.IsNullOrEmpty(c)) + string conditions = Request.QueryString["conditions"]; + if (!string.IsNullOrEmpty(conditions)) { - AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, c); + AmbientDataContext.CurrentClaimStore.Put(UserConditionsUri, conditions); } PageModel model = TridionDocsContentProvider.GetPageModel(pageId, SetupLocalization(publicationId)); WebRequestContext.PageModel = model; @@ -114,7 +114,12 @@ public virtual ActionResult Conditions(int publicationId) { try { - return JsonResult(new ConditionProvider().GetConditions(publicationId)); + return new ContentResult + { + ContentType = "application/json", + Content = new ConditionProvider().GetConditions(publicationId), + ContentEncoding = Encoding.UTF8 + }; } catch (Exception ex) { From e835e4f594a79462478fd4976ff27083a335bcbd Mon Sep 17 00:00:00 2001 From: Paul Adams Date: Fri, 8 Jun 2018 08:36:54 +0100 Subject: [PATCH 78/78] TSI-3302 : Turn off caching when sending requests with conditions --- webapp-net/TridionDocs/Providers/TocProvider.cs | 7 ++++++- .../TridionDocs/Providers/TridionDocsContentProvider.cs | 6 ++++++ webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/webapp-net/TridionDocs/Providers/TocProvider.cs b/webapp-net/TridionDocs/Providers/TocProvider.cs index 85ac4c9fa..10579f2e3 100644 --- a/webapp-net/TridionDocs/Providers/TocProvider.cs +++ b/webapp-net/TridionDocs/Providers/TocProvider.cs @@ -3,6 +3,7 @@ using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; using Sdl.Web.Common.Models.Navigation; +using Sdl.Web.Delivery.Service; using Sdl.Web.Mvc.Configuration; namespace Sdl.Web.Modules.TridionDocs.Providers @@ -24,6 +25,8 @@ public IEnumerable GetToc(int publicationId, string sitemapItemId, public IEnumerable GetToc(int publicationId, string sitemapItemId, bool includeAncestors, int descendantLevels) { + bool caching = ServiceCacheProvider.Instance.DisableCaching; + ServiceCacheProvider.Instance.DisableCaching = true; IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; NavigationFilter navigationFilter = new NavigationFilter { @@ -34,7 +37,9 @@ public IEnumerable GetToc(int publicationId, string sitemapItemId, ILocalization localization = WebRequestContext.Localization; localization.Id = publicationId.ToString(); - return onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization); + var result = onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization); + ServiceCacheProvider.Instance.DisableCaching = caching; + return result; } } } diff --git a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs index f5bfdfa84..0101b94c4 100644 --- a/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs +++ b/webapp-net/TridionDocs/Providers/TridionDocsContentProvider.cs @@ -4,6 +4,7 @@ using Sdl.Web.Common; using Sdl.Web.Common.Interfaces; using Sdl.Web.Common.Models; +using Sdl.Web.Delivery.Service; using Sdl.Web.Modules.TridionDocs.Exceptions; using Sdl.Web.Tridion.Mapping; using Tridion.ContentDelivery.DynamicContent.Query; @@ -48,6 +49,9 @@ public Category[] GetCategories() public override PageModel GetPageModel(int pageId, ILocalization localization, bool addIncludes = true) { + bool caching = ServiceCacheProvider.Instance.DisableCaching; + ServiceCacheProvider.Instance.DisableCaching = true; + PageModel pageModel = base.GetPageModel(pageId, localization, addIncludes); if (pageModel != null) { @@ -84,6 +88,8 @@ public override PageModel GetPageModel(int pageId, ILocalization localization, b } } } + + ServiceCacheProvider.Instance.DisableCaching = caching; return pageModel; } diff --git a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj index cb8f55e1e..8bd3207e0 100644 --- a/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj +++ b/webapp-net/TridionDocs/Sdl.Web.Modules.TridionDocs.csproj @@ -47,6 +47,10 @@ False ..\packages\Sdl.Dxa.Framework.Web8.$(DxaFrameworkVersion)\\lib\net452\Sdl.Web.DataModel.dll + + False + ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.Service.dll + False ..\packages\Sdl.Web.Delivery.$(SdlDeliveryVersion)\lib\net452\Sdl.Web.Delivery.ServicesCore.dll