71 lines
2.2 KiB
C#
71 lines
2.2 KiB
C#
using Knoks.Core.Entities;
|
|
using Knoks.Core.Logic.Interfaces;
|
|
using Knoks.Framework.Extentions;
|
|
using Knoks.Framework.Services;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Knoks.Core.Logic.Managers
|
|
{
|
|
public class PhoneManager : IPhoneManager
|
|
{
|
|
private const string PassPhoneEnd = "123456", PassPinCode = "1234";
|
|
|
|
private IPhoneService _phoneService;
|
|
private ISmsService _smsService;
|
|
|
|
public PhoneManager(IPhoneService phoneService, ISmsService smsService)
|
|
{
|
|
_phoneService = phoneService;
|
|
_smsService = smsService;
|
|
}
|
|
|
|
public bool IsPassPhoneNumber(PhoneNumber phoneSet)
|
|
{
|
|
return IsPassPhoneNumber(phoneSet.E164Format);
|
|
}
|
|
|
|
public bool IsPassPhoneNumber(string phoneNumber)
|
|
{
|
|
return phoneNumber.EndsWith(PassPhoneEnd);
|
|
}
|
|
|
|
public bool IsFormatted(PhoneNumber phoneNumber)
|
|
{
|
|
return phoneNumber.OriginalFormat != null && (phoneNumber.NationalFormat == null || phoneNumber.E164Format == null || phoneNumber.CountryCode2 == null);
|
|
}
|
|
|
|
public async Task<PhoneNumber> GetPhoneNumber(string phoneNumber, string countryCode = null)
|
|
{
|
|
var phoneSet = await _phoneService.Lookup(phoneNumber, countryCode);
|
|
if (phoneSet == null)
|
|
{
|
|
throw new InvalidOperationException($"Invalid phone number: {phoneNumber}");
|
|
}
|
|
|
|
return phoneSet;
|
|
}
|
|
|
|
private static readonly int[] PinCodeBuilderArray = new int[] { 6, 5, 3, 1 };
|
|
public string GetPinCode(PhoneNumber phoneNumber)
|
|
{
|
|
if (IsPassPhoneNumber(phoneNumber))
|
|
return PassPinCode;
|
|
|
|
return string.Concat(PinCodeBuilderArray.Select(i => phoneNumber.E164Format[i] - 48));
|
|
}
|
|
|
|
private static readonly Regex PinRegex = new Regex("{pin}", RegexOptions.IgnoreCase);
|
|
|
|
public bool IsValidPinCode(PhoneNumber phoneNumber, string pinCode)
|
|
{
|
|
if (IsPassPhoneNumber(phoneNumber) && pinCode == PassPinCode)
|
|
return true;
|
|
|
|
return pinCode == GetPinCode(phoneNumber);
|
|
}
|
|
}
|
|
}
|