diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 3e1ad7e..750f33e 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -23,7 +23,23 @@ "Bash(dotnet tool run dotnet-ef:*)", "Bash(dotnet tool:*)", "Bash(dotnet --list-sdks:*)", - "Bash(dotnet nuget:*)" + "Bash(dotnet nuget:*)", + "Bash(Get-ChildItem -Path \"c:\\\\Development\\\\Playroom\\\\OptiGraphExtensions\" -Recurse -Directory)", + "Bash(Select-Object -ExpandProperty FullName)", + "Bash(Sort-Object)", + "WebFetch(domain:world.optimizely.com)", + "WebFetch(domain:support.optimizely.com)", + "Bash(curl -s \"https://api.nuget.optimizely.com/v3-flatcontainer/episerver.cms.ui.core/index.json\")", + "Bash(curl -s \"https://api.nuget.optimizely.com/v3-flatcontainer/episerver.cms/index.json\")", + "Bash(curl -s \"https://api.nuget.optimizely.com/v3-flatcontainer/optimizely.contentgraph.cms/index.json\")", + "Bash(curl -v \"https://api.nuget.optimizely.com/v3-flatcontainer/episerver.cms.ui.core/index.json\")", + "Bash(curl -sL \"https://nuget.optimizely.com/v3-flatcontainer/episerver.cms.ui.core/index.json\")", + "Bash(curl -sLv \"https://nuget.optimizely.com/v3-flatcontainer/episerver.cms.ui.core/index.json\")", + "Bash(dotnet package *)", + "Bash(curl -sL \"https://api.nuget.optimizely.com/v3/registration5-semver1/episerver.cms/index.json\")", + "Bash(find ~/.nuget/packages/episerver.framework -name \"ScheduledJobAttribute.cs\" 2>/dev/null | head -3)", + "Read(//c/Users/GrahamCarr/.nuget/packages/episerver.framework/**)", + "Bash(powershell -NoProfile -Command '& { Add-Type -Path '\\\\''EPiServer.Framework.dll'\\\\'' -ErrorAction SilentlyContinue; [System.Reflection.Assembly]::LoadFrom\\('\\\\''__TRACKED_VAR__/EPiServer.Framework.dll'\\\\''\\).GetTypes\\(\\) | Where-Object { $_.FullName -like '\\\\''*ScheduledJob*'\\\\'' -or $_.FullName -like '\\\\''*ScheduledPlugIn*'\\\\'' } | Select-Object FullName }')" ], "deny": [], "ask": [] diff --git a/CLAUDE.md b/CLAUDE.md index 1aea4eb..591af3f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview -This is an Optimizely CMS 12 AddOn package called OptiGraphExtensions that provides management of synonyms, pinned results, webhooks, query library, request logs, and custom data sources within Optimizely Graph. The project consists of the main library and a sample CMS implementation. +This is an Optimizely CMS 13 AddOn package called OptiGraphExtensions that provides management of synonyms, pinned results, webhooks, query library, request logs, and custom data sources within Optimizely Graph. The project consists of the main library and a sample CMS implementation. Targets .NET 10. ## Development Commands @@ -46,7 +46,7 @@ The project is configured to automatically generate NuGet packages on build (`Ge ### Project Structure - **src/OptiGraphExtensions/**: Main AddOn library - **src/OptiGraphExtensions.Tests/**: NUnit test project -- **Sample/SampleCms/**: Example Optimizely CMS 12 implementation demonstrating the AddOn +- **Sample/SampleCms/**: Example Optimizely CMS 13 implementation demonstrating the AddOn ### Key Components @@ -343,9 +343,9 @@ The project is configured to automatically generate NuGet packages on build (`Ge - NdJSON format: action line + data line pairs ### Dependencies -- .NET 8.0 target framework -- Optimizely CMS 12 (EPiServer.CMS.UI.Core 12.23.0) -- Entity Framework Core 8.0.19 with SQL Server provider +- .NET 10.0 target framework +- Optimizely CMS 13 (EPiServer.Cms.UI.Core 13.0.2) +- Entity Framework Core 10.0.7 with SQL Server provider - NUnit for testing with Moq framework for mocking - System.ComponentModel.Annotations for validation attributes diff --git a/README.md b/README.md index 4f01288..a7b7cd8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # OptiGraphExtensions -An Optimizely CMS 12 AddOn that provides comprehensive management of synonyms, pinned results, webhooks, saved queries, request logs, and custom data sources within Optimizely Graph. This package enables content editors and administrators to enhance search experiences through intelligent synonym mapping, result pinning capabilities, webhook event management, GraphQL query building, API monitoring, and external data integration. +An Optimizely CMS 13 AddOn that provides comprehensive management of synonyms, pinned results, webhooks, saved queries, request logs, and custom data sources within Optimizely Graph. This package enables content editors and administrators to enhance search experiences through intelligent synonym mapping, result pinning capabilities, webhook event management, GraphQL query building, API monitoring, and external data integration. [![NuGet Version](https://img.shields.io/nuget/v/OptiGraphExtensions.svg)](https://www.nuget.org/packages/OptiGraphExtensions/) -[![.NET 8.0](https://img.shields.io/badge/.NET-8.0-purple.svg)](https://dotnet.microsoft.com/download/dotnet/8.0) -[![Optimizely CMS 12](https://img.shields.io/badge/Optimizely%20CMS-12-blue.svg)](https://docs.developers.optimizely.com/content-management-system/v12.0.0-cms/) +[![.NET 10.0](https://img.shields.io/badge/.NET-10.0-purple.svg)](https://dotnet.microsoft.com/download/dotnet/10.0) +[![Optimizely CMS 13](https://img.shields.io/badge/Optimizely%20CMS-13-blue.svg)](https://docs.developers.optimizely.com/content-management-system/v13.0.0-CMS/) + +> **Note:** Version 7.x targets Optimizely CMS 13 / .NET 10. If you are still on CMS 12, use version 6.x of this package. ## Key Features @@ -140,7 +142,7 @@ An Optimizely CMS 12 AddOn that provides comprehensive management of synonyms, p ### Installation -Install the NuGet package in your Optimizely CMS 12 project: +Install the NuGet package in your Optimizely CMS 13 project: ```bash dotnet add package OptiGraphExtensions @@ -176,7 +178,7 @@ app.UseEndpoints(endpoints => }); ``` -Add your Graph instance configuration to appsettings.json, this information can be found within PaaSPortal for a PaaS instance of Optimizely CMS12 and within the dashboard of a SaaS instance of Optimizely CMS 12 +Add your Graph instance configuration to appsettings.json, this information can be found within PaaSPortal for a PaaS instance of Optimizely CMS 13 and within the dashboard of a SaaS instance of Optimizely CMS 13 ```csharp "Optimizely": { @@ -277,9 +279,9 @@ src/ ## Development ### Prerequisites -- .NET 8.0 SDK +- .NET 10.0 SDK - SQL Server or SQL Server Express -- Optimizely CMS 12 development environment +- Optimizely CMS 13 development environment ### Building the Project @@ -553,9 +555,9 @@ The project includes comprehensive NUnit tests covering: ## Dependencies -- .NET 8.0 -- Optimizely CMS 12 (EPiServer.CMS.UI.Core 12.23.0) -- Entity Framework Core 8.0.19 with SQL Server provider +- .NET 10.0 +- Optimizely CMS 13 (EPiServer.Cms.UI.Core 13.0.2) +- Entity Framework Core 10.0.7 with SQL Server provider - Microsoft.Extensions.Caching.Memory for caching - Microsoft.Extensions.Http for connection pooling - NUnit 3.14.0 for testing diff --git a/Sample/SampleCms/Features/Home/HomePage.cs b/Sample/SampleCms/Features/Home/HomePage.cs index bfc9ead..9b03365 100644 --- a/Sample/SampleCms/Features/Home/HomePage.cs +++ b/Sample/SampleCms/Features/Home/HomePage.cs @@ -45,5 +45,5 @@ public class HomePage : SitePageData GroupName = SystemTabNames.Settings, Order = 1000)] [AllowedTypes(typeof(SiteSettingsPage))] - public virtual PageReference? SiteSettings { get; set; } + public virtual ContentReference? SiteSettings { get; set; } } diff --git a/Sample/SampleCms/SampleCms.csproj b/Sample/SampleCms/SampleCms.csproj index aac0508..24e4786 100644 --- a/Sample/SampleCms/SampleCms.csproj +++ b/Sample/SampleCms/SampleCms.csproj @@ -1,8 +1,10 @@ - + - net8.0 + net10.0 enable enable + true + 681c02de-100c-43e0-9d30-cd484506c868 @@ -11,30 +13,29 @@ - + - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + - + - + - + diff --git a/Sample/SampleCms/Startup.cs b/Sample/SampleCms/Startup.cs index 690b6ca..5aed5e4 100644 --- a/Sample/SampleCms/Startup.cs +++ b/Sample/SampleCms/Startup.cs @@ -1,20 +1,18 @@ using EPiServer.Cms.Shell; using EPiServer.Cms.Shell.UI; using EPiServer.Cms.UI.AspNetIdentity; -using EPiServer.ContentApi.Core.DependencyInjection; +using EPiServer.Cms.UI.VisitorGroups; +using EPiServer.Data; using EPiServer.DependencyInjection; using EPiServer.Scheduler; using EPiServer.ServiceLocation; using EPiServer.Web.Routing; -using Geta.Optimizely.Sitemaps; +using Optimizely.Graph.DependencyInjection; using OptiGraphExtensions.Common; using OptiGraphExtensions.Features.Configuration; -using Stott.Optimizely.RobotsHandler.Configuration; -using Stott.Security.Optimizely.Features.Configuration; - namespace SampleCms; public class Startup @@ -35,33 +33,21 @@ public void ConfigureServices(IServiceCollection services) services.Configure(options => options.Enabled = false); } + services.Configure(options => + { + options.UpdateDatabaseCompatibilityLevel = true; + }); + services.AddCmsAspNetIdentity() .AddCms() + .AddVisitorGroupsUI() .AddAdminUserRegistration(x => x.Behavior = RegisterAdminUserBehaviors.Enabled | RegisterAdminUserBehaviors.LocalRequestsOnly) .AddEmbeddedLocalization(); services.AddServerSideBlazor(); - services.AddSitemaps(x => - { - x.EnableRealtimeSitemap = false; - x.EnableRealtimeCaching = true; - x.RealtimeCacheExpirationInMinutes = 60; - }); - - services.ConfigureContentApiOptions(o => - { - o.IncludeInternalContentRoots = true; - o.IncludeSiteHosts = true; - // o.EnablePreviewFeatures = true; // optional - }); - - services.AddContentDeliveryApi(); - services.AddContentGraph(); - services.AddStottSecurity(); - services.AddRobotsHandler(); services.AddOptiGraphExtensions(optiGraphExtensionsSetupOptions => { optiGraphExtensionsSetupOptions.ConnectionStringName = "EPiServerDB"; @@ -87,7 +73,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseAuthentication(); app.UseAuthorization(); - app.UseStottSecurity(); app.UseOptiGraphExtensions(); app.UseEndpoints(endpoints => diff --git a/Sample/SampleCms/modules/_protected/CMS/CMS.zip b/Sample/SampleCms/modules/_protected/CMS/CMS.zip index f11580a..bfb046a 100644 Binary files a/Sample/SampleCms/modules/_protected/CMS/CMS.zip and b/Sample/SampleCms/modules/_protected/CMS/CMS.zip differ diff --git a/Sample/SampleCms/modules/_protected/Graph/Graph.zip b/Sample/SampleCms/modules/_protected/Graph/Graph.zip new file mode 100644 index 0000000..fa29b08 Binary files /dev/null and b/Sample/SampleCms/modules/_protected/Graph/Graph.zip differ diff --git a/Sample/SampleCms/modules/_protected/Profile/Profile.zip b/Sample/SampleCms/modules/_protected/Profile/Profile.zip new file mode 100644 index 0000000..330ad35 Binary files /dev/null and b/Sample/SampleCms/modules/_protected/Profile/Profile.zip differ diff --git a/Sample/SampleCms/modules/_protected/Settings/Settings.zip b/Sample/SampleCms/modules/_protected/Settings/Settings.zip new file mode 100644 index 0000000..5f7fd0f Binary files /dev/null and b/Sample/SampleCms/modules/_protected/Settings/Settings.zip differ diff --git a/Sample/SampleCms/modules/_protected/Shell/Shell.zip b/Sample/SampleCms/modules/_protected/Shell/Shell.zip index bcab586..161da93 100644 Binary files a/Sample/SampleCms/modules/_protected/Shell/Shell.zip and b/Sample/SampleCms/modules/_protected/Shell/Shell.zip differ diff --git a/Sample/SampleCms/modules/_protected/TinyMce/TinyMce.zip b/Sample/SampleCms/modules/_protected/TinyMce/TinyMce.zip new file mode 100644 index 0000000..b22879a Binary files /dev/null and b/Sample/SampleCms/modules/_protected/TinyMce/TinyMce.zip differ diff --git a/Sample/SampleCms/modules/_protected/VisitorGroups/VisitorGroups.zip b/Sample/SampleCms/modules/_protected/VisitorGroups/VisitorGroups.zip new file mode 100644 index 0000000..cddbb35 Binary files /dev/null and b/Sample/SampleCms/modules/_protected/VisitorGroups/VisitorGroups.zip differ diff --git a/global.json b/global.json index 1bdb496..512142d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.417", + "version": "10.0.100", "rollForward": "latestFeature" } } diff --git a/src/OptiGraphExtensions.Tests/OptiGraphExtensions.Tests.csproj b/src/OptiGraphExtensions.Tests/OptiGraphExtensions.Tests.csproj index a943ebd..4729dfa 100644 --- a/src/OptiGraphExtensions.Tests/OptiGraphExtensions.Tests.csproj +++ b/src/OptiGraphExtensions.Tests/OptiGraphExtensions.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable @@ -11,8 +11,8 @@ - - + + diff --git a/src/OptiGraphExtensions/Features/CustomData/ScheduledJobs/ExternalDataImportScheduledJob.cs b/src/OptiGraphExtensions/Features/CustomData/ScheduledJobs/ExternalDataImportScheduledJob.cs index 4da6674..da2a832 100644 --- a/src/OptiGraphExtensions/Features/CustomData/ScheduledJobs/ExternalDataImportScheduledJob.cs +++ b/src/OptiGraphExtensions/Features/CustomData/ScheduledJobs/ExternalDataImportScheduledJob.cs @@ -1,5 +1,4 @@ using System.Text.Json; -using EPiServer.PlugIn; using EPiServer.Scheduler; using EPiServer.ServiceLocation; using Microsoft.Extensions.Logging; @@ -14,11 +13,10 @@ namespace OptiGraphExtensions.Features.CustomData.ScheduledJobs /// Scheduled job that executes due import configurations. /// Runs at configurable intervals and processes all imports that are scheduled to run. /// - [ScheduledPlugIn( + [ScheduledJob( DisplayName = "External Data Import", Description = "Executes scheduled external data imports for custom data sources. Configure individual import schedules in the Custom Data Management UI.", - GUID = "A1B2C3D4-E5F6-7890-ABCD-EF1234567890", - SortIndex = 1000)] + GUID = "A1B2C3D4-E5F6-7890-ABCD-EF1234567890")] public class ExternalDataImportScheduledJob : ScheduledJobBase { private bool _stopSignaled; diff --git a/src/OptiGraphExtensions/OptiGraphExtensions.csproj b/src/OptiGraphExtensions/OptiGraphExtensions.csproj index 2862bcd..bf980ff 100644 --- a/src/OptiGraphExtensions/OptiGraphExtensions.csproj +++ b/src/OptiGraphExtensions/OptiGraphExtensions.csproj @@ -1,13 +1,13 @@  - net6.0;net8.0 + net10.0 enable enable true Opti Graph Extensions - 6.0.0 - + 7.0.0 + Upgraded to Optimizely CMS 13 / .NET 10. Dropped support for CMS 12. git Optimizely;Graph https://github.com/adayinthelifeofapro/OptiGraphExtensions @@ -15,8 +15,8 @@ README.md Graham Carr 2026 An Optimizely CMS package that allows the management of synonyms, pinned results, webhooks, request logs, creation and export of queries and custom data sources all within Optimizely Graph - 6.0.0 - 6.0.0 + 7.0.0 + 7.0.0 True LICENSE True @@ -47,25 +47,16 @@ - + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/OptiGraphExtensions/Views/Shared/Layouts/_LayoutBlazorAdminPage.cshtml b/src/OptiGraphExtensions/Views/Shared/Layouts/_LayoutBlazorAdminPage.cshtml index a0f2b97..4fd3fda 100644 --- a/src/OptiGraphExtensions/Views/Shared/Layouts/_LayoutBlazorAdminPage.cshtml +++ b/src/OptiGraphExtensions/Views/Shared/Layouts/_LayoutBlazorAdminPage.cshtml @@ -1,5 +1,5 @@ @using EPiServer.Framework.Web.Resources -@using EPiServer.Shell.Navigation +@addTagHelper *, EPiServer.Shell.UI @@ -10,7 +10,7 @@ @ClientResources.RenderResources("ShellCoreLightTheme") - +