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:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
@@ -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
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
using Umbraco.Cms.Api.Management.ViewModels.Item;
|
||||
|
||||
namespace Umbraco.Cms.Api.Management.ViewModels.Users.Item;
|
||||
|
||||
public class UserItemResponseModel : ItemResponseModelBase
|
||||
{
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user