From d109822f3fb60d6a17619d20ea237e57183f1e51 Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Wed, 13 May 2026 12:25:13 +0200 Subject: [PATCH 1/8] new endpoints for validation on navigation --- .../Controllers/AppDevelopmentController.cs | 62 +++++++++++++++++++ .../GitRepository/AltinnAppGitRepository.cs | 27 +++++++- .../Implementation/AppDevelopmentService.cs | 37 +++++++++++ .../Interfaces/IAppDevelopmentService.cs | 11 ++++ 4 files changed, 134 insertions(+), 3 deletions(-) diff --git a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs index 78bd1f309cb..2779022fb35 100644 --- a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs +++ b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs @@ -1186,4 +1186,66 @@ public VersionResponse GetAppVersion(string org, string app) return new VersionResponse { BackendVersion = backendVersion, FrontendVersion = frontendVersion }; } + + /// + /// Gets the global validation on navigation settings from the global settings file in apps created with v9.0 or later + /// + /// Unique identifier of the organisation responsible for the app. + /// Application identifier which is unique within an organisation. + /// An that observes if operation is cancelled. + /// The content of the global validation on navigation settings file + [HttpGet("layout-sets/settings/validation-on-navigation")] + [UseSystemTextJson] + public async Task GetGlobalValidationOnNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + ValidationOnNavigation config = await _appDevelopmentService.GetGlobalValidationOnNavigationSettings( + editingContext, + cancellationToken + ); + + return Ok(config); + } + + [HttpPost("layout-sets/settings/validation-on-navigation")] + [UseSystemTextJson] + public async Task SaveGlobalValidationOnNavigationSettings( + string org, + string app, + [FromBody] ValidationOnNavigation config, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings( + editingContext, + config, + cancellationToken + ); + + return Ok(); + } + + [HttpDelete("layout-sets/settings/validation-on-navigation")] + public async Task DeleteGlobalValidationOnNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings(editingContext, null, cancellationToken); + + return Ok(); + } } diff --git a/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs b/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs index e731a94cfef..d65a2d43df1 100644 --- a/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs +++ b/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs @@ -42,7 +42,7 @@ public class AltinnAppGitRepository : AltinnGitRepository private const string CshtmlPath = "App/views/Home/Index.cshtml"; private const string ServiceConfigFilename = "config.json"; - private const string LayoutSettingsFilename = "Settings.json"; + private const string SettingsFilename = "Settings.json"; private const string AppMetadataFilename = "applicationmetadata.json"; private const string LayoutSetsFilename = "layout-sets.json"; private const string FooterFilename = "footer.json"; @@ -617,6 +617,22 @@ public async Task SaveLayoutSets(LayoutSets layoutSets) } } + public async Task GetGlobalSettingsFile(CancellationToken cancellationToken = default) + { + string globalSettingsFilePath = GetPathToGlobalSettingsFile(); + cancellationToken.ThrowIfCancellationRequested(); + string fileContent = await ReadTextByRelativePathAsync(globalSettingsFilePath, cancellationToken); + UiSettings globalSettingsFile = JsonSerializer.Deserialize(fileContent, s_jsonOptions); + return globalSettingsFile; + } + + public async Task SaveGlobalSettingsFile(UiSettings globalSettings) + { + string globalSettingsFilePath = GetPathToGlobalSettingsFile(); + string globalSettingsString = JsonSerializer.Serialize(globalSettings, s_jsonOptions); + await WriteTextByRelativePathAsync(globalSettingsFilePath, globalSettingsString); + } + public async Task GetFooter(CancellationToken cancellationToken = default) { string footerFilePath = GetPathToFooterFile(); @@ -1022,8 +1038,8 @@ private static string GetPathToLayoutFile(string layoutSetName, string layoutNam private static string GetPathToLayoutSettings(string layoutSetName) { return string.IsNullOrEmpty(layoutSetName) - ? Path.Combine(LayoutsFolderName, LayoutSettingsFilename) - : Path.Combine(LayoutsFolderName, layoutSetName, LayoutSettingsFilename); + ? Path.Combine(LayoutsFolderName, SettingsFilename) + : Path.Combine(LayoutsFolderName, layoutSetName, SettingsFilename); } private static string GetPathToLayoutSetsFile() @@ -1031,6 +1047,11 @@ private static string GetPathToLayoutSetsFile() return Path.Combine(LayoutsFolderName, LayoutSetsFilename); } + private static string GetPathToGlobalSettingsFile() + { + return Path.Combine(LayoutsFolderName, SettingsFilename); + } + private static string GetPathToFooterFile() { return Path.Combine(LayoutsFolderName, FooterFilename); diff --git a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs index 8007d009e5e..5678d0572ed 100644 --- a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs @@ -1208,4 +1208,41 @@ CancellationToken cancellationToken return hasChanges; } + + // V9 and newer apps should use the global settings file for global layout settings. + public async Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + return globalSettingsFile?.ValidationOnNavigation; + } + + public async Task SaveGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + ValidationOnNavigation validationOnNavigation, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + globalSettingsFile ??= new UiSettings(); + globalSettingsFile.ValidationOnNavigation = validationOnNavigation; + + await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); + } } diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs index 1a5ba97ddae..525e1129f8c 100644 --- a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs @@ -323,4 +323,15 @@ public Task SaveValidationOnNavigationLayoutSets( ValidationOnNavigation validationOnNavigation, CancellationToken cancellationToken ); + + public Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext context, + CancellationToken cancellationToken + ); + + public Task SaveGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext context, + ValidationOnNavigation validationOnNavigation, + CancellationToken cancellationToken + ); } From 5b2d647aa97e5886c9445a1febc9213a468d17fa Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Wed, 13 May 2026 15:50:14 +0200 Subject: [PATCH 2/8] create endpoints for TaskNavigation --- .../Controllers/AppDevelopmentController.cs | 56 +++++++++++++++++ .../Implementation/AppDevelopmentService.cs | 61 +++++++++++++++++++ .../Interfaces/IAppDevelopmentService.cs | 17 ++++++ 3 files changed, 134 insertions(+) diff --git a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs index 2779022fb35..cdddf69d730 100644 --- a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs +++ b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs @@ -1248,4 +1248,60 @@ CancellationToken cancellationToken return Ok(); } + + [HttpGet("layout-sets/settings/task-navigation")] + [UseSystemTextJson] + public async Task GetGlobalTaskNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + IEnumerable taskNavigationGroupList = + await _appDevelopmentService.GetGlobalTaskNavigationSettings(editingContext, cancellationToken); + IEnumerable tasks = _appDevelopmentService.GetTasks( + editingContext, + cancellationToken + ); + IEnumerable taskNavigationGroupDto = taskNavigationGroupList.Select( + taskNavigationGroup => + taskNavigationGroup.ToDto( + (taskId) => + tasks.FirstOrDefault(task => task.Id == taskId)?.ExtensionElements?.TaskExtension?.TaskType + ) + ); + + return Ok(taskNavigationGroupDto); + } + + [HttpPost] + [UseSystemTextJson] + public async Task UpdateGlobalTaskNavigationSettings( + string org, + string app, + [FromBody] IEnumerable taskNavigationGroupDtoList, + CancellationToken cancellationToken + ) + { + try + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + await _appDevelopmentService.UpdateGlobalTaskNavigationSettings( + editingContext, + taskNavigationGroupDtoList.Select(taskNavigationGroupDto => taskNavigationGroupDto.ToDomain()), + cancellationToken + ); + + return NoContent(); + } + catch (ArgumentException exception) + { + return BadRequest(exception.Message); + } + } } diff --git a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs index 5678d0572ed..1c330aaad7d 100644 --- a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs @@ -1245,4 +1245,65 @@ CancellationToken cancellationToken await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); } + + public async Task> GetGlobalTaskNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + return globalSettingsFile?.TaskNavigation?.ToList(); + } + + public IEnumerable GetTasks( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + Definitions definitions = altinnAppGitRepository.GetProcessDefinitions(); + return definitions.Process.Tasks; + } + + public async Task UpdateGlobalTaskNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + IEnumerable taskNavigationGroupList, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + globalSettingsFile ??= new UiSettings(); + + if (taskNavigationGroupList.Any()) + { + globalSettingsFile.TaskNavigation = taskNavigationGroupList; + } + else + { + globalSettingsFile.TaskNavigation = null; + } + + await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); + } } diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs index 525e1129f8c..8b9ca5875a2 100644 --- a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs @@ -3,6 +3,7 @@ using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; +using Altinn.App.Core.Internal.Process.Elements; using Altinn.Studio.DataModeling.Metamodel; using Altinn.Studio.Designer.Enums; using Altinn.Studio.Designer.Models; @@ -334,4 +335,20 @@ public Task SaveGlobalValidationOnNavigationSettings( ValidationOnNavigation validationOnNavigation, CancellationToken cancellationToken ); + + public Task> GetGlobalTaskNavigationSettings( + AltinnRepoEditingContext context, + CancellationToken cancellationToken + ); + + public IEnumerable GetTasks( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ); + + public Task UpdateGlobalTaskNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + IEnumerable taskNavigationGroupList, + CancellationToken cancellationToken + ); } From 316ce9fa43939c64993cede31a908337dd491daa Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Mon, 18 May 2026 11:22:16 +0200 Subject: [PATCH 3/8] create layoutsetscontroller.cs and move global settings into that file --- .../Controllers/LayoutsetsController.cs | 103 ++++++++++++++++++ .../Services/Interfaces/ILayoutsetsService.cs | 9 ++ .../Designer/Services/LayoutsetsService.cs | 62 +++++++++++ 3 files changed, 174 insertions(+) create mode 100644 src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs create mode 100644 src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs create mode 100644 src/Designer/backend/src/Designer/Services/LayoutsetsService.cs diff --git a/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs b/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs new file mode 100644 index 00000000000..890a1ce77bd --- /dev/null +++ b/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs @@ -0,0 +1,103 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using IRepository = Altinn.Studio.Designer.Services.Interfaces.IRepository; + +namespace Altinn.Studio.Designer.Controllers; + +[ApiController] +[Authorize] +[Route("designer/api/{org}/{app:regex(^(?!datamodels$)[[a-z]][[a-z0-9-]]{{1,28}}[[a-z0-9]]$)}/layoutsets")] +public class LayoutsetsController : Controller +{ + private readonly ILayoutsetsService _layoutsetsService; + + public LayoutsetsController(ILayoutsetsService layoutsetsService) + { + _layoutsetsService = layoutsetsService; + } + + [HttpGet("settings/validation-on-navigation")] + [UseSystemTextJson] + public async Task GetGlobalValidationOnNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + ValidationOnNavigation config = await _layoutsetsService.GetGlobalValidationOnNavigationSettings( + editingContext, + cancellationToken + ); + return Ok(config); + } + + [HttpPost("settings/validation-on-navigation")] + [UseSystemTextJson] + public async Task SaveGlobalValidationOnNavigationSettings( + string org, + string app, + [FromBody] ValidationOnNavigation config, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + await _layoutsetsService.SaveGlobalValidationOnNavigationSettings(editingContext, config, cancellationToken); + return Ok(); + } + + [HttpDelete("settings/validation-on-navigation")] + public async Task DeleteGlobalValidationOnNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + await _layoutsetsService.SaveGlobalValidationOnNavigationSettings(editingContext, null, cancellationToken); + return Ok(); + } + + [HttpGet("settings/task-navigation")] + [UseSystemTextJson] + public async Task GetGlobalTaskNavigationSettings( + string org, + string app, + CancellationToken cancellationToken + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + var result = await _layoutsetsService.GetGlobalTaskNavigationSettings(editingContext, cancellationToken); + return Ok(result); + } + + [HttpPost("settings/task-navigation")] + [UseSystemTextJson] + public async Task UpdateGlobalTaskNavigationSettings( + string org, + string app, + [FromBody] IEnumerable taskNavigationGroupDtoList, + CancellationToken cancellationToken + ) + { + try + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + await _layoutsetsService.UpdateGlobalTaskNavigationSettings( + editingContext, + taskNavigationGroupDtoList, + cancellationToken + ); + return NoContent(); + } + catch (ArgumentException exception) + { + return BadRequest(exception.Message); + } + } +} diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs new file mode 100644 index 00000000000..6bb5f4df810 --- /dev/null +++ b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs @@ -0,0 +1,9 @@ +namespace Altinn.Studio.Designer.Services.Interfaces; + +public interface ILayoutsetsService +{ + Task GetGlobalValidationOnNavigationSettings(AltinnRepoEditingContext editingContext, CancellationToken cancellationToken); + Task SaveGlobalValidationOnNavigationSettings(AltinnRepoEditingContext editingContext, ValidationOnNavigation? config, CancellationToken cancellationToken); + Task> GetGlobalTaskNavigationSettings(AltinnRepoEditingContext editingContext, CancellationToken cancellationToken); + Task UpdateGlobalTaskNavigationSettings(AltinnRepoEditingContext editingContext, IEnumerable taskNavigationGroupDtoList, CancellationToken cancellationToken); +} diff --git a/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs new file mode 100644 index 00000000000..654612e48d7 --- /dev/null +++ b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs @@ -0,0 +1,62 @@ +using Altinn.Studio.Designer.Services.Interfaces; + +public class LayoutsetsService : ILayoutsetsService +{ + private readonly IAppDevelopmentService _appDevelopmentService; + + public LayoutsetsService(IAppDevelopmentService appDevelopmentService) + { + _appDevelopmentService = appDevelopmentService; + } + + public async Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext editingContext, + CancellationToken cancellationToken + ) + { + return await _appDevelopmentService.GetGlobalValidationOnNavigationSettings(editingContext, cancellationToken); + } + + public async Task SaveGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext editingContext, + ValidationOnNavigation? config, + CancellationToken cancellationToken + ) + { + await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings( + editingContext, + config, + cancellationToken + ); + } + + public async Task> GetGlobalTaskNavigationSettings( + AltinnRepoEditingContext editingContext, + CancellationToken cancellationToken + ) + { + var taskNavigationGroupList = await _appDevelopmentService.GetGlobalTaskNavigationSettings( + editingContext, + cancellationToken + ); + var tasks = _appDevelopmentService.GetTasks(editingContext, cancellationToken); + return taskNavigationGroupList.Select(taskNavigationGroup => + taskNavigationGroup.ToDto( + (taskId) => tasks.FirstOrDefault(task => task.Id == taskId)?.ExtensionElements?.TaskExtension?.TaskType + ) + ); + } + + public async Task UpdateGlobalTaskNavigationSettings( + AltinnRepoEditingContext editingContext, + IEnumerable taskNavigationGroupDtoList, + CancellationToken cancellationToken + ) + { + await _appDevelopmentService.UpdateGlobalTaskNavigationSettings( + editingContext, + taskNavigationGroupDtoList.Select(dto => dto.ToDomain()), + cancellationToken + ); + } +} From f25a06a8483bd0087bb676b96a5ba18d0af9ae51 Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Tue, 19 May 2026 10:43:14 +0200 Subject: [PATCH 4/8] update ILayoutsetsService --- .../Services/Interfaces/ILayoutsetsService.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs index 6bb5f4df810..d38b46122ff 100644 --- a/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs +++ b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs @@ -1,9 +1,29 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Altinn.Studio.Designer.Models; +using Altinn.Studio.Designer.Models.Dto; + namespace Altinn.Studio.Designer.Services.Interfaces; public interface ILayoutsetsService { - Task GetGlobalValidationOnNavigationSettings(AltinnRepoEditingContext editingContext, CancellationToken cancellationToken); - Task SaveGlobalValidationOnNavigationSettings(AltinnRepoEditingContext editingContext, ValidationOnNavigation? config, CancellationToken cancellationToken); - Task> GetGlobalTaskNavigationSettings(AltinnRepoEditingContext editingContext, CancellationToken cancellationToken); - Task UpdateGlobalTaskNavigationSettings(AltinnRepoEditingContext editingContext, IEnumerable taskNavigationGroupDtoList, CancellationToken cancellationToken); + public Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext editingContext, + CancellationToken cancellationToken + ); + public Task SaveGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext editingContext, + ValidationOnNavigation? validationOnNavigation, + CancellationToken cancellationToken + ); + Task> GetGlobalTaskNavigationSettings( + AltinnRepoEditingContext editingContext, + CancellationToken cancellationToken + ); + public Task UpdateGlobalTaskNavigationSettings( + AltinnRepoEditingContext editingContext, + IEnumerable taskNavigationGroupList, + CancellationToken cancellationToken + ); } From 8f133d00f5966baa6ba5e9c7f0f8d51eaf5f074a Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Wed, 20 May 2026 16:07:01 +0200 Subject: [PATCH 5/8] finalize layoutsetsController, LayoutsetsService, and its interface --- .../Controllers/LayoutsetsController.cs | 54 +++++--- .../Services/Interfaces/ILayoutsetsService.cs | 11 +- .../Designer/Services/LayoutsetsService.cs | 118 ++++++++++++++---- 3 files changed, 138 insertions(+), 45 deletions(-) diff --git a/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs b/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs index 890a1ce77bd..2f76e398151 100644 --- a/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs +++ b/src/Designer/backend/src/Designer/Controllers/LayoutsetsController.cs @@ -1,11 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Altinn.Studio.Designer.Filters; +using Altinn.Studio.Designer.Helpers; +using Altinn.Studio.Designer.Models; +using Altinn.Studio.Designer.Models.Dto; +using Altinn.Studio.Designer.Services.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using IRepository = Altinn.Studio.Designer.Services.Interfaces.IRepository; namespace Altinn.Studio.Designer.Controllers; +/// +/// Controller for handling layout sets related operations for v9 and newer, such as fetching and saving global settings for validation on navigation and task navigation. +/// [ApiController] [Authorize] +[AutoValidateAntiforgeryToken] [Route("designer/api/{org}/{app:regex(^(?!datamodels$)[[a-z]][[a-z0-9-]]{{1,28}}[[a-z0-9]]$)}/layoutsets")] public class LayoutsetsController : Controller { @@ -16,7 +28,13 @@ public LayoutsetsController(ILayoutsetsService layoutsetsService) _layoutsetsService = layoutsetsService; } - [HttpGet("settings/validation-on-navigation")] + private AltinnRepoEditingContext CreateContext(string org, string app) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + return AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + } + + [HttpGet("layout-sets/settings/validation-on-navigation")] [UseSystemTextJson] public async Task GetGlobalValidationOnNavigationSettings( string org, @@ -24,16 +42,15 @@ public async Task GetGlobalValidationOnNavigationSettings( CancellationToken cancellationToken ) { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - ValidationOnNavigation config = await _layoutsetsService.GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext editingContext = CreateContext(org, app); + ValidationOnNavigation? config = await _layoutsetsService.GetGlobalValidationOnNavigationSettings( editingContext, cancellationToken ); return Ok(config); } - [HttpPost("settings/validation-on-navigation")] + [HttpPost("layout-sets/settings/validation-on-navigation")] [UseSystemTextJson] public async Task SaveGlobalValidationOnNavigationSettings( string org, @@ -42,26 +59,24 @@ public async Task SaveGlobalValidationOnNavigationSettings( CancellationToken cancellationToken ) { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + AltinnRepoEditingContext editingContext = CreateContext(org, app); await _layoutsetsService.SaveGlobalValidationOnNavigationSettings(editingContext, config, cancellationToken); return Ok(); } - [HttpDelete("settings/validation-on-navigation")] + [HttpDelete("layout-sets/settings/validation-on-navigation")] public async Task DeleteGlobalValidationOnNavigationSettings( string org, string app, CancellationToken cancellationToken ) { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + AltinnRepoEditingContext editingContext = CreateContext(org, app); await _layoutsetsService.SaveGlobalValidationOnNavigationSettings(editingContext, null, cancellationToken); return Ok(); } - [HttpGet("settings/task-navigation")] + [HttpGet("layout-sets/settings/task-navigation")] [UseSystemTextJson] public async Task GetGlobalTaskNavigationSettings( string org, @@ -69,13 +84,16 @@ public async Task GetGlobalTaskNavigationSettings( CancellationToken cancellationToken ) { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - var result = await _layoutsetsService.GetGlobalTaskNavigationSettings(editingContext, cancellationToken); + AltinnRepoEditingContext editingContext = CreateContext(org, app); + IEnumerable result = await _layoutsetsService.GetGlobalTaskNavigationSettingsDto( + editingContext, + cancellationToken + ); + return Ok(result); } - [HttpPost("settings/task-navigation")] + [HttpPost("layout-sets/settings/task-navigation")] [UseSystemTextJson] public async Task UpdateGlobalTaskNavigationSettings( string org, @@ -86,13 +104,13 @@ CancellationToken cancellationToken { try { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + AltinnRepoEditingContext editingContext = CreateContext(org, app); await _layoutsetsService.UpdateGlobalTaskNavigationSettings( editingContext, taskNavigationGroupDtoList, cancellationToken ); + return NoContent(); } catch (ArgumentException exception) diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs index d38b46122ff..34956cdece6 100644 --- a/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs +++ b/src/Designer/backend/src/Designer/Services/Interfaces/ILayoutsetsService.cs @@ -8,22 +8,25 @@ namespace Altinn.Studio.Designer.Services.Interfaces; public interface ILayoutsetsService { - public Task GetGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext editingContext, + public Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext context, CancellationToken cancellationToken ); + public Task SaveGlobalValidationOnNavigationSettings( AltinnRepoEditingContext editingContext, ValidationOnNavigation? validationOnNavigation, CancellationToken cancellationToken ); - Task> GetGlobalTaskNavigationSettings( + + public Task> GetGlobalTaskNavigationSettingsDto( AltinnRepoEditingContext editingContext, CancellationToken cancellationToken ); + public Task UpdateGlobalTaskNavigationSettings( AltinnRepoEditingContext editingContext, - IEnumerable taskNavigationGroupList, + IEnumerable taskNavigationGroupDtoList, CancellationToken cancellationToken ); } diff --git a/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs index 654612e48d7..de168c09706 100644 --- a/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs +++ b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs @@ -1,62 +1,134 @@ +#nullable enable +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Altinn.App.Core.Internal.Process.Elements; +using Altinn.Studio.Designer.Infrastructure.GitRepository; +using Altinn.Studio.Designer.Mappers; +using Altinn.Studio.Designer.Models; +using Altinn.Studio.Designer.Models.Dto; using Altinn.Studio.Designer.Services.Interfaces; public class LayoutsetsService : ILayoutsetsService { - private readonly IAppDevelopmentService _appDevelopmentService; + private readonly IAltinnGitRepositoryFactory _altinnGitRepositoryFactory; - public LayoutsetsService(IAppDevelopmentService appDevelopmentService) + public LayoutsetsService(IAltinnGitRepositoryFactory altinnGitRepositoryFactory) { - _appDevelopmentService = appDevelopmentService; + _altinnGitRepositoryFactory = altinnGitRepositoryFactory; } - public async Task GetGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext editingContext, + public async Task GetGlobalValidationOnNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, CancellationToken cancellationToken ) { - return await _appDevelopmentService.GetGlobalValidationOnNavigationSettings(editingContext, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + return globalSettingsFile?.ValidationOnNavigation; } public async Task SaveGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext editingContext, + AltinnRepoEditingContext altinnRepoEditingContext, ValidationOnNavigation? config, CancellationToken cancellationToken ) { - await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings( - editingContext, - config, - cancellationToken + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + globalSettingsFile ??= new UiSettings(); + globalSettingsFile.ValidationOnNavigation = config; + await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); } - public async Task> GetGlobalTaskNavigationSettings( + public async Task> GetGlobalTaskNavigationSettingsDto( AltinnRepoEditingContext editingContext, CancellationToken cancellationToken ) { - var taskNavigationGroupList = await _appDevelopmentService.GetGlobalTaskNavigationSettings( + IEnumerable taskNavigationGroups = await GetGlobalTaskNavigationSettings( editingContext, cancellationToken ); - var tasks = _appDevelopmentService.GetTasks(editingContext, cancellationToken); - return taskNavigationGroupList.Select(taskNavigationGroup => - taskNavigationGroup.ToDto( - (taskId) => tasks.FirstOrDefault(task => task.Id == taskId)?.ExtensionElements?.TaskExtension?.TaskType - ) + + IEnumerable tasks = GetTasks(editingContext, cancellationToken); + + Dictionary taskTypesById = tasks.ToDictionary( + task => task.Id, + task => task.ExtensionElements?.TaskExtension?.TaskType + ); + + return taskNavigationGroups.Select(group => group.ToDto(taskId => taskTypesById.GetValueOrDefault(taskId))); + } + + public async Task> GetGlobalTaskNavigationSettings( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer + ); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + return globalSettingsFile?.TaskNavigation?.ToList() ?? []; + } + + public IEnumerable GetTasks( + AltinnRepoEditingContext altinnRepoEditingContext, + CancellationToken cancellationToken + ) + { + cancellationToken.ThrowIfCancellationRequested(); + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer ); + + Definitions definitions = altinnAppGitRepository.GetProcessDefinitions(); + return definitions.Process.Tasks; } public async Task UpdateGlobalTaskNavigationSettings( - AltinnRepoEditingContext editingContext, + AltinnRepoEditingContext altinnRepoEditingContext, IEnumerable taskNavigationGroupDtoList, CancellationToken cancellationToken ) { - await _appDevelopmentService.UpdateGlobalTaskNavigationSettings( - editingContext, - taskNavigationGroupDtoList.Select(dto => dto.ToDomain()), - cancellationToken + cancellationToken.ThrowIfCancellationRequested(); + + AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( + altinnRepoEditingContext.Org, + altinnRepoEditingContext.Repo, + altinnRepoEditingContext.Developer ); + + IEnumerable taskNavigationGroupList = taskNavigationGroupDtoList.Select(x => x.ToDomain()); + + UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); + + globalSettingsFile ??= new UiSettings(); + + globalSettingsFile.TaskNavigation = taskNavigationGroupList.Any() ? taskNavigationGroupList : null; + + await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); } } From 06a146f5381ce6aa4b3d596a0edb1159dc0dc483 Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Wed, 20 May 2026 16:11:00 +0200 Subject: [PATCH 6/8] remove v9 logic from appdevelopment controller, service and interface --- .../Controllers/AppDevelopmentController.cs | 118 ------------------ .../Implementation/AppDevelopmentService.cs | 98 --------------- .../Interfaces/IAppDevelopmentService.cs | 28 ----- 3 files changed, 244 deletions(-) diff --git a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs index cdddf69d730..78bd1f309cb 100644 --- a/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs +++ b/src/Designer/backend/src/Designer/Controllers/AppDevelopmentController.cs @@ -1186,122 +1186,4 @@ public VersionResponse GetAppVersion(string org, string app) return new VersionResponse { BackendVersion = backendVersion, FrontendVersion = frontendVersion }; } - - /// - /// Gets the global validation on navigation settings from the global settings file in apps created with v9.0 or later - /// - /// Unique identifier of the organisation responsible for the app. - /// Application identifier which is unique within an organisation. - /// An that observes if operation is cancelled. - /// The content of the global validation on navigation settings file - [HttpGet("layout-sets/settings/validation-on-navigation")] - [UseSystemTextJson] - public async Task GetGlobalValidationOnNavigationSettings( - string org, - string app, - CancellationToken cancellationToken - ) - { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - - ValidationOnNavigation config = await _appDevelopmentService.GetGlobalValidationOnNavigationSettings( - editingContext, - cancellationToken - ); - - return Ok(config); - } - - [HttpPost("layout-sets/settings/validation-on-navigation")] - [UseSystemTextJson] - public async Task SaveGlobalValidationOnNavigationSettings( - string org, - string app, - [FromBody] ValidationOnNavigation config, - CancellationToken cancellationToken - ) - { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - - await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings( - editingContext, - config, - cancellationToken - ); - - return Ok(); - } - - [HttpDelete("layout-sets/settings/validation-on-navigation")] - public async Task DeleteGlobalValidationOnNavigationSettings( - string org, - string app, - CancellationToken cancellationToken - ) - { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - - await _appDevelopmentService.SaveGlobalValidationOnNavigationSettings(editingContext, null, cancellationToken); - - return Ok(); - } - - [HttpGet("layout-sets/settings/task-navigation")] - [UseSystemTextJson] - public async Task GetGlobalTaskNavigationSettings( - string org, - string app, - CancellationToken cancellationToken - ) - { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - - IEnumerable taskNavigationGroupList = - await _appDevelopmentService.GetGlobalTaskNavigationSettings(editingContext, cancellationToken); - IEnumerable tasks = _appDevelopmentService.GetTasks( - editingContext, - cancellationToken - ); - IEnumerable taskNavigationGroupDto = taskNavigationGroupList.Select( - taskNavigationGroup => - taskNavigationGroup.ToDto( - (taskId) => - tasks.FirstOrDefault(task => task.Id == taskId)?.ExtensionElements?.TaskExtension?.TaskType - ) - ); - - return Ok(taskNavigationGroupDto); - } - - [HttpPost] - [UseSystemTextJson] - public async Task UpdateGlobalTaskNavigationSettings( - string org, - string app, - [FromBody] IEnumerable taskNavigationGroupDtoList, - CancellationToken cancellationToken - ) - { - try - { - string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); - var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); - - await _appDevelopmentService.UpdateGlobalTaskNavigationSettings( - editingContext, - taskNavigationGroupDtoList.Select(taskNavigationGroupDto => taskNavigationGroupDto.ToDomain()), - cancellationToken - ); - - return NoContent(); - } - catch (ArgumentException exception) - { - return BadRequest(exception.Message); - } - } } diff --git a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs index 1c330aaad7d..8007d009e5e 100644 --- a/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Implementation/AppDevelopmentService.cs @@ -1208,102 +1208,4 @@ CancellationToken cancellationToken return hasChanges; } - - // V9 and newer apps should use the global settings file for global layout settings. - public async Task GetGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext altinnRepoEditingContext, - CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( - altinnRepoEditingContext.Org, - altinnRepoEditingContext.Repo, - altinnRepoEditingContext.Developer - ); - - UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); - return globalSettingsFile?.ValidationOnNavigation; - } - - public async Task SaveGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext altinnRepoEditingContext, - ValidationOnNavigation validationOnNavigation, - CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( - altinnRepoEditingContext.Org, - altinnRepoEditingContext.Repo, - altinnRepoEditingContext.Developer - ); - - UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); - globalSettingsFile ??= new UiSettings(); - globalSettingsFile.ValidationOnNavigation = validationOnNavigation; - - await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); - } - - public async Task> GetGlobalTaskNavigationSettings( - AltinnRepoEditingContext altinnRepoEditingContext, - CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - - AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( - altinnRepoEditingContext.Org, - altinnRepoEditingContext.Repo, - altinnRepoEditingContext.Developer - ); - - UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); - return globalSettingsFile?.TaskNavigation?.ToList(); - } - - public IEnumerable GetTasks( - AltinnRepoEditingContext altinnRepoEditingContext, - CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( - altinnRepoEditingContext.Org, - altinnRepoEditingContext.Repo, - altinnRepoEditingContext.Developer - ); - - Definitions definitions = altinnAppGitRepository.GetProcessDefinitions(); - return definitions.Process.Tasks; - } - - public async Task UpdateGlobalTaskNavigationSettings( - AltinnRepoEditingContext altinnRepoEditingContext, - IEnumerable taskNavigationGroupList, - CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - AltinnAppGitRepository altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository( - altinnRepoEditingContext.Org, - altinnRepoEditingContext.Repo, - altinnRepoEditingContext.Developer - ); - - UiSettings globalSettingsFile = await altinnAppGitRepository.GetGlobalSettingsFile(cancellationToken); - globalSettingsFile ??= new UiSettings(); - - if (taskNavigationGroupList.Any()) - { - globalSettingsFile.TaskNavigation = taskNavigationGroupList; - } - else - { - globalSettingsFile.TaskNavigation = null; - } - - await altinnAppGitRepository.SaveGlobalSettingsFile(globalSettingsFile); - } } diff --git a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs index 8b9ca5875a2..1a5ba97ddae 100644 --- a/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs +++ b/src/Designer/backend/src/Designer/Services/Interfaces/IAppDevelopmentService.cs @@ -3,7 +3,6 @@ using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; -using Altinn.App.Core.Internal.Process.Elements; using Altinn.Studio.DataModeling.Metamodel; using Altinn.Studio.Designer.Enums; using Altinn.Studio.Designer.Models; @@ -324,31 +323,4 @@ public Task SaveValidationOnNavigationLayoutSets( ValidationOnNavigation validationOnNavigation, CancellationToken cancellationToken ); - - public Task GetGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext context, - CancellationToken cancellationToken - ); - - public Task SaveGlobalValidationOnNavigationSettings( - AltinnRepoEditingContext context, - ValidationOnNavigation validationOnNavigation, - CancellationToken cancellationToken - ); - - public Task> GetGlobalTaskNavigationSettings( - AltinnRepoEditingContext context, - CancellationToken cancellationToken - ); - - public IEnumerable GetTasks( - AltinnRepoEditingContext altinnRepoEditingContext, - CancellationToken cancellationToken - ); - - public Task UpdateGlobalTaskNavigationSettings( - AltinnRepoEditingContext altinnRepoEditingContext, - IEnumerable taskNavigationGroupList, - CancellationToken cancellationToken - ); } From faf176325dd108ade80c608c64e2a223b6dabd02 Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Thu, 21 May 2026 08:34:43 +0200 Subject: [PATCH 7/8] add new service in dependency injection --- .../backend/src/Designer/Infrastructure/ServiceRegistration.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Designer/backend/src/Designer/Infrastructure/ServiceRegistration.cs b/src/Designer/backend/src/Designer/Infrastructure/ServiceRegistration.cs index 81435799c4c..ca200b471cf 100644 --- a/src/Designer/backend/src/Designer/Infrastructure/ServiceRegistration.cs +++ b/src/Designer/backend/src/Designer/Infrastructure/ServiceRegistration.cs @@ -110,6 +110,7 @@ IConfiguration configuration services.AddHttpClient(); services.AddHttpClient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); From 5d63cbb42c240e0375b1e74bdacf8df101c97a3b Mon Sep 17 00:00:00 2001 From: lassopicasso Date: Thu, 21 May 2026 08:58:35 +0200 Subject: [PATCH 8/8] coderabbit feedback, return null if global settings.json file does not exist --- .../Infrastructure/GitRepository/AltinnAppGitRepository.cs | 4 ++++ .../backend/src/Designer/Services/LayoutsetsService.cs | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs b/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs index d65a2d43df1..c207746688e 100644 --- a/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs +++ b/src/Designer/backend/src/Designer/Infrastructure/GitRepository/AltinnAppGitRepository.cs @@ -621,6 +621,10 @@ public async Task GetGlobalSettingsFile(CancellationToken cancellati { string globalSettingsFilePath = GetPathToGlobalSettingsFile(); cancellationToken.ThrowIfCancellationRequested(); + if (!FileExistsByRelativePath(globalSettingsFilePath)) + { + return null; + } string fileContent = await ReadTextByRelativePathAsync(globalSettingsFilePath, cancellationToken); UiSettings globalSettingsFile = JsonSerializer.Deserialize(fileContent, s_jsonOptions); return globalSettingsFile; diff --git a/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs index de168c09706..f69c1acaeed 100644 --- a/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs +++ b/src/Designer/backend/src/Designer/Services/LayoutsetsService.cs @@ -1,4 +1,3 @@ -#nullable enable using System.Collections.Generic; using System.Linq; using System.Threading;