Members and member types in the Management API (#15662)

* Members and member types in the Management API

* Add validation endpoints for members

* Include validation result in service response + add unit tests

* Regenerate OpenApi.json

* Regenerate OpenApi.json after merge

* Don't throw an exception when trying to set valid variation levels for member types

* Added missing ProducesResponseType

* Remove TODO, as that works

* Allow creation of member with explicit key

* Do not feature "parent" for member creation + add missing response type

* Do not feature a "Folder" in create member type (folders are not supported)

* Added missing build methods

* Fixed issue with mapping

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
This commit is contained in:
Kenn Jacobsen
2024-02-05 06:42:07 +01:00
committed by GitHub
parent dde2ccfd41
commit 71b3076de9
101 changed files with 4354 additions and 124 deletions

View File

@@ -6,6 +6,4 @@ public abstract class CreateContentRequestModelBase<TValueModel, TVariantModel>
where TVariantModel : VariantModelBase
{
public Guid? Id { get; set; }
public ReferenceByIdModel? Parent { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace Umbraco.Cms.Api.Management.ViewModels.Content;
public abstract class CreateContentWithParentRequestModelBase<TValueModel, TVariantModel>
: CreateContentRequestModelBase<TValueModel, TVariantModel>
where TValueModel : ValueModelBase
where TVariantModel : VariantModelBase
{
public ReferenceByIdModel? Parent { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace Umbraco.Cms.Api.Management.ViewModels.ContentType;
public abstract class CreateContentTypeInFolderRequestModelBase<TPropertyType, TPropertyTypeContainer>
: CreateContentTypeRequestModelBase<TPropertyType, TPropertyTypeContainer>
where TPropertyType : PropertyTypeModelBase
where TPropertyTypeContainer : PropertyTypeContainerModelBase
{
public ReferenceByIdModel? Folder { get; set; }
}

View File

@@ -6,6 +6,4 @@ public abstract class CreateContentTypeRequestModelBase<TPropertyType, TProperty
where TPropertyTypeContainer : PropertyTypeContainerModelBase
{
public Guid? Id { get; set; }
public ReferenceByIdModel? Folder { get; set; }
}

View File

@@ -4,7 +4,7 @@ using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Document;
[ShortGenericSchemaName<DocumentValueModel, DocumentVariantRequestModel>("CreateContentForDocumentRequestModel")]
public class CreateDocumentRequestModel : CreateContentRequestModelBase<DocumentValueModel, DocumentVariantRequestModel>
public class CreateDocumentRequestModel : CreateContentWithParentRequestModelBase<DocumentValueModel, DocumentVariantRequestModel>
{
public required ReferenceByIdModel DocumentType { get; set; }

View File

@@ -5,7 +5,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.DocumentType;
[ShortGenericSchemaName<CreateDocumentTypePropertyTypeRequestModel, CreateDocumentTypePropertyTypeContainerRequestModel>("CreateContentTypeForDocumentTypeRequestModel")]
public class CreateDocumentTypeRequestModel
: CreateContentTypeRequestModelBase<CreateDocumentTypePropertyTypeRequestModel, CreateDocumentTypePropertyTypeContainerRequestModel>
: CreateContentTypeInFolderRequestModelBase<CreateDocumentTypePropertyTypeRequestModel, CreateDocumentTypePropertyTypeContainerRequestModel>
{
public IEnumerable<ReferenceByIdModel> AllowedTemplates { get; set; } = Enumerable.Empty<ReferenceByIdModel>();

View File

@@ -4,7 +4,7 @@ using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Media;
[ShortGenericSchemaName<MediaValueModel, MediaVariantRequestModel>("CreateContentForMediaRequestModel")]
public class CreateMediaRequestModel : CreateContentRequestModelBase<MediaValueModel, MediaVariantRequestModel>
public class CreateMediaRequestModel : CreateContentWithParentRequestModelBase<MediaValueModel, MediaVariantRequestModel>
{
public required ReferenceByIdModel MediaType { get; set; }
}

View File

@@ -5,7 +5,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.MediaType;
[ShortGenericSchemaName<CreateMediaTypePropertyTypeRequestModel, CreateMediaTypePropertyTypeContainerRequestModel>("CreateContentTypeForMediaTypeRequestModel")]
public class CreateMediaTypeRequestModel
: CreateContentTypeRequestModelBase<CreateMediaTypePropertyTypeRequestModel, CreateMediaTypePropertyTypeContainerRequestModel>
: CreateContentTypeInFolderRequestModelBase<CreateMediaTypePropertyTypeRequestModel, CreateMediaTypePropertyTypeContainerRequestModel>
{
public IEnumerable<MediaTypeSort> AllowedMediaTypes { get; set; } = Enumerable.Empty<MediaTypeSort>();

View File

@@ -0,0 +1,20 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
[ShortGenericSchemaName<MemberValueModel, MemberVariantRequestModel>("CreateContentForMemberRequestModel")]
public class CreateMemberRequestModel : CreateContentRequestModelBase<MemberValueModel, MemberVariantRequestModel>
{
public string Email { get; set; } = string.Empty;
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public required ReferenceByIdModel MemberType { get; set; }
public IEnumerable<string>? Groups { get; set; }
public bool IsApproved { get; set; }
}

View File

@@ -1,8 +1,12 @@
using Umbraco.Cms.Api.Management.ViewModels.Item;
using Umbraco.Cms.Api.Management.ViewModels.Content;
using Umbraco.Cms.Api.Management.ViewModels.Item;
using Umbraco.Cms.Api.Management.ViewModels.MemberType;
namespace Umbraco.Cms.Api.Management.ViewModels.Member.Item;
public class MemberItemResponseModel : NamedItemResponseModelBase
{
public string? Icon { get; set; }
public MemberTypeReferenceResponseModel MemberType { get; set; } = new();
public IEnumerable<VariantItemResponseModel> Variants { get; set; } = Enumerable.Empty<VariantItemResponseModel>();
}

View File

@@ -0,0 +1,31 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.Content;
using Umbraco.Cms.Api.Management.ViewModels.MemberType;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
[ShortGenericSchemaName<MemberValueModel, MemberVariantResponseModel>("ContentForMemberResponseModel")]
public class MemberResponseModel : ContentResponseModelBase<MemberValueModel, MemberVariantResponseModel>
{
public string Email { get; set; } = string.Empty;
public string Username { get; set; } = string.Empty;
public MemberTypeReferenceResponseModel MemberType { get; set; } = new();
public bool IsApproved { get; set; }
public bool IsLockedOut { get; set; }
public bool IsTwoFactorEnabled { get; set; }
public int FailedPasswordAttempts { get; set; }
public DateTime? LastLoginDate { get; set; }
public DateTime? LastLockoutDate { get; set; }
public DateTime? LastPasswordChangeDate { get; set; }
public IEnumerable<string> Groups { get; set; } = [];
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
public class MemberValueModel : ValueModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
public class MemberVariantRequestModel : VariantModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
public class MemberVariantResponseModel : VariantResponseModelBase
{
}

View File

@@ -0,0 +1,24 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.Content;
namespace Umbraco.Cms.Api.Management.ViewModels.Member;
[ShortGenericSchemaName<MemberValueModel, MemberVariantRequestModel>("UpdateContentForMemberRequestModel")]
public class UpdateMemberRequestModel : UpdateContentRequestModelBase<MemberValueModel, MemberVariantRequestModel>
{
public string Email { get; set; } = string.Empty;
public string Username { get; set; } = string.Empty;
public string? OldPassword { get; set; }
public string? NewPassword { get; set; }
public IEnumerable<string>? Groups { get; set; }
public bool IsApproved { get; set; }
public bool IsLockedOut { get; set; }
public bool IsTwoFactorEnabled { get; set; }
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class AvailableMemberTypeCompositionResponseModel : AvailableContentTypeCompositionResponseModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class CreateMemberTypePropertyTypeContainerRequestModel : PropertyTypeContainerModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class CreateMemberTypePropertyTypeRequestModel : PropertyTypeModelBase
{
}

View File

@@ -0,0 +1,11 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
[ShortGenericSchemaName<CreateMemberTypePropertyTypeRequestModel, CreateMemberTypePropertyTypeContainerRequestModel>("CreateContentTypeForMemberTypeRequestModel")]
public class CreateMemberTypeRequestModel
: CreateContentTypeRequestModelBase<CreateMemberTypePropertyTypeRequestModel, CreateMemberTypePropertyTypeContainerRequestModel>
{
public IEnumerable<MemberTypeComposition> Compositions { get; set; } = Enumerable.Empty<MemberTypeComposition>();
}

View File

@@ -0,0 +1,10 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypeComposition
{
public required ReferenceByIdModel MemberType { get; init; }
public required CompositionType CompositionType { get; init; }
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypeCompositionRequestModel : ContentTypeCompositionRequestModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypeCompositionResponseModel : ContentTypeCompositionResponseModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypePropertyTypeContainerResponseModel : PropertyTypeContainerModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypePropertyTypeResponseModel : PropertyTypeModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class MemberTypeReferenceResponseModel : ContentTypeReferenceResponseModelBase
{
}

View File

@@ -0,0 +1,10 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
[ShortGenericSchemaName<MemberTypePropertyTypeResponseModel, MemberTypePropertyTypeContainerResponseModel>("ContentTypeForMemberTypeResponseModel")]
public class MemberTypeResponseModel : ContentTypeResponseModelBase<MemberTypePropertyTypeResponseModel, MemberTypePropertyTypeContainerResponseModel>
{
public IEnumerable<MemberTypeComposition> Compositions { get; set; } = Enumerable.Empty<MemberTypeComposition>();
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class UpdateMemberTypePropertyTypeContainerRequestModel : PropertyTypeContainerModelBase
{
}

View File

@@ -0,0 +1,7 @@
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
public class UpdateMemberTypePropertyTypeRequestModel : PropertyTypeModelBase
{
}

View File

@@ -0,0 +1,11 @@
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Management.ViewModels.ContentType;
namespace Umbraco.Cms.Api.Management.ViewModels.MemberType;
[ShortGenericSchemaName<UpdateMemberTypePropertyTypeRequestModel, UpdateMemberTypePropertyTypeContainerRequestModel>("UpdateContentTypeForMemberTypeRequestModel")]
public class UpdateMemberTypeRequestModel
: UpdateContentTypeRequestModelBase<UpdateMemberTypePropertyTypeRequestModel, UpdateMemberTypePropertyTypeContainerRequestModel>
{
public IEnumerable<MemberTypeComposition> Compositions { get; set; } = Enumerable.Empty<MemberTypeComposition>();
}