Skip to content

Commit

Permalink
Merge pull request #62 from Kentico/feat/import-members
Browse files Browse the repository at this point in the history
Support for importing members
  • Loading branch information
akfakmot authored Oct 11, 2024
2 parents d222fa2 + 460b50c commit 338d3a7
Show file tree
Hide file tree
Showing 12 changed files with 255 additions and 3 deletions.
36 changes: 36 additions & 0 deletions docs/Model/MemberInfoModel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!-- generated file with tool "Kentico.Xperience.UMT.DocUtils" - edited through template "UmtModel.cshtml" -->
## MemberInfoModel
Model represents XbyK MemberInfo

Model [discriminator](../UmtModel.md#discriminator): `MemberInfo`

|PropertyName|Summary|.NET Type|Notes|
|---|---|---|---|
|MemberName\*|member name / login name - must be unique|string?||
|MemberEmail\*|valid email address according to XbyK API domain requirements (ValidationHelper.IsEmail()) or custom regex set through configuration "CMSEmailValidationRegex"|string?||
|MemberPassword|hashed member password|string?||
|MemberEnabled\*|disable/enable member|bool?||
|MemberCreated|datetime of member creation, defaults to current server time|System.DateTime?||
|MemberGUID\*|uniqueId of member used for reference in other models|System.Guid?|[UniqueId](../UmtModel.md#UniqueId)|
|MemberIsExternal\*||bool?||
|MemberSecurityStamp||string?||
|[customPropertyName]|custom property defined by created [DataClass](./DataClassModel.md)|.NET type defined by data class field||

<p>*) value is required</p>


### Instance of dataclass MemberInfo - Sample member without custom fields
Sample demonstrates how to create a member without custom fields
```json
{
"$type": "MemberInfo",
"MemberName": "John Doe",
"MemberEmail": "[email protected]",
"MemberPassword": "[sample hash]",
"MemberEnabled": true,
"MemberCreated": "2003-02-01T04:05:06.007Z",
"MemberGUID": "4834f3c4-f7a5-46b8-a83d-607fcfc555d7",
"MemberIsExternal": false,
"MemberSecurityStamp": "[sample security stamp]"
}
```
74 changes: 73 additions & 1 deletion docs/Model/UMT.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -989,7 +989,7 @@
"properties": {
"UserName": {
"type": "string",
"description": "user nane / login name - must be unique",
"description": "user name / login name - must be unique",
"minLength": 1
},
"FirstName": {
Expand Down Expand Up @@ -1084,6 +1084,78 @@
}
]
},
"MemberInfoModel": {
"allOf": [
{
"$ref": "#/definitions/UmtModel"
},
{
"type": "object",
"description": "Model represents XbyK MemberInfo",
"additionalProperties": {
"oneOf": [
{},
{
"type": "null"
}
]
},
"required": [
"MemberName",
"MemberEmail",
"MemberEnabled",
"MemberGUID",
"MemberIsExternal"
],
"properties": {
"MemberName": {
"type": "string",
"description": "member name / login name - must be unique",
"minLength": 1
},
"MemberEmail": {
"type": "string",
"description": "valid email address according to XbyK API domain requirements (ValidationHelper.IsEmail()) or custom regex set through configuration \"CMSEmailValidationRegex\"",
"minLength": 1
},
"MemberPassword": {
"type": [
"null",
"string"
],
"description": "hashed member password"
},
"MemberEnabled": {
"type": "boolean",
"description": "disable/enable member"
},
"MemberCreated": {
"type": [
"null",
"string"
],
"description": "datetime of member creation, defaults to current server time ",
"format": "date-time"
},
"MemberGUID": {
"type": "string",
"description": "uniqueId of member used for reference in other models ",
"format": "guid",
"minLength": 1
},
"MemberIsExternal": {
"type": "boolean"
},
"MemberSecurityStamp": {
"type": [
"null",
"string"
]
}
}
}
]
},
"WebPageItemModel": {
"allOf": [
{
Expand Down
2 changes: 1 addition & 1 deletion docs/Model/UserInfoModel.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Model [discriminator](../UmtModel.md#discriminator): `UserInfo`

|PropertyName|Summary|.NET Type|Notes|
|---|---|---|---|
|UserName\*|user nane / login name - must be unique|string?||
|UserName\*|user name / login name - must be unique|string?||
|FirstName|First name of user|string?||
|LastName|Last name of user|string?||
|Email\*|valid email address according to XbyK API domain requirements (ValidationHelper.IsEmail()) or custom regex set through configuration "CMSEmailValidationRegex"|string?||
Expand Down
11 changes: 11 additions & 0 deletions docs/Samples/basic.json
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,17 @@
"UserAdministrationAccess": true,
"UserIsExternal": false
},
{
"$type": "MemberInfo",
"MemberName": "John Doe",
"MemberEmail": "[email protected]",
"MemberPassword": "[sample hash]",
"MemberEnabled": true,
"MemberCreated": "2003-02-01T04:05:06.007Z",
"MemberGUID": "4834f3c4-f7a5-46b8-a83d-607fcfc555d7",
"MemberIsExternal": false,
"MemberSecurityStamp": "[sample security stamp]"
},
{
"$type": "ContentLanguage",
"ContentLanguageGUID": "f454e93b-5fe9-42a9-b1af-b572234ed9c4",
Expand Down
11 changes: 11 additions & 0 deletions examples/Kentico.Xperience.UMT.Example.AdminApp/Data/Samples.json
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,17 @@
"UserAdministrationAccess": true,
"UserIsExternal": false
},
{
"$type": "MemberInfo",
"MemberName": "John Doe",
"MemberEmail": "[email protected]",
"MemberPassword": "[sample hash]",
"MemberEnabled": true,
"MemberCreated": "2003-02-01T04:05:06.007Z",
"MemberGUID": "4834f3c4-f7a5-46b8-a83d-607fcfc555d7",
"MemberIsExternal": false,
"MemberSecurityStamp": "[sample security stamp]"
},
{
"$type": "ContentLanguage",
"ContentLanguageGUID": "f454e93b-5fe9-42a9-b1af-b572234ed9c4",
Expand Down
4 changes: 4 additions & 0 deletions examples/Kentico.Xperience.UMT.Examples/SampleProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ public static List<IUmtModel> GetFullSample()
// sample data
sourceData.AddRange([
UserSamples.SampleAdministrator,

MemberSamples.SampleMemberNoCustomFields,
//MemberSamples.SampleMemberWithCustomFields, // Intentionally not included, because the included custom fields are not by default present in boilerplate project

ContentLanguageSamples.SampleContentLanguageEnUs,
ContentLanguageSamples.SampleContentLanguageEnGb,
ContentLanguageSamples.SampleContentLanguageEs,
Expand Down
37 changes: 37 additions & 0 deletions examples/Kentico.Xperience.UMT.Examples/Samples/MemberSamples.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Kentico.Xperience.UMT.Model;

namespace Kentico.Xperience.UMT.Examples;

public static class MemberSamples
{
[Sample("memberinfo.sample.nocustomfields", "Sample demonstrates how to create a member without custom fields", "Instance of dataclass MemberInfo - Sample member without custom fields")]
public static MemberInfoModel SampleMemberNoCustomFields => new()
{
MemberGUID = new Guid("4834F3C4-F7A5-46B8-A83D-607FCFC555D7"),
MemberEmail = "[email protected]",
MemberName = "John Doe",
MemberCreated = new DateTime(2003, 02, 01, 4, 5, 6, 7, DateTimeKind.Utc),
MemberEnabled = true,
MemberIsExternal = false,
MemberPassword = "[sample hash]",
MemberSecurityStamp = "[sample security stamp]"
};

[Sample("memberinfo.sample.withcustomfields", "Sample demonstrates how to create a member with custom fields. Prior to usage, add the Member custom fields (see XbyK docs)", "Instance of dataclass MemberInfo - Sample member with custom fields")]
public static MemberInfoModel SampleMemberWithCustomFields => new()
{
MemberGUID = new Guid("3DBA2983-33A3-46F5-B77C-EAC89FDB9559"),
MemberEmail = "[email protected]",
MemberName = "Martin Atkins",
MemberCreated = new DateTime(2004, 06, 07, 3, 0, 0, 0, DateTimeKind.Utc),
MemberEnabled = true,
MemberIsExternal = false,
MemberPassword = "[sample hash]",
MemberSecurityStamp = "[sample security stamp]",
CustomProperties =
{
["MemberCity"] = "New York",
["MemberScore"] = 5,
}
};
}
1 change: 1 addition & 0 deletions src/Kentico.Xperience.UMT/InfoAdapter/AdapterFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ internal class AdapterFactory(ILoggerFactory loggerFactory, UmtModelService mode
return umtModel switch
{
UserInfoModel => new UserAdapter(loggerFactory.CreateLogger<UserAdapter>(), adapterContext),
MemberInfoModel => new MemberAdapter(loggerFactory.CreateLogger<MemberAdapter>(), adapterContext),
MediaFileModel => new MediaFileAdapter(loggerFactory.CreateLogger<MediaFileAdapter>(), adapterContext),
MediaLibraryModel => new GenericInfoAdapter<MediaLibraryInfo>(loggerFactory.CreateLogger<GenericInfoAdapter<MediaLibraryInfo>>(), adapterContext),
ContentItemLanguageMetadataModel => new GenericInfoAdapter<ContentItemLanguageMetadataInfo>(loggerFactory.CreateLogger<GenericInfoAdapter<ContentItemLanguageMetadataInfo>>(), adapterContext),
Expand Down
11 changes: 11 additions & 0 deletions src/Kentico.Xperience.UMT/InfoAdapter/MemberAdapter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using CMS.Membership;
using Microsoft.Extensions.Logging;

namespace Kentico.Xperience.UMT.InfoAdapter;

internal class MemberAdapter : GenericInfoAdapter<MemberInfo>
{
internal MemberAdapter(ILogger<MemberAdapter> logger, GenericInfoAdapterContext context) : base(logger, context)
{
}
}
1 change: 1 addition & 0 deletions src/Kentico.Xperience.UMT/Model/Auxiliary/UmtModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public interface IUmtModel
[KnownType(typeof(MediaFileModel))]
[KnownType(typeof(MediaLibraryModel))]
[KnownType(typeof(UserInfoModel))]
[KnownType(typeof(MemberInfoModel))]
[KnownType(typeof(WebPageItemModel))]
[KnownType(typeof(WebPageAclModel))]
[KnownType(typeof(WebPageUrlPathModel))]
Expand Down
68 changes: 68 additions & 0 deletions src/Kentico.Xperience.UMT/Model/MemberInfoModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// ReSharper disable InconsistentNaming

using System.ComponentModel.DataAnnotations;
using Kentico.Xperience.UMT.Attributes;

namespace Kentico.Xperience.UMT.Model;

/// <summary>
/// Model represents XbyK MemberInfo
/// </summary>
/// <sample>memberinfo.sample.nocustomfields</sample>
[UmtModel(DISCRIMINATOR)]
public class MemberInfoModel : UmtModel
{
/// <summary>
/// Discriminator used in serialized structures to identify model
/// </summary>
public const string DISCRIMINATOR = "MemberInfo";

/// <summary>
/// member name / login name - must be unique
/// </summary>
[Map]
[Required]
public string? MemberName { get; set; }

/// <summary>
/// valid email address according to XbyK API domain requirements (ValidationHelper.IsEmail()) or custom regex set through configuration "CMSEmailValidationRegex"
/// </summary>
[Map]
[Required]
public string? MemberEmail { get; set; }

/// <summary>
/// hashed member password
/// </summary>
[Map]
public string? MemberPassword { get; set; }

/// <summary>
/// disable/enable member
/// </summary>
[Map]
[Required]
public bool? MemberEnabled { get; set; }

/// <summary>
/// datetime of member creation, defaults to current server time
/// </summary>
[Map]
public DateTime? MemberCreated { get; set; }

/// <summary>
/// uniqueId of member used for reference in other models
/// </summary>
[UniqueIdProperty]
[Required]
public Guid? MemberGUID { get; set; }

[Map]
[Required]
public bool? MemberIsExternal { get; set; }

[Map]
public string? MemberSecurityStamp { get; set; }

protected override (Guid? uniqueId, string? name, string? displayName) GetPrintArgs() => (MemberGUID, MemberName, NOT_AVAILABLE);
}
2 changes: 1 addition & 1 deletion src/Kentico.Xperience.UMT/Model/UserInfoModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class UserInfoModel : UmtModel
#pragma warning restore S125

/// <summary>
/// user nane / login name - must be unique
/// user name / login name - must be unique
/// </summary>
[Map]
[Required]
Expand Down

0 comments on commit 338d3a7

Please sign in to comment.