Files
xSaherElmIds/Providers/XIdentityManager/XIdentityManager+VerificationCode.cs
2026-03-22 14:08:25 +03:30

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
}
}