using System.Net;
using System.Net.Sockets;
using CodeLiturgy.Data.Application.Users;
using CodeLiturgy.Data.Auth.Context.Users;
using CodeLiturgy.Views.Models;
using CodeLiturgy.Views.Utils;
using Duende.IdentityServer.Extensions;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
namespace CodeLiturgy.Views.Controllers;
///
/// Base controller class for Views.
///
public class LoggedInUserController : Controller
{
protected ILogger _logger;
protected ApplicationUserManager _userManager;
private List _footerMenu;
private List _headerMenu;
public LoggedInUserController(ApplicationUserManager userManager, ILogger logger)
{
_logger = logger;
_userManager = userManager;
_footerMenu = new List();
_headerMenu = new List();
}
public async Task OnEveryAction()
{
HandleGlobalization();
await SetUserProfileViewData();
OnInitialization();
SetFooterMenuViewData();
SetHeaderMenuViewData();
}
public virtual void OnInitialization()
{
}
protected void SetFooterMenuViewData()
{
ViewData[FooterMenuViewDataId] = _footerMenu;
}
protected void SetHeaderMenuViewData()
{
ViewData[HeaderMenuId] = _headerMenu;
}
public void SetFooterMenu(List urls)
{
_footerMenu = urls;
}
public void SetHeaderMenu(List urls)
{
_headerMenu = urls;
}
public async Task SetUserProfileViewData()
{
if (!ViewData.ContainsKey(UserViewDataId))
{
ViewData[UserViewDataId] = await GetLoggedInUser();
}
}
public async Task GetLoggedInUser()
{
if (User.IsAuthenticated())
{
ApplicationUser user = await _userManager.GetUserAsync(User);
if (user != null)
{
var dto = new ApplicationUserUnique()
{
Email = user.Email,
EmailConfirmed = user.EmailConfirmed,
NormalizedEmail = user.NormalizedEmail,
UserName = user.UserName,
LockoutEnabled = user.LockoutEnabled
};
return dto;
}
}
return null;
}
public IpInformation ExtractIpInformation(IPAddress ipAddress)
{
string ipAddressString = "";
IpType ipType = IpType.Unknown;
if (ipAddress != null)
{
if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
{
ipType = IpType.Ipv4;
ipAddressString = ipAddress.MapToIPv4().ToString();
}
if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
{
ipType = IpType.Ipv6;
ipAddressString = ipAddress
.MapToIPv6()
.ToString();
}
}
return new IpInformation(ipType, ipAddressString);
}
public void HandleGlobalization()
{
var requestCultureFeature = HttpContext.Features.Get();
string currentCultureName = DefaultCultureName;
if (requestCultureFeature != null)
{
currentCultureName = requestCultureFeature.RequestCulture.Culture.Name;
}
ViewData[LanguageViewStorage] = currentCultureName;
IPAddress remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
IpInformation ipInformation = ExtractIpInformation(Request.HttpContext.Connection.RemoteIpAddress);
ViewData[IpViewStorage] = ipInformation;
}
}