using Microsoft.AspNetCore.Authentication.JwtBearer; using OnlyPrompt.Backend.Database.Models; using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Runtime.CompilerServices; using System.Security.Claims; namespace OnlyPrompt.Backend.Utils { public static class Extensions { public static string? GetIdentifier(this ClaimsPrincipal principal) => principal.FindFirstValue(ClaimTypes.NameIdentifier); public static bool TryGetIdentifier(this ClaimsPrincipal principal, [NotNullWhen(true)]out string? identifier) { identifier = principal.FindFirstValue(ClaimTypes.NameIdentifier); return identifier != null; } public static Guid? GetUserId(this ClaimsPrincipal principal) { if (principal.TryGetIdentifier(out var identifier) && Guid.TryParse(identifier, out var userId)) return userId; return null; } public static IEnumerable GetClaims(this UserModel user) { yield return new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()); yield return new Claim(ClaimTypes.Name, user.UserName); yield return new Claim(ClaimTypes.Email, user.Email); foreach (var role in user.Roles) yield return new Claim(ClaimTypes.Role, role); } public static IQueryable OrderBy(this IQueryable source, Expression> selecter, bool ascending) { if(ascending) return source.OrderBy(selecter); else return source.OrderByDescending(selecter); } public static CookieOptions Copy(this CookieOptions options, Action? modify = null) { var newOptions = new CookieOptions { Domain = options.Domain, Expires = options.Expires, HttpOnly = options.HttpOnly, IsEssential = options.IsEssential, MaxAge = options.MaxAge, Path = options.Path, SameSite = options.SameSite, Secure = options.Secure }; modify?.Invoke(newOptions); return newOptions; } public static string Limit(this string @string, int maxLength) { if (@string.Length <= maxLength) return @string; return @string.Substring(0, maxLength); } public const string LowerAlphabet = "abcdefghijklmnopqrstuvwxyz"; public static string GetString(this Random @random, int lenght, string alphabet = LowerAlphabet) { Span chars = stackalloc char[lenght]; for (int i = 0; i < lenght; i++) chars[i] = alphabet[@random.Next(alphabet.Length)]; return new string(chars); } } }