Handler.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Application.Abstractions.Data;
  2. using MediatR;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Member.LoginLog.Get;
  5. public sealed class Handler(IAppDbContext db) : IRequestHandler<Query, Response?>
  6. {
  7. public async Task<Response?> Handle(Query request, CancellationToken ct)
  8. {
  9. var entity = await db.MemberLoginLog
  10. .AsNoTracking()
  11. .Include(x => x.Member)
  12. .Where(x => x.ID == request.Id)
  13. .Select(x => new
  14. {
  15. x.ID,
  16. x.MemberID,
  17. MemberName = x.Member.Name,
  18. x.Account,
  19. x.Success,
  20. x.Reason,
  21. x.Referer,
  22. x.Url,
  23. x.IpAddress,
  24. x.UserAgent,
  25. x.CreatedAt
  26. })
  27. .FirstOrDefaultAsync(ct);
  28. if (entity == null) return null;
  29. return new Response
  30. {
  31. ID = entity.ID,
  32. MemberID = entity.MemberID,
  33. MemberName = entity.MemberName,
  34. Account = entity.Account,
  35. Success = entity.Success,
  36. Reason = entity.Reason,
  37. Referer = entity.Referer,
  38. Url = entity.Url,
  39. IpAddress = entity.IpAddress,
  40. UserAgent = entity.UserAgent,
  41. Browser = ParseUserAgent(entity.UserAgent, "browser"),
  42. OS = ParseUserAgent(entity.UserAgent, "os"),
  43. Device = ParseUserAgent(entity.UserAgent, "device"),
  44. CreatedAt = entity.CreatedAt
  45. };
  46. }
  47. private static string? ParseUserAgent(string? userAgent, string type)
  48. {
  49. if (string.IsNullOrWhiteSpace(userAgent)) return null;
  50. return type switch
  51. {
  52. "browser" => ExtractBrowser(userAgent),
  53. "os" => ExtractOS(userAgent),
  54. "device" => ExtractDevice(userAgent),
  55. _ => null
  56. };
  57. }
  58. private static string ExtractBrowser(string ua)
  59. {
  60. if (ua.Contains("Edg/")) return "Edge";
  61. if (ua.Contains("Chrome/")) return "Chrome";
  62. if (ua.Contains("Firefox/")) return "Firefox";
  63. if (ua.Contains("Safari/") && !ua.Contains("Chrome")) return "Safari";
  64. if (ua.Contains("MSIE") || ua.Contains("Trident/")) return "IE";
  65. return "Unknown";
  66. }
  67. private static string ExtractOS(string ua)
  68. {
  69. if (ua.Contains("Windows NT 10")) return "Windows 10";
  70. if (ua.Contains("Windows NT 6.3")) return "Windows 8.1";
  71. if (ua.Contains("Windows NT 6.1")) return "Windows 7";
  72. if (ua.Contains("Windows")) return "Windows";
  73. if (ua.Contains("Mac OS X")) return "macOS";
  74. if (ua.Contains("Android")) return "Android";
  75. if (ua.Contains("iPhone") || ua.Contains("iPad")) return "iOS";
  76. if (ua.Contains("Linux")) return "Linux";
  77. return "Unknown";
  78. }
  79. private static string ExtractDevice(string ua)
  80. {
  81. if (ua.Contains("Mobile") || ua.Contains("Android") && !ua.Contains("Tablet")) return "Mobile";
  82. if (ua.Contains("Tablet") || ua.Contains("iPad")) return "Tablet";
  83. return "Desktop";
  84. }
  85. }