using Microsoft.AspNetCore.Http; using MisIngredientesVue.Core.Models; using MisIngredientesVue.Core.Services; using System; using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; using System.Text; using System.Linq; namespace MisIngredientesVue.Core.Extensions { public static class IdentityExtensions { public static string GetTenantId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("TenantId"); if (string.IsNullOrEmpty(claim?.Value)) throw new Exception("Empty Tenant ID"); return claim?.Value; } public static void AddClaim(this IIdentity identity, string type, string value) { var claimsIdentity = (ClaimsIdentity)identity; claimsIdentity.AddClaim(new Claim(type, value)); } public static int GetUserId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("UserId"); return Convert.ToInt32(claim?.Value); } public static string GetTokenVersion(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("Version"); return claim?.Value; } public static bool IsInvoicingInfoAvailable(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("Invoicing.InfoAvailable"); var value = Convert.ToInt32(claim?.Value ?? "0"); return value == 1; } public static string GetFullName(this IIdentity identity) { var firstNameClaim = ((ClaimsIdentity)identity).FindFirst("FirstName"); var lastNameClaim = ((ClaimsIdentity)identity).FindFirst("LastName"); return string.Join(" ", new string[] { firstNameClaim?.Value, lastNameClaim?.Value }); } public static int[] GetPermissions(this IIdentity identity, Claim[] claims = null) { if(claims != null) { var permissions = claims.FirstOrDefault(x => x.Type == "Permissions"); if (string.IsNullOrEmpty(permissions?.Value)) return new int[] { }; return permissions?.Value.Split(",").Select(x => Convert.ToInt32(x))?.ToArray(); } else { var permissions = ((ClaimsIdentity)identity).FindFirst("Permissions"); if (string.IsNullOrEmpty(permissions?.Value)) return new int[] { }; return permissions?.Value.Split(",").Select(x => Convert.ToInt32(x))?.ToArray(); } } public static int GetClientOrSupplierId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("ClientOrSupplierId"); var id = Convert.ToInt32(claim?.Value ?? "-1"); //if (id == -1) // throw new Exception("ClientOrSupplierId can't be -1"); return id; } public static string GetFirstName(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "FirstName") : ((ClaimsIdentity)identity).FindFirst("FirstName"); return claim?.Value; } public static string GetLastName(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "LastName") : ((ClaimsIdentity)identity).FindFirst("LastName"); return claim?.Value; } public static bool IsClient(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "IsClient") : ((ClaimsIdentity)identity).FindFirst("IsClient"); return claim?.Value == "1" ? true : false; } public static string GetStripeCustomerId(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "StripeCustomerId") : ((ClaimsIdentity)identity).FindFirst("StripeCustomerId"); return claim?.Value; } public static int GetSubscriptionLevel(this IIdentity identity, Claim[] claims = null) { //(subscriptionLevel == 0) "Gratis" //(subscriptionLevel == 1) "Básico" //(subscriptionLevel == 2) "Startup" //(subscriptionLevel == 3) "Enterprise" var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "SubscriptionLevel") : ((ClaimsIdentity)identity).FindFirst("SubscriptionLevel"); return Convert.ToInt32(claim?.Value); } public static bool IsPlanMonthly(this IIdentity identity, Claim[] claims = null) { var rawPlanId = GetPlanId(identity, claims); var planId = !string.IsNullOrEmpty(rawPlanId) ? (PlanType?)Convert.ToInt32(rawPlanId) : null; return planId == PlanType.BasicMonthly || planId == PlanType.EnterpriseMonthly || planId == PlanType.FreeMonthly || planId == PlanType.StartupMonthly; } public static string GetSubscriptionId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("SubscriptionId"); var subscriptionAndItemId = claim?.Value; if (!string.IsNullOrEmpty(subscriptionAndItemId) && subscriptionAndItemId.Contains("?")) return subscriptionAndItemId.Split("?")[0]; return subscriptionAndItemId; } public static string GetSubSubscriptionId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("SubSubscriptionId"); var subscriptionAndItemId = claim?.Value; if (!string.IsNullOrEmpty(subscriptionAndItemId) && subscriptionAndItemId.Contains("?")) return subscriptionAndItemId.Split("?")[0]; return subscriptionAndItemId; } public static string GetSubscriptionItemId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("SubscriptionId"); var subscriptionAndItemId = claim?.Value; if (!string.IsNullOrEmpty(subscriptionAndItemId) && subscriptionAndItemId.Contains("?")) { var spl = subscriptionAndItemId.Split("?"); if (spl.Length >= 2) return spl[1]; return null; } return null; } public static string GetSubSubscriptionItemId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("SubSubscriptionId"); var subscriptionAndItemId = claim?.Value; if (!string.IsNullOrEmpty(subscriptionAndItemId) && subscriptionAndItemId.Contains("?")) { var spl = subscriptionAndItemId.Split("?"); if (spl.Length >= 2) return spl[1]; return null; } return null; } public static string GetPlanId(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "PlanId") : ((ClaimsIdentity)identity).FindFirst("PlanId"); return claim?.Value; } public static bool HasDefaultPaymentMethodId(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "DefaultPaymentMethodId") : ((ClaimsIdentity)identity).FindFirst("DefaultPaymentMethodId"); return !string.IsNullOrEmpty(claim?.Value); } public static bool HasFreeSubscription(this IIdentity identity, Claim[] claims = null) { var tenantId = GetTenantId(identity); if (tenantId == "test" || tenantId == "demo") return false; var trialPeriodEnd = GetTrialPeriodEnd(identity, claims); if(trialPeriodEnd.HasValue) { if (DateTime.UtcNow < trialPeriodEnd.Value) return false; } var planId = GetPlanId(identity, claims); if(planId != null) { try { var planType = (PlanType)Convert.ToInt32(planId); return (planType == PlanType.FreeMonthly || planType == PlanType.FreeYearly); } catch { } } return true; } public static SystemUserRole GetUserRole(this IIdentity identity, Claim[] claims = null) { var userRole = claims != null ? claims.FirstOrDefault(x => x.Type == "UserRole") : ((ClaimsIdentity)identity).FindFirst("UserRole"); try { return (SystemUserRole)Convert.ToInt32(userRole?.Value); } catch { return SystemUserRole.Member; } } public static DateTime? GetTrialPeriodEnd(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "TrialPeriodEnd") : ((ClaimsIdentity)identity).FindFirst("TrialPeriodEnd"); var rawDate = $"{claim?.Value}"; var outputDate = DateTime.Now; if (DateTime.TryParseExact(rawDate.Replace("\"", "").Replace("'", ""), "yyyy-MM-ddTHH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDate)) { DateTime.SpecifyKind(outputDate, DateTimeKind.Utc); return outputDate; } return null; } public static int GetLeftTrialDays(this IIdentity identity, Claim[] claims = null) { var trialPeriodEnd = GetTrialPeriodEnd(identity, claims); if(trialPeriodEnd.HasValue) { return Math.Max((int)Math.Ceiling((trialPeriodEnd.Value - DateTime.UtcNow).TotalDays), 0); } return -1; } public static int GetFreeInvoicingFolios(this IIdentity identity) { var level = GetSubscriptionLevel(identity); var hasDefaultPaymentMethodId = HasDefaultPaymentMethodId(identity); if (hasDefaultPaymentMethodId) return -1; return BillingService.SUBSCRIPTION_PLANS.FirstOrDefault(x => x.SubscriptionType == level)?.FreeFolios ?? -1; } public static string GetProfileImgSrc(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "ProfileImgSrc") : ((ClaimsIdentity)identity).FindFirst("ProfileImgSrc"); return claim?.Value; } public static string GetCompanyLogoImgSrc(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "CompanyLogoImgSrc") : ((ClaimsIdentity)identity).FindFirst("CompanyLogoImgSrc"); return claim?.Value; } public static string GetCompanyName(this IIdentity identity, Claim[] claims = null) { var claim = claims != null ? claims.FirstOrDefault(x => x.Type == "CompanyName") : ((ClaimsIdentity)identity).FindFirst("CompanyName"); return claim?.Value; } public static string GetCompanyFiscalName(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("Invoicing.Name"); return claim?.Value; } public static string GetCompanyRfc(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("Invoicing.Rfc"); return claim?.Value; } public static string GetCompanyFiscalReg(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("Invoicing.FiscalReg"); return claim?.Value; } public static int[] GetAssignedBranchIds(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("AssignedBranches"); if (claim?.Value == null) return new int[] { }; try { return claim.Value.Split(",").Select(x => Convert.ToInt32(x)).ToArray(); } catch { return new int[] { }; } } public static ClientInvoicingInfo GetInvoicingInfo(this IIdentity identity, Claim[] claims = null) { if (claims != null) { return new ClientInvoicingInfo() { FullAddress = claims.FirstOrDefault(x => x.Type == "Invoicing.FullAddress")?.Value, Name = claims.FirstOrDefault(x => x.Type == "Invoicing.Name")?.Value, Rfc = claims.FirstOrDefault(x => x.Type == "Invoicing.Rfc")?.Value, Email = claims.FirstOrDefault(x => x.Type == "Invoicing.Email")?.Value }; } return new ClientInvoicingInfo() { FullAddress = ((ClaimsIdentity)identity).FindFirst("Invoicing.FullAddress")?.Value, Name = ((ClaimsIdentity)identity).FindFirst("Invoicing.Name")?.Value, Rfc = ((ClaimsIdentity)identity).FindFirst("Invoicing.Rfc")?.Value, Email = ((ClaimsIdentity)identity).FindFirst("Invoicing.Email")?.Value }; } public static bool ShouldResetPassword(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("ShouldResetPassword"); return claim?.Value == "1"; } public static void UpdateClaim(this IIdentity identity, string type, string value) { var existingClaim = ((ClaimsIdentity)identity).FindFirst(type); if (existingClaim != null) ((ClaimsIdentity)identity).TryRemoveClaim(existingClaim); ((ClaimsIdentity)identity).AddClaim(type, value); } public static int GetTimeOffset(this IIdentity identity) { throw new NotImplementedException(); var claim = ((ClaimsIdentity)identity).FindFirst("TimeOffset"); return Convert.ToInt32(claim?.Value); } } public static class HttpRequestExtensions { public static int GetTimeOffset(this HttpRequest request) { return Convert.ToInt32(request.Headers["x-offset"]); } } }