Files
Umbraco-CMS/src/Umbraco.Cms.Api.Management/Controllers/Help/GetHelpController.cs
Ronald Barendse 0d1cdd1bb4 Refactor setting arrays to sets (#16058)
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-12-02 15:50:23 +01:00

87 lines
3.1 KiB
C#

using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Api.Common.Builders;
using Umbraco.Cms.Api.Management.ViewModels.Help;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
namespace Umbraco.Cms.Api.Management.Controllers.Help;
[ApiVersion("1.0")]
public class GetHelpController : HelpControllerBase
{
private readonly ILogger<GetHelpController> _logger;
private readonly IJsonSerializer _jsonSerializer;
private HelpPageSettings _helpPageSettings;
public GetHelpController(
IOptionsMonitor<HelpPageSettings> helpPageSettings,
ILogger<GetHelpController> logger,
IJsonSerializer jsonSerializer)
{
_logger = logger;
_jsonSerializer = jsonSerializer;
_helpPageSettings = helpPageSettings.CurrentValue;
helpPageSettings.OnChange(UpdateHelpPageSettings);
}
private void UpdateHelpPageSettings(HelpPageSettings settings) => _helpPageSettings = settings;
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(PagedViewModel<HelpPageResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Get(
CancellationToken cancellationToken,
string section,
string? tree,
int skip = 0,
int take = 100,
string? baseUrl = "https://our.umbraco.com")
{
if (IsAllowedUrl(baseUrl) is false)
{
_logger.LogError($"The following URL is not listed in the allowlist for HelpPage in HelpPageSettings: {baseUrl}");
ProblemDetails invalidModelProblem =
new ProblemDetailsBuilder()
.WithTitle("Invalid database configuration")
.WithDetail("The provided database configuration is invalid")
.Build();
return BadRequest(invalidModelProblem);
}
var url = string.Format(baseUrl + "/Umbraco/Documentation/Lessons/GetContextHelpDocs?sectionAlias={0}&treeAlias={1}", section, tree);
try
{
var httpClient = new HttpClient();
// fetch dashboard json and parse to JObject
var json = await httpClient.GetStringAsync(url);
List<HelpPageResponseModel>? result = _jsonSerializer.Deserialize<List<HelpPageResponseModel>>(json);
if (result != null)
{
return Ok(new PagedViewModel<HelpPageResponseModel>
{
Total = result.Count,
Items = result.Skip(skip).Take(take),
});
}
}
catch (HttpRequestException rex)
{
_logger.LogInformation($"Check your network connection, exception: {rex.Message}");
}
return Ok(PagedViewModel<HelpPageResponseModel>.Empty());
}
private bool IsAllowedUrl(string? url) => url is null || _helpPageSettings.HelpPageUrlAllowList.Contains(url);
}