Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.UserData;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence.Querying;

namespace Umbraco.Cms.Api.Management.Controllers.UserData;

[ApiVersion("1.0")]
public class ByKeyUserDataController : UserDataControllerBase
{
private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor;
private readonly IUserDataService _userDataService;
private readonly IUmbracoMapper _umbracoMapper;

public ByKeyUserDataController(
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IUserDataService userDataService,
IUmbracoMapper umbracoMapper)
{
_backOfficeSecurityAccessor = backOfficeSecurityAccessor;
_userDataService = userDataService;
_umbracoMapper = umbracoMapper;
}

[HttpGet("{id:guid}")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(UserDataViewModel), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> ByKey(CancellationToken cancellationToken, Guid id)
{
Guid currentUserKey = CurrentUserKey(_backOfficeSecurityAccessor);
IUserData? data = await _userDataService.GetAsync(id);
if (data is null)
{
return NotFound();
}

if (data.UserKey != currentUserKey)
{
return Unauthorized();
}

return Ok(_umbracoMapper.Map<UserDataResponseModel>(data));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.UserData;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;

namespace Umbraco.Cms.Api.Management.Controllers.UserData;

[ApiVersion("1.0")]
public class CreateUserDataController : UserDataControllerBase
{
private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor;
private readonly IUserDataService _userDataService;
private readonly IUmbracoMapper _umbracoMapper;

public CreateUserDataController(
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IUserDataService userDataService,
IUmbracoMapper umbracoMapper)
{
_backOfficeSecurityAccessor = backOfficeSecurityAccessor;
_userDataService = userDataService;
_umbracoMapper = umbracoMapper;
}

[HttpPost]
[MapToApiVersion("1.0")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(UserDataOperationStatus), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(UserDataOperationStatus), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Create(CancellationToken cancellationToken, CreateUserDataRequestModel model)
{
Guid currentUserKey = CurrentUserKey(_backOfficeSecurityAccessor);

IUserData userData = _umbracoMapper.Map<IUserData>(model)!;
userData.UserKey = currentUserKey;

Attempt<IUserData, UserDataOperationStatus> attempt = await _userDataService.CreateAsync(userData);


return attempt.Success
? CreatedAtId<ByKeyUserDataController>(controller => nameof(controller.ByKey), attempt.Result.Key)
: UserDataOperationStatusResult(attempt.Status);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.ViewModels.UserData;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence.Querying;

namespace Umbraco.Cms.Api.Management.Controllers.UserData;

[ApiVersion("1.0")]
public class GetUserDataController : UserDataControllerBase
{
private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor;
private readonly IUserDataService _userDataService;
private readonly IUmbracoMapper _umbracoMapper;

public GetUserDataController(
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IUserDataService userDataService,
IUmbracoMapper umbracoMapper)
{
_backOfficeSecurityAccessor = backOfficeSecurityAccessor;
_userDataService = userDataService;
_umbracoMapper = umbracoMapper;
}

[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<UserDataResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> GetUserData(CancellationToken cancellationToken, [FromQuery]string[]? groups, [FromQuery]string[]? identifiers, [FromQuery]int skip = 0, [FromQuery]int take = 100)
{
Guid currentUserKey = CurrentUserKey(_backOfficeSecurityAccessor);

PagedModel<IUserData> data = await _userDataService.GetAsync(
skip,
take,
new UserDataFilter { UserKeys = new[] { currentUserKey }, Groups = groups, Identifiers = identifiers });

return Ok(new PagedViewModel<UserDataResponseModel>
{
Total = data.Total,
Items = _umbracoMapper.MapEnumerable<IUserData, UserDataResponseModel>(data.Items),
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.UserData;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;

namespace Umbraco.Cms.Api.Management.Controllers.UserData;

[ApiVersion("1.0")]
public class UpdateUserDataController : UserDataControllerBase
{
private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor;
private readonly IUserDataService _userDataService;
private readonly IUmbracoMapper _umbracoMapper;

public UpdateUserDataController(
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IUserDataService userDataService,
IUmbracoMapper umbracoMapper)
{
_backOfficeSecurityAccessor = backOfficeSecurityAccessor;
_userDataService = userDataService;
_umbracoMapper = umbracoMapper;
}

[HttpPut]
[MapToApiVersion("1.0")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(UserDataOperationStatus), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(UserDataOperationStatus), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Create(CancellationToken cancellationToken, UpdateUserDataRequestModel model)
{
Guid currentUserKey = CurrentUserKey(_backOfficeSecurityAccessor);

IUserData userData = _umbracoMapper.Map<IUserData>(model)!;
userData.UserKey = currentUserKey;

Attempt<IUserData, UserDataOperationStatus> attempt = await _userDataService.UpdateAsync(userData);

return attempt.Success
? Ok(attempt.Result)
: UserDataOperationStatusResult(attempt.Status);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Core.Services.OperationStatus;

namespace Umbraco.Cms.Api.Management.Controllers.UserData;

[VersionedApiBackOfficeRoute("user-data")]
[ApiExplorerSettings(GroupName = "User Data")]
public class UserDataControllerBase : ManagementApiControllerBase
{
protected IActionResult UserDataOperationStatusResult(UserDataOperationStatus status) =>
OperationStatusResult(status, problemDetailsBuilder => status switch
{
UserDataOperationStatus.Success => Ok(),
UserDataOperationStatus.UserNotFound => NotFound(problemDetailsBuilder
.WithTitle("User not found")
.Build()),
UserDataOperationStatus.NotFound => NotFound(problemDetailsBuilder
.WithTitle("UserData not found")
.Build()),
UserDataOperationStatus.AlreadyExists => BadRequest(problemDetailsBuilder
.WithTitle("UserData already exists")
.WithDetail("A userData entry with the given key already exists")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown userData operation status.")
.Build()),
});
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ public static IUmbracoBuilder AddUmbracoManagementApi(this IUmbracoBuilder build
.AddLogViewer()
.AddUsers()
.AddUserGroups()
.AddTours()
.AddPackages()
.AddEntities()
.AddScripts()
Expand All @@ -66,7 +65,8 @@ public static IUmbracoBuilder AddUmbracoManagementApi(this IUmbracoBuilder build
.AddWebhooks()
.AddPreview()
.AddPasswordConfiguration()
.AddSupplemenataryLocalizedTextFileSources();
.AddSupplemenataryLocalizedTextFileSources()
.AddUserData();

services
.ConfigureOptions<ConfigureApiBehaviorOptions>()
Expand Down
Loading