From bc9a2eda235bc1630e8a645d75e9dd68827ddb71 Mon Sep 17 00:00:00 2001 From: Jonas Dyrlie Date: Mon, 17 Feb 2025 09:58:24 +0100 Subject: [PATCH] refactor: create api endpoints for layout actions based on new layout service Creates a new controller for layout operations based on the new service LayoutService. This controller will be responsible for more explicit operations on the layout configurations, allowing the frontend to do less work. commit-id:2ac25caa --- .../Designer/Controllers/LayoutController.cs | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 backend/src/Designer/Controllers/LayoutController.cs diff --git a/backend/src/Designer/Controllers/LayoutController.cs b/backend/src/Designer/Controllers/LayoutController.cs new file mode 100644 index 00000000000..387fa8f0823 --- /dev/null +++ b/backend/src/Designer/Controllers/LayoutController.cs @@ -0,0 +1,127 @@ +using System.Threading.Tasks; +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.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; + +namespace Altinn.Studio.Designer.Controllers +{ + [ApiController] + [Authorize] + [AutoValidateAntiforgeryToken] + [Route("designer/api/{org}/{app}/layouts/layoutSet/{layoutSetId}/")] + public class LayoutController(ILayoutService layoutService) : Controller + { + [EndpointSummary("Retrieve pages")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpGet("pages")] + public async Task> GetPages( + [FromRoute] string org, + [FromRoute] string app, + [FromRoute] string layoutSetId + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + Pages pages = await layoutService.getPagesByLayoutSetId(editingContext, layoutSetId); + return Ok(pages); + } + + [EndpointSummary("Create page")] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status409Conflict)] + [HttpPost("pages")] + public async Task> CreatePage( + [FromRoute] string org, + [FromRoute] string app, + [FromRoute] string layoutSetId, + [FromBody] Page page + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + + Page existingPage = await layoutService.getPageById(editingContext, layoutSetId, page.id); + if (existingPage != null) + { + return Conflict(); + } + await layoutService.createPage(editingContext, layoutSetId, page.id); + return Created(); + } + + [EndpointSummary("Retrieve page")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpGet("pages/{pageId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetPage( + [FromRoute] string org, + [FromRoute] string app, + [FromRoute] string layoutSetId, + [FromRoute] string pageId + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + Page page = await layoutService.getPageById(editingContext, layoutSetId, pageId); + if (page == null) + { + return NotFound(); + } + return Ok(page); + } + + [EndpointSummary("Modify page")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpPost("pages/{pageId}")] + public async Task> ModifyPageAsync( + [FromRoute] string org, + [FromRoute] string app, + [FromRoute] string layoutSetId, + [FromRoute] string pageId, + [FromBody] Page page + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + Page existingPage = await layoutService.getPageById(editingContext, layoutSetId, pageId); + if (existingPage == null) + { + return NotFound(); + } + + await layoutService.updatePage(editingContext, layoutSetId, pageId, page); + return Ok(); + } + + [EndpointSummary("Delete page")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [HttpDelete("pages/{pageId}")] + public async Task DeletePage( + [FromRoute] string org, + [FromRoute] string app, + [FromRoute] string layoutSetId, + [FromRoute] string pageId + ) + { + string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext); + var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, app, developer); + Page page = await layoutService.getPageById(editingContext, layoutSetId, pageId); + if (page == null) + { + return NotFound(); + } + + await layoutService.deletePage(editingContext, layoutSetId, pageId); + return Ok(); + } + } +}