New backoffice: User and member item endpoints (#14079)

* Implement ByKeys in MemberService

* Implement member item endpoint

* Add routing to static file item controller

* Implement user item endpoint

* Implement user group item endpoint

* return proper response model

* update OpenApi.json

* Add CompatibilitySuppressions

* Cleanup

* Update OpenApi

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Elitsa <elm@umbraco.dk>
This commit is contained in:
Nikolaj Geisle
2023-04-19 09:43:01 +02:00
committed by GitHub
parent cbb8f62457
commit cb682e2f3e
16 changed files with 663 additions and 292 deletions

View File

@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Member.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.Member.Item;
public class ItemMemberItemController : MemberItemControllerBase
{
private readonly IMemberService _memberService;
private readonly IUmbracoMapper _mapper;
public ItemMemberItemController(IMemberService memberService, IUmbracoMapper mapper)
{
_memberService = memberService;
_mapper = mapper;
}
[HttpGet("item")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<MemberItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Item([FromQuery(Name = "id")] SortedSet<Guid> ids)
{
IEnumerable<IMember> members = await _memberService.GetByKeysAsync(ids.ToArray());
List<MemberItemResponseModel> responseModels = _mapper.MapEnumerable<IMember, MemberItemResponseModel>(members);
return Ok(responseModels);
}
}

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Core;
namespace Umbraco.Cms.Api.Management.Controllers.Member.Item;
[ApiVersion("1.0")]
[ApiController]
[VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.Member}")]
[ApiExplorerSettings(GroupName = "Member")]
public class MemberItemControllerBase : ManagementApiControllerBase
{
}

View File

@@ -6,7 +6,7 @@ using Umbraco.Cms.Core.IO;
namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Item;
public class ItemStaticFileItemController : ManagementApiControllerBase
public class ItemStaticFileItemController : StaticFileItemControllerBase
{
private readonly IFileItemPresentationModelFactory _presentationModelFactory;
private readonly IPhysicalFileSystem _physicalFileSystem;

View File

@@ -1,5 +1,12 @@
namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Item;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Item;
[ApiVersion("1.0")]
[ApiController]
[VersionedApiBackOfficeRoute("static-file")]
[ApiExplorerSettings(GroupName = "Static File")]
public class StaticFileItemControllerBase : ManagementApiControllerBase
{
}

View File

@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.UserGroups.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.UserGroups.Item;
public class ItemUserGroupItemController : UserGroupItemControllerBase
{
private readonly IUserGroupService _userGroupService;
private readonly IUmbracoMapper _mapper;
public ItemUserGroupItemController(IUserGroupService userGroupService, IUmbracoMapper mapper)
{
_userGroupService = userGroupService;
_mapper = mapper;
}
[HttpGet("item")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<UserGroupItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Item([FromQuery(Name = "id")] SortedSet<Guid> ids)
{
IEnumerable<IUserGroup> userGroups = await _userGroupService.GetAsync(ids);
List<UserGroupItemResponseModel> responseModels = _mapper.MapEnumerable<IUserGroup, UserGroupItemResponseModel>(userGroups);
return Ok(responseModels);
}
}

View File

@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
namespace Umbraco.Cms.Api.Management.Controllers.UserGroups.Item;
[ApiController]
[VersionedApiBackOfficeRoute("user-groups")]
[ApiExplorerSettings(GroupName = "User Groups")]
[ApiVersion("1.0")]
public class UserGroupItemControllerBase : ManagementApiControllerBase
{
}

View File

@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Users.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.Users.Item;
public class ItemUserItemController : UserItemControllerBase
{
private readonly IUserService _userService;
private readonly IUmbracoMapper _mapper;
public ItemUserItemController(IUserService userService, IUmbracoMapper mapper)
{
_userService = userService;
_mapper = mapper;
}
[HttpGet("item")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<UserItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Item([FromQuery(Name = "id")] SortedSet<Guid> ids)
{
IEnumerable<IUser> users = await _userService.GetAsync(ids.ToArray());
List<UserItemResponseModel> responseModels = _mapper.MapEnumerable<IUser, UserItemResponseModel>(users);
return Ok(responseModels);
}
}

View File

@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
namespace Umbraco.Cms.Api.Management.Controllers.Users.Item;
[ApiController]
[VersionedApiBackOfficeRoute("users")]
[ApiExplorerSettings(GroupName = "Users")]
[ApiVersion("1.0")]
public class UserItemControllerBase : ManagementApiControllerBase
{
}

View File

@@ -1,19 +1,20 @@
using NPoco.FluentMappings;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Dictionary.Item;
using Umbraco.Cms.Api.Management.ViewModels.DocumentBlueprint.Item;
using Umbraco.Cms.Api.Management.ViewModels.DocumentType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Language.Item;
using Umbraco.Cms.Api.Management.ViewModels.Media.Item;
using Umbraco.Cms.Api.Management.ViewModels.MediaType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Member.Item;
using Umbraco.Cms.Api.Management.ViewModels.MemberGroup.Item;
using Umbraco.Cms.Api.Management.ViewModels.MemberType.Items;
using Umbraco.Cms.Api.Management.ViewModels.RelationType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Template.Item;
using Umbraco.Cms.Core;
using Umbraco.Cms.Api.Management.ViewModels.UserGroups.Item;
using Umbraco.Cms.Api.Management.ViewModels.Users.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Models.Membership;
namespace Umbraco.Cms.Api.Management.Mapping.Items;
@@ -31,6 +32,9 @@ public class ItemTypeMapDefinition : IMapDefinition
mapper.Define<IMemberType, MemberTypeItemResponseModel>((_, _) => new MemberTypeItemResponseModel(), Map);
mapper.Define<IRelationType, RelationTypeItemResponseModel>((_, _) => new RelationTypeItemResponseModel(), Map);
mapper.Define<IMediaEntitySlim, MediaItemResponseModel>((_, _) => new MediaItemResponseModel(), Map);
mapper.Define<IMember, MemberItemResponseModel>((_, _) => new MemberItemResponseModel(), Map);
mapper.Define<IUser, UserItemResponseModel>((_, _) => new UserItemResponseModel(), Map);
mapper.Define<IUserGroup, UserGroupItemResponseModel>((_, _) => new UserGroupItemResponseModel(), Map);
}
// Umbraco.Code.MapAll
@@ -108,4 +112,27 @@ public class ItemTypeMapDefinition : IMapDefinition
target.Id = source.Key;
target.Name = source.Name ?? string.Empty;
}
// Umbraco.Code.MapAll
private static void Map(IMember source, MemberItemResponseModel target, MapperContext context)
{
target.Icon = source.ContentType.Icon;
target.Id = source.Key;
target.Name = source.Name ?? source.Username;
}
// Umbraco.Code.MapAll
private static void Map(IUser source, UserItemResponseModel target, MapperContext context)
{
target.Id = source.Key;
target.Name = source.Name ?? source.Username;
}
// Umbraco.Code.MapAll
private static void Map(IUserGroup source, UserGroupItemResponseModel target, MapperContext context)
{
target.Id = source.Key;
target.Name = source.Name ?? source.Alias;
target.Icon = source.Icon;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
using Umbraco.Cms.Api.Management.ViewModels.Item;
namespace Umbraco.Cms.Api.Management.ViewModels.Member.Item;
public class MemberItemResponseModel : ItemResponseModelBase
{
public string? Icon { get; set; }
}

View File

@@ -0,0 +1,8 @@
using Umbraco.Cms.Api.Management.ViewModels.Item;
namespace Umbraco.Cms.Api.Management.ViewModels.UserGroups.Item;
public class UserGroupItemResponseModel : ItemResponseModelBase
{
public string? Icon { get; set; }
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.Item;
namespace Umbraco.Cms.Api.Management.ViewModels.Users.Item;
public class UserItemResponseModel : ItemResponseModelBase
{
}

View File

@@ -1128,6 +1128,13 @@
<Right>lib/net7.0/Umbraco.Core.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Umbraco.Cms.Core.Services.IMemberService.GetByKeysAsync(System.Guid[])</Target>
<Left>lib/net7.0/Umbraco.Core.dll</Left>
<Right>lib/net7.0/Umbraco.Core.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Umbraco.Cms.Core.Services.IPackagingService.CreateCreatedPackageAsync(Umbraco.Cms.Core.Packaging.PackageDefinition,System.Guid)</Target>

View File

@@ -247,6 +247,15 @@ public interface IMemberService : IMembershipMemberService
/// </returns>
IEnumerable<IMember> GetAllMembers(params int[] ids);
/// <summary>
/// Gets <see cref="IMember" /> objects by Ids
/// </summary>
/// <param name="ids">Ids of the Member to retrieve</param>
/// <returns>
/// <see cref="IMember" />
/// </returns>
Task<IEnumerable<IMember>> GetByKeysAsync(params Guid[] ids);
/// <summary>
/// Delete Members of the specified MemberType id
/// </summary>

View File

@@ -459,6 +459,15 @@ namespace Umbraco.Cms.Core.Services
return _memberRepository.GetMany(ids);
}
/// <inheritdoc />
public Task<IEnumerable<IMember>> GetByKeysAsync(params Guid[] ids)
{
using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true);
scope.ReadLock(Constants.Locks.MemberTree);
IQuery<IMember> query = Query<IMember>().Where(x => ids.Contains(x.Key));
return Task.FromResult(_memberRepository.Get(query));
}
/// <summary>
/// Finds Members based on their display name
/// </summary>