220 lines
6.4 KiB
C#
220 lines
6.4 KiB
C#
using System.Threading.Tasks;
|
|
using xCommons.Extensions;
|
|
using xIdentityModels.Extensions;
|
|
using xIdentityModels.Models;
|
|
using xIdentityModels.Navigations;
|
|
|
|
namespace xIds.Providers
|
|
{
|
|
public partial class XIdentityManager
|
|
{
|
|
//
|
|
#region Verification Code Actions ...
|
|
/// <summary>
|
|
/// Check a Device Requeste for Verification Code before or not
|
|
/// </summary>
|
|
/// <param name="device">an instance of <see>XDevice</see></param>
|
|
/// <returns>a boolean value</returns>
|
|
private async Task<bool> IsDeviceRequestedForVerificationCodeBefor(
|
|
XDevice device
|
|
)
|
|
{
|
|
//
|
|
var result = false;
|
|
var enumerator = DbContext.VerificationRequests
|
|
.AsAsyncEnumerable();
|
|
await
|
|
foreach (var entity in enumerator)
|
|
{
|
|
//
|
|
if (entity.Device.IsSameAs(device))
|
|
{
|
|
//
|
|
result = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check a Verification Code Requested before or not
|
|
/// </summary>
|
|
/// <param name="verificationCode">Confirm Verification Code</param>
|
|
/// <returns>a boolean value</returns>
|
|
private async Task<bool> IsVerificationCodeRequested(
|
|
string verificationCode
|
|
)
|
|
{
|
|
//
|
|
// Validate Args ...
|
|
if (verificationCode.IsNullOrEmpty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//
|
|
var result = false;
|
|
var enumerator = DbContext.VerificationRequests
|
|
.AsAsyncEnumerable();
|
|
await
|
|
foreach (var entity in enumerator)
|
|
{
|
|
//
|
|
if (entity.VerificationCode == verificationCode)
|
|
{
|
|
//
|
|
result = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Retrieve Verification Request
|
|
/// </summary>
|
|
/// <param name="device">an instance of <see>XDevice</see></param>
|
|
/// <returns>an instance of <see>XVerificationRequest</see></returns>
|
|
private async Task<XVerificationRequest> GetVerificationRequest(
|
|
XDevice device
|
|
)
|
|
{
|
|
//
|
|
XVerificationRequest result = null;
|
|
var enumerator = DbContext.VerificationRequests
|
|
.AsAsyncEnumerable();
|
|
await
|
|
foreach (var entity in enumerator)
|
|
{
|
|
//
|
|
if (entity.Device.IsSameAs(device))
|
|
{
|
|
//
|
|
result = entity;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Retrieve Verification Request
|
|
/// </summary>
|
|
/// <param name="verificationCode">Confirm Verification Code</param>
|
|
/// <returns>an instance of <see>XVerificationRequest</see></returns>
|
|
private async Task<XVerificationRequest> GetVerificationRequest(
|
|
string verificationCode
|
|
)
|
|
{
|
|
//
|
|
XVerificationRequest result = null;
|
|
var enumerator = DbContext.VerificationRequests
|
|
.AsAsyncEnumerable();
|
|
await
|
|
foreach (var entity in enumerator)
|
|
{
|
|
//
|
|
if (entity.VerificationCode == verificationCode)
|
|
{
|
|
//
|
|
result = entity;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove Exists Verification Code Request
|
|
/// </summary>
|
|
/// <param name="device">an instance of <see>XDevice</see></param>
|
|
/// <param name="saveChanges">save changes on DbContext, default is true</param>
|
|
/// <returns></returns>
|
|
private async Task RemoveVerificationCodeRequestByDevice(
|
|
XDevice device,
|
|
bool saveChanges = true
|
|
)
|
|
{
|
|
//
|
|
if (!await IsDeviceRequestedForVerificationCodeBefor(device))
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
var xvr = await GetVerificationRequest(device);
|
|
DbContext.VerificationRequests.Remove(xvr);
|
|
|
|
//
|
|
if (saveChanges)
|
|
{
|
|
await DbContext.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove Exists Verification Code Request
|
|
/// </summary>
|
|
/// <param name="verificationCode">Confirm Verification Code</param>
|
|
/// <param name="saveChanges">save changes on DbContext, default is true</param>
|
|
/// <returns></returns>
|
|
private async Task RemoveVerificationRequest(
|
|
string verificationCode,
|
|
bool saveChanges = true
|
|
)
|
|
{
|
|
//
|
|
ValidationProvider.NotEmpty(verificationCode);
|
|
|
|
//
|
|
var request = await GetVerificationRequest(verificationCode);
|
|
DbContext.VerificationRequests.Remove(request);
|
|
|
|
//
|
|
if (saveChanges)
|
|
{
|
|
await DbContext.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add Verification Code Request
|
|
/// </summary>
|
|
/// <param name="request">an instance of <see>XVerificationRequest</see></param>
|
|
/// <param name="saveChanges">save changes on DbContext, default is true</param>
|
|
/// <returns>an instance of <see>XVerificationRequest</see></returns>
|
|
private async Task<XVerificationRequest> AddVerificationRequest(
|
|
XVerificationRequest request,
|
|
bool saveChanges = true
|
|
)
|
|
{
|
|
//
|
|
if (await IsDeviceRequestedForVerificationCodeBefor(request.Device))
|
|
{
|
|
await RemoveVerificationCodeRequestByDevice(request.Device);
|
|
}
|
|
|
|
//
|
|
var entry = await DbContext.VerificationRequests.AddAsync(request);
|
|
|
|
//
|
|
if (saveChanges)
|
|
{
|
|
await DbContext.SaveChangesAsync();
|
|
}
|
|
|
|
//
|
|
return entry.Entity;
|
|
}
|
|
#endregion
|
|
}
|
|
} |