Skip to content

Commit c85b1d4

Browse files
authored
Make public access endpoints work correctly (#16136)
1 parent b9e72a2 commit c85b1d4

File tree

8 files changed

+34
-37
lines changed

8 files changed

+34
-37
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Document/CreatePublicAccessDocumentController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task<IActionResult> Create(
5757
Attempt<PublicAccessEntry?, PublicAccessOperationStatus> saveAttempt = await _publicAccessService.CreateAsync(publicAccessEntrySlim);
5858

5959
return saveAttempt.Success
60-
? CreatedAtId<GetPublicAccessDocumentController>(controller => nameof(controller.GetPublicAccess), saveAttempt.Result!.Key)
60+
? CreatedAtId<GetPublicAccessDocumentController>(controller => nameof(controller.GetPublicAccess), id)
6161
: PublicAccessOperationStatusResult(saveAttempt.Status);
6262
}
6363
}

src/Umbraco.Cms.Api.Management/Controllers/Document/DocumentControllerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ protected IActionResult PublicAccessOperationStatusResult(PublicAccessOperationS
162162
.WithTitle("Ambiguous Rule")
163163
.WithDetail("The specified rule is ambiguous, because both member groups and member names were given.")
164164
.Build()),
165-
PublicAccessOperationStatus.EntryNotFound => BadRequest(problemDetailsBuilder
165+
PublicAccessOperationStatus.EntryNotFound => NotFound(problemDetailsBuilder
166166
.WithTitle("Entry not found")
167167
.WithDetail("The specified entry was not found.")
168168
.Build()),

src/Umbraco.Cms.Api.Management/Controllers/Document/GetPublicAccessDocumentController.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.AspNetCore.Http;
44
using Microsoft.AspNetCore.Mvc;
55
using Umbraco.Cms.Api.Management.Factories;
6-
using Umbraco.Cms.Api.Management.Security.Authorization.Content;
76
using Umbraco.Cms.Api.Management.ViewModels.PublicAccess;
87
using Umbraco.Cms.Core;
98
using Umbraco.Cms.Core.Actions;
@@ -35,6 +34,7 @@ public GetPublicAccessDocumentController(
3534

3635
[MapToApiVersion("1.0")]
3736
[HttpGet("{id:guid}/public-access")]
37+
[ProducesResponseType(typeof(PublicAccessResponseModel), StatusCodes.Status200OK)]
3838
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
3939
public async Task<IActionResult> GetPublicAccess(CancellationToken cancellationToken, Guid id)
4040
{
@@ -51,16 +51,11 @@ public async Task<IActionResult> GetPublicAccess(CancellationToken cancellationT
5151
Attempt<PublicAccessEntry?, PublicAccessOperationStatus> accessAttempt =
5252
await _publicAccessService.GetEntryByContentKeyAsync(id);
5353

54-
if (accessAttempt.Success is false)
54+
if (accessAttempt.Success is false || accessAttempt.Result is null)
5555
{
5656
return PublicAccessOperationStatusResult(accessAttempt.Status);
5757
}
5858

59-
if (accessAttempt.Result is null)
60-
{
61-
return Ok();
62-
}
63-
6459
Attempt<PublicAccessResponseModel?, PublicAccessOperationStatus> responseModelAttempt =
6560
_publicAccessPresentationFactory.CreatePublicAccessResponseModel(accessAttempt.Result);
6661

src/Umbraco.Cms.Api.Management/Factories/IMemberPresentationFactory.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
using Umbraco.Cms.Api.Management.ViewModels.Content;
2-
using Umbraco.Cms.Api.Management.ViewModels.Member;
1+
using Umbraco.Cms.Api.Management.ViewModels.Member;
32
using Umbraco.Cms.Api.Management.ViewModels.Member.Item;
4-
using Umbraco.Cms.Api.Management.ViewModels.MemberType;
53
using Umbraco.Cms.Core.Models;
64
using Umbraco.Cms.Core.Models.Entities;
75
using Umbraco.Cms.Core.Models.Membership;
@@ -16,7 +14,5 @@ public interface IMemberPresentationFactory
1614

1715
MemberItemResponseModel CreateItemResponseModel(IMemberEntitySlim entity);
1816

19-
IEnumerable<VariantItemResponseModel> CreateVariantsItemResponseModels(IMemberEntitySlim entity);
20-
21-
MemberTypeReferenceResponseModel CreateMemberTypeReferenceResponseModel(IMemberEntitySlim entity);
17+
MemberItemResponseModel CreateItemResponseModel(IMember entity);
2218
}

src/Umbraco.Cms.Api.Management/Factories/MemberPresentationFactory.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,21 @@ public async Task<IEnumerable<MemberResponseModel>> CreateMultipleAsync(IEnumera
6060
}
6161

6262
public MemberItemResponseModel CreateItemResponseModel(IMemberEntitySlim entity)
63-
{
64-
var responseModel = new MemberItemResponseModel
63+
=> CreateItemResponseModel<IMemberEntitySlim>(entity);
64+
65+
public MemberItemResponseModel CreateItemResponseModel(IMember entity)
66+
=> CreateItemResponseModel<IMember>(entity);
67+
68+
private MemberItemResponseModel CreateItemResponseModel<T>(T entity)
69+
where T : ITreeEntity
70+
=> new MemberItemResponseModel
6571
{
6672
Id = entity.Key,
73+
MemberType = _umbracoMapper.Map<MemberTypeReferenceResponseModel>(entity)!,
74+
Variants = CreateVariantsItemResponseModels(entity)
6775
};
6876

69-
responseModel.MemberType = _umbracoMapper.Map<MemberTypeReferenceResponseModel>(entity)!;
70-
71-
responseModel.Variants = CreateVariantsItemResponseModels(entity);
72-
73-
return responseModel;
74-
}
75-
76-
public IEnumerable<VariantItemResponseModel> CreateVariantsItemResponseModels(IMemberEntitySlim entity)
77+
private static IEnumerable<VariantItemResponseModel> CreateVariantsItemResponseModels(ITreeEntity entity)
7778
=> new[]
7879
{
7980
new VariantItemResponseModel
@@ -83,9 +84,6 @@ public IEnumerable<VariantItemResponseModel> CreateVariantsItemResponseModels(IM
8384
}
8485
};
8586

86-
public MemberTypeReferenceResponseModel CreateMemberTypeReferenceResponseModel(IMemberEntitySlim entity)
87-
=> _umbracoMapper.Map<MemberTypeReferenceResponseModel>(entity)!;
88-
8987
private async Task<MemberResponseModel> RemoveSensitiveDataAsync(IMember member, MemberResponseModel responseModel)
9088
{
9189
// these properties are considered sensitive; some of them are not nullable, so for

src/Umbraco.Cms.Api.Management/Factories/PublicAccessPresentationFactory.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,20 @@ public class PublicAccessPresentationFactory : IPublicAccessPresentationFactory
2020
private readonly IMemberService _memberService;
2121
private readonly IUmbracoMapper _mapper;
2222
private readonly IMemberRoleManager _memberRoleManager;
23+
private readonly IMemberPresentationFactory _memberPresentationFactory;
2324

2425
public PublicAccessPresentationFactory(
2526
IEntityService entityService,
2627
IMemberService memberService,
2728
IUmbracoMapper mapper,
28-
IMemberRoleManager memberRoleManager)
29+
IMemberRoleManager memberRoleManager,
30+
IMemberPresentationFactory memberPresentationFactory)
2931
{
3032
_entityService = entityService;
3133
_memberService = memberService;
3234
_mapper = mapper;
3335
_memberRoleManager = memberRoleManager;
36+
_memberPresentationFactory = memberPresentationFactory;
3437
}
3538

3639
public Attempt<PublicAccessResponseModel?, PublicAccessOperationStatus> CreatePublicAccessResponseModel(PublicAccessEntry entry)
@@ -57,8 +60,8 @@ public PublicAccessPresentationFactory(
5760

5861
MemberItemResponseModel[] members = usernames
5962
.Select(username => _memberService.GetByUsername(username))
60-
.Select(_mapper.Map<MemberItemResponseModel>)
6163
.WhereNotNull()
64+
.Select(_memberPresentationFactory.CreateItemResponseModel)
6265
.ToArray();
6366

6467
var allGroups = _memberRoleManager.Roles.Where(x => x.Name != null).ToDictionary(x => x.Name!);
@@ -68,9 +71,12 @@ public PublicAccessPresentationFactory(
6871
rule.RuleValue is not null && allGroups.TryGetValue(rule.RuleValue, out UmbracoIdentityRole? memberRole)
6972
? memberRole
7073
: null)
71-
.WhereNotNull();
74+
.WhereNotNull()
75+
.ToArray();
7276

73-
IEnumerable<IEntitySlim> groupsEntities = _entityService.GetAll(UmbracoObjectTypes.MemberGroup, identityRoles.Select(x => Convert.ToInt32(x.Id)).ToArray());
77+
IEnumerable<IEntitySlim> groupsEntities = identityRoles.Any()
78+
? _entityService.GetAll(UmbracoObjectTypes.MemberGroup, identityRoles.Select(x => Convert.ToInt32(x.Id)).ToArray())
79+
: Enumerable.Empty<IEntitySlim>();
7480
MemberGroupItemResponseModel[] memberGroups = groupsEntities.Select(x => _mapper.Map<MemberGroupItemResponseModel>(x)!).ToArray();
7581

7682
var responseModel = new PublicAccessResponseModel

src/Umbraco.Cms.Api.Management/Mapping/MemberType/MemberTypeMapDefinition.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public void DefineMaps(IUmbracoMapper mapper)
1414
mapper.Define<IMemberType, MemberTypeResponseModel>((_, _) => new MemberTypeResponseModel(), Map);
1515
mapper.Define<IMemberType, MemberTypeReferenceResponseModel>((_, _) => new MemberTypeReferenceResponseModel(), Map);
1616
mapper.Define<IMemberEntitySlim, MemberTypeReferenceResponseModel>((_, _) => new MemberTypeReferenceResponseModel(), Map);
17-
mapper.Define<IContentEntitySlim, MemberTypeReferenceResponseModel>((_, _) => new MemberTypeReferenceResponseModel(), Map);
17+
mapper.Define<IMember, MemberTypeReferenceResponseModel>((_, _) => new MemberTypeReferenceResponseModel(), Map);
1818
mapper.Define<ISimpleContentType, MemberTypeReferenceResponseModel>((_, _) => new MemberTypeReferenceResponseModel(), Map);
1919
}
2020

@@ -49,16 +49,18 @@ private void Map(IMemberType source, MemberTypeReferenceResponseModel target, Ma
4949
target.Icon = source.Icon ?? string.Empty;
5050
}
5151

52+
// Umbraco.Code.MapAll -Collection
5253
private void Map(IMemberEntitySlim source, MemberTypeReferenceResponseModel target, MapperContext context)
5354
{
5455
target.Id = source.ContentTypeKey;
5556
target.Icon = source.ContentTypeIcon ?? string.Empty;
5657
}
5758

58-
private void Map(IContentEntitySlim source, MemberTypeReferenceResponseModel target, MapperContext context)
59+
// Umbraco.Code.MapAll -Collection
60+
private void Map(IMember source, MemberTypeReferenceResponseModel target, MapperContext context)
5961
{
60-
target.Id = source.ContentTypeKey;
61-
target.Icon = source.ContentTypeIcon ?? string.Empty;
62+
target.Id = source.ContentType.Key;
63+
target.Icon = source.ContentType.Icon ?? string.Empty;
6264
}
6365

6466
// Umbraco.Code.MapAll -Collection

src/Umbraco.Core/Services/PublicAccessService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ private Attempt<PublicAccessNodesValidationResult, PublicAccessOperationStatus>
375375

376376
if (entry is null)
377377
{
378-
return Task.FromResult(Attempt.SucceedWithStatus<PublicAccessEntry?, PublicAccessOperationStatus>(PublicAccessOperationStatus.Success, null));
378+
return Task.FromResult(Attempt.SucceedWithStatus<PublicAccessEntry?, PublicAccessOperationStatus>(PublicAccessOperationStatus.EntryNotFound, null));
379379
}
380380

381381
return Task.FromResult(Attempt.SucceedWithStatus<PublicAccessEntry?, PublicAccessOperationStatus>(PublicAccessOperationStatus.Success, entry));

0 commit comments

Comments
 (0)