using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.SignalR;
using xCommons.Constants;
using xCommons.Extensions;
using xCommons.Helpers;
using xIdentityModels.Constants;
using xPushService.Models;
namespace xPushService.Extensions
{
public static class ClaimsPrincipalExtensions
{
///
/// Generate User Info based on HubCallerContext ...
///
///
///
public static XHubUserInfo GetUserInfo(this HubCallerContext source)
{
//
XHubUserInfo result = null;
//
if (source.IsNull() || source.User.IsNull() || !source.User.Claims.HasChild())
{
return result;
}
//
result = new XHubUserInfo
{
UserId = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.UserId)?.Value ?? "",
UserName = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.UserName)?.Value ?? "",
FirstName = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.FirstName)?.Value ?? "",
LastName = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.LastName)?.Value ?? "",
Picture = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.Picture)?.Value ?? "",
Email = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.Email)?.Value ?? null,
PhoneNumber = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.PhoneNumber)?.Value ?? null,
};
//
#region Handle Gender ...
var genders = ObjectHelper.ToEnumerableKeys();
var genderStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.Gender).Value ?? null;
if (genderStr.IsNullOrEmpty())
{
result.Gender = XGender.Male;
}
else
{
result.Gender = genderStr.GetValue();
}
#endregion
//
#region Handle IsBanned ...
var isBannedStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.IsBanned).Value ?? null;
if (isBannedStr.IsNullOrEmpty())
{
result.IsBanned = false;
}
else
{
//
var isBanned = false;
Boolean.TryParse(isBannedStr, out isBanned);
//
result.IsBanned = isBanned;
}
#endregion
//
#region Handle IsEnabled ...
var isEnabledStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.IsEnabled).Value ?? null;
if (isEnabledStr.IsNullOrEmpty())
{
result.IsEnabled = false;
}
else
{
//
var isEnabled = false;
Boolean.TryParse(isEnabledStr, out isEnabled);
//
result.IsEnabled = isEnabled;
}
#endregion
//
#region Handle Email Confirmed ...
var emailConfirmedStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.EmailVerified).Value ?? null;
if (emailConfirmedStr.IsNullOrEmpty())
{
result.EmailConfirmed = false;
}
else
{
//
var emailConfirmed = false;
Boolean.TryParse(emailConfirmedStr, out emailConfirmed);
//
result.EmailConfirmed = emailConfirmed;
}
#endregion
//
#region Handle PhoneNumber Confirmed ...
var phoneNumberConfirmedStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.PhoneNumberVerified).Value ?? null;
if (phoneNumberConfirmedStr.IsNullOrEmpty())
{
result.PhoneNumberConfirmed = false;
}
else
{
//
var phoneNumberConfirmed = false;
Boolean.TryParse(phoneNumberConfirmedStr, out phoneNumberConfirmed);
//
result.PhoneNumberConfirmed = phoneNumberConfirmed;
}
#endregion
//
#region Handle ExpiredOn ...
var expiredOnStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.ExpiredOn).Value ?? null;
if (expiredOnStr.IsNullOrEmpty())
{
result.ExpiredOn = null;
}
else
{
//
long expiredOn = 0;
long.TryParse(expiredOnStr, out expiredOn);
//
result.ExpiredOn = expiredOn;
}
#endregion
//
#region Handle AuthenticatedOn ...
var authenticatedOnStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.AuthenticatedOn).Value ?? null;
if (authenticatedOnStr.IsNullOrEmpty())
{
result.AuthenticatedOn = null;
}
else
{
//
long authenticatedOn = 0;
long.TryParse(authenticatedOnStr, out authenticatedOn);
//
result.AuthenticatedOn = authenticatedOn;
}
#endregion
//
#region Handle BrithDate ...
var brithDateStr = source.User.Claims.FirstOrDefault(c => c.Type == XCustomClaims.BrithDate)?.Value ?? "";
if (brithDateStr.IsNullOrEmpty())
{
// BrithDate = null;
}
else
{
//
DateTime bDate;
DateTime.TryParse(brithDateStr, out bDate);
//
result.BrithDate = bDate;
}
#endregion
//
result.Issuers = source.User.Claims.Where(c => c.Type == XCustomClaims.Issuer)?
.Select(c => c.Value) ?? new HashSet();
result.Audiences = source.User.Claims.Where(c => c.Type == XCustomClaims.Audience)?
.Select(c => c.Value) ?? new HashSet();
result.ClientIds = source.User.Claims.Where(c => c.Type == XCustomClaims.ClientId)?
.Select(c => c.Value) ?? new HashSet();
result.Scopes = source.User.Claims.Where(c => c.Type == XCustomClaims.Scope)?
.Select(c => c.Value) ?? new HashSet();
result.Roles = source.User.Claims.Where(c => c.Type == XCustomClaims.Role)?
.Select(c => c.Value) ?? new HashSet();
//
return result;
}
}
}