Skip to content

Commit

Permalink
Merge pull request #12 from OpenMAVN/8-add-email-verification
Browse files Browse the repository at this point in the history
#8 add email verification
  • Loading branch information
vitaliidasaev committed Apr 25, 2020
2 parents b485de6 + a775be5 commit afeffd7
Show file tree
Hide file tree
Showing 49 changed files with 1,262 additions and 216 deletions.
13 changes: 12 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,15 @@ csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_anonymous_types = true

# underscore
dotnet_naming_rule.private_members_with_underscore.symbols = private_fields
dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = suggestion

dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _
14 changes: 11 additions & 3 deletions client/MAVN.Service.AdminManagement.Client/IAdminsClient.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using MAVN.Service.AdminManagement.Client.Models;
using MAVN.Service.AdminManagement.Client.Models.Requests;
using MAVN.Service.AdminManagement.Client.Models.Requests.Verification;
using MAVN.Service.AdminManagement.Client.Models.Responses.Verification;
using Refit;

namespace MAVN.Service.AdminManagement.Client
Expand All @@ -30,6 +30,14 @@ public interface IAdminsClient
[Post("/api/admins/register")]
Task<RegistrationResponseModel> RegisterAsync([Body] RegistrationRequestModel request);

/// <summary>
/// Confirm Email in the system.
/// </summary>
/// <param name="request">Request.</param>
/// <returns><see cref="VerificationCodeConfirmationResponseModel"/></returns>
[Post("/api/admins/confirmemail")]
Task<VerificationCodeConfirmationResponseModel> ConfirmEmailAsync([Body] VerificationCodeConfirmationRequestModel request);

/// <summary>
/// Update admin data.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using JetBrains.Annotations;

Expand All @@ -22,6 +22,8 @@ public class AdminUser
/// Email address of the Admin
/// </summary>
public string Email { get; set; }
/// <summary>Email Verified flag.</summary>
public string IsEmailVerified { get; set; }
/// <summary>
/// First Name
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace MAVN.Service.AdminManagement.Client.Models.Enums
{
/// <summary>Localization</summary>
public enum Localization
{
/// <summary>En</summary>
En = 0,
/// <summary>De</summary>
De
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using JetBrains.Annotations;

namespace MAVN.Service.AdminManagement.Client.Models.Enums
{
/// <summary>
/// Enum for verification code errors.
/// </summary>
[PublicAPI]
public enum VerificationCodeError
{
/// <summary>ErrorCode: None</summary>
None,
/// <summary>ErrorCode: AlreadyVerified</summary>
AlreadyVerified,
/// <summary>ErrorCode: Verification code does not exist</summary>
VerificationCodeDoesNotExist,
/// <summary>ErrorCode: VerificationCodeMismatch</summary>
VerificationCodeMismatch,
/// <summary>ErrorCode: VerificationCodeExpired</summary>
VerificationCodeExpired,
/// <summary>Admin does not exist</summary>
AdminDoesNotExist,
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using JetBrains.Annotations;
using MAVN.Service.AdminManagement.Client.Models.Requests;
using MAVN.Service.AdminManagement.Client.Models.Enums;

namespace MAVN.Service.AdminManagement.Client.Models
{
Expand Down Expand Up @@ -46,5 +46,8 @@ public class RegistrationRequestModel
/// <summary>Back Office Permissions</summary>
[Required]
public IReadOnlyList<AdminPermission> Permissions { get; set; }

/// <summary>Localization</summary>
public Localization Localization { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
using JetBrains.Annotations;

namespace MAVN.Service.AdminManagement.Client.Models.Requests.Verification
{
/// <summary>
/// Confirm verification code request model.
/// </summary>
[PublicAPI]
public class VerificationCodeConfirmationRequestModel
{
/// <summary>Verification code value</summary>
[Required]
public string VerificationCode { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using JetBrains.Annotations;
using MAVN.Service.AdminManagement.Client.Models.Enums;

namespace MAVN.Service.AdminManagement.Client.Models.Responses.Verification
{
/// <summary>
/// ConfirmEmail response model.
/// </summary>
[PublicAPI]
public class VerificationCodeConfirmationResponseModel
{
/// <summary>Is verified</summary>
public bool IsVerified { get; set; }

/// <summary>Error</summary>
public VerificationCodeError Error { get; set; }
}
}
9 changes: 9 additions & 0 deletions settings.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,22 @@ AdminManagementService:
settings-key: AdminManagementService-Redis-InstanceName
Ttl:
settings-key: AdminManagementService-Redis-Ttl
LimitationSettings:
EmailVerificationMaxAllowedRequestsNumber:
settings-key: CustomerManagementService-EmailVerificationMaxAllowedRequestsNumber
EmailVerificationCallsMonitoredPeriod:
settings-key: CustomerManagementService-EmailVerificationCallsMonitoredPeriod
BackOfficeLink:
settings-key: AdminManagementService-BackOfficeLink
AdminCreatedEmail:
EmailTemplateId:
settings-key: AdminManagementService-AdminCreatedEmail-EmailTemplateId
SubjectTemplateId:
settings-key: AdminManagementService-AdminCreatedEmail-SubjectTemplateId
VerificationLinkExpirePeriod:
settings-key: AdminManagementService-AdminCreatedEmail-VerificationLinkExpirePeriod
VerificationLinkPath:
settings-key: AdminManagementService-AdminCreatedEmail-VerificationLinkPath
PasswordResetEmail:
EmailTemplateId:
settings-key: AdminManagementService-PasswordResetEmail-EmailTemplateId
Expand Down
8 changes: 8 additions & 0 deletions src/MAVN.Service.AdminManagement.Domain/Enums/Localization.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace MAVN.Service.AdminManagement.Domain.Enums
{
public enum Localization
{
En = 0,
De
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace MAVN.Service.AdminManagement.Domain.Enums
{
public enum VerificationCodeError
{
None,
AlreadyVerified,
VerificationCodeDoesNotExist,
VerificationCodeMismatch,
VerificationCodeExpired,
AdminDoesNotExist,
}
}
5 changes: 4 additions & 1 deletion src/MAVN.Service.AdminManagement.Domain/Models/AdminUser.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;

namespace MAVN.Service.AdminManagement.Domain.Models
Expand All @@ -18,6 +18,9 @@ public class AdminUser
/// </summary>
public string Email { get; set; }

/// <summary>Email Verified flag.</summary>
public bool IsEmailVerified { get; set; }

/// <summary>
/// The first name.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;

namespace MAVN.Service.AdminManagement.Domain.Models
{
public class CallRateLimitSettingsDto
{
public int EmailVerificationMaxAllowedRequestsNumber { get; set; }
public TimeSpan EmailVerificationCallsMonitoredPeriod { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using MAVN.Service.AdminManagement.Domain.Enums;

namespace MAVN.Service.AdminManagement.Domain.Models.Emails
{
public class AdminCreatedEmailDto
{
public string AdminUserId { get; set; }
public string Email { get; set; }
public string EmailVerificationCode { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public Localization Localization { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Collections.Generic;
using MAVN.Service.AdminManagement.Domain.Enums;

namespace MAVN.Service.AdminManagement.Domain.Models
{
public class RegistrationRequestDto
{
public string Email { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string Company { get; set; }
public string Department { get; set; }
public string JobTitle { get; set; }
public IReadOnlyList<Permission> Permissions { get; set; }
public Localization Localization { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using MAVN.Service.AdminManagement.Domain.Enums;

namespace MAVN.Service.AdminManagement.Domain.Models.Verification
{
public class ConfirmVerificationCodeResultModel
{
public bool IsVerified { get; set; }

public VerificationCodeError Error { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;

namespace MAVN.Service.AdminManagement.Domain.Models.Verification
{
public interface IVerificationCode
{
string AdminId { get; set; }

string VerificationCode { get; set; }

bool IsVerified { get; set; }

DateTime ExpireDate { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using MAVN.Service.AdminManagement.Domain.Enums;

namespace MAVN.Service.AdminManagement.Domain.Models.Verification
{
public class VerificationCodeResult
{
public VerificationCodeError Error { get; private set; }

public DateTime? ExpiresAt { get; private set; }

public static VerificationCodeResult Succeeded(DateTime expiresAt)
{
return new VerificationCodeResult
{
ExpiresAt = expiresAt
};
}

public static VerificationCodeResult Failed(VerificationCodeError error)
{
return new VerificationCodeResult
{
Error = error
};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Threading.Tasks;
using MAVN.Service.AdminManagement.Domain.Models.Verification;

namespace MAVN.Service.AdminManagement.Domain.Repositories
{
public interface IEmailVerificationCodeRepository
{
Task<IVerificationCode> CreateOrUpdateAsync(string adminId, string verificationCode);
Task<IVerificationCode> GetByValueAsync(string value);
Task SetAsVerifiedAsync(string value);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Threading.Tasks;
using MAVN.Service.AdminManagement.Domain.Enums;
using MAVN.Service.AdminManagement.Domain.Models;
Expand Down Expand Up @@ -29,16 +29,7 @@ public interface IAdminUserService
string adminUserId,
List<Permission> permissions);

Task<RegistrationResultModel> RegisterAsync(
string email,
string password,
string firstName,
string lastName,
string phoneNumber,
string company,
string department,
string jobTitle,
IReadOnlyList<Permission> permissions);
Task<RegistrationResultModel> RegisterAsync(RegistrationRequestDto model);

Task<AdminUserResult> GetByIdAsync(string adminId);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Threading.Tasks;

namespace MAVN.Service.AdminManagement.Domain.Services
{
public interface ICallRateLimiterService
{
Task ClearAllCallRecordsForEmailVerificationAsync(string adminId);

Task RecordEmailVerificationCallAsync(string adminId);

Task<bool> IsAllowedToCallEmailVerificationAsync(string adminId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Threading.Tasks;
using MAVN.Service.AdminManagement.Domain.Models.Verification;

namespace MAVN.Service.AdminManagement.Domain.Services
{
public interface IEmailVerificationService
{
/// <summary>
/// Confirms verification code
/// </summary>
/// <param name="verificationCode">Verification code value in base64 format</param>
/// <returns></returns>
Task<ConfirmVerificationCodeResultModel> ConfirmCodeAsync(string verificationCode);
}
}
Loading

0 comments on commit afeffd7

Please sign in to comment.