using LiteCharms.Features.Hasher; using LiteCharms.Features.Hasher.Configuration; using LiteCharms.Features.Models; namespace LiteCharms.Features.Extensions; public static class Hash { public const string HasherConfigSectionName = "HasherSettings"; public static IServiceCollection AddHashServices(this IServiceCollection services, IConfiguration configuration) { services.Configure(configuration.GetSection(HasherConfigSectionName)); var settings = configuration.GetSection(HasherConfigSectionName).Get(); services.AddSingleton(_ => new Hashids(settings!.Salt, minHashLength: settings.MinHashLength)); services.AddSingleton(); return services; } public static string ToRawPayfastPayload(this PayfastWebhookPayload input, string passphrase) { var parameters = new List(); if (!string.IsNullOrWhiteSpace(input.Amount)) parameters.Add($"amount={WebUtility.UrlEncode(input.Amount)}"); if (!string.IsNullOrWhiteSpace(input.ItemName)) parameters.Add($"item_name={WebUtility.UrlEncode(input.ItemName)}"); if (!string.IsNullOrWhiteSpace(input.MPaymentId)) parameters.Add($"m_payment_id={WebUtility.UrlEncode(input.MPaymentId)}"); string payload = string.Join("&", parameters); if (!string.IsNullOrWhiteSpace(passphrase)) payload += $"&passphrase={WebUtility.UrlEncode(passphrase)}"; return payload; } public static (PayfastWebhookPayload Payload, string Passphrase) FromRawPayfastPayload(this string rawPayload) { string passphrase = string.Empty; var payload = new PayfastWebhookPayload(); if (string.IsNullOrWhiteSpace(rawPayload)) return (payload, passphrase); var segments = rawPayload.Split('&', StringSplitOptions.RemoveEmptyEntries); foreach (var segment in segments) { int delimiterIndex = segment.IndexOf('='); if (delimiterIndex == -1) continue; string key = segment[..delimiterIndex].Trim(); string rawValue = segment[(delimiterIndex + 1)..]; string decodedValue = WebUtility.UrlDecode(rawValue); switch (key.ToLowerInvariant()) { case "amount": payload.Amount = decodedValue; break; case "item_name": payload.ItemName = decodedValue; break; case "m_payment_id": payload.MPaymentId = decodedValue; break; case "passphrase": passphrase = decodedValue; break; } } return (payload, passphrase); } public static (PayfastWebhookPayload Payload, string Passphrase) FromRawPayfastPayload(this IFormCollection form) { string passphrase = string.Empty; var payload = new PayfastWebhookPayload(); if (form.IsNullOrEmpty()) return (payload, passphrase); payload = new PayfastWebhookPayload { Amount = form.TryGetValue("amount", out var amountValues) ? amountValues.ToString() : null, ItemName = form.TryGetValue("item_name", out var itemValues) ? itemValues.ToString() : null, MPaymentId = form.TryGetValue("m_payment_id", out var paymentIdValues) ? paymentIdValues.ToString() : null, }; return (payload, passphrase); } }