TracksController.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using molilian.core;
  2. using dodohold.core;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System.Text.Json;
  5. using TencentCloud.Ecm.V20190719.Models;
  6. using YunhuiKit;
  7. namespace molilian.api.Controllers
  8. {
  9. [ApiController]
  10. [Route("[controller]/[action]")]
  11. public class TracksController : ControllerBase
  12. {
  13. protected IHttpContextAccessor _accessor;
  14. public TracksController(IHttpContextAccessor accessor)
  15. {
  16. _accessor = accessor;
  17. }
  18. [HttpGet]
  19. public async Task<ActionResult> Track([FromQuery] int track_id, [FromQuery] string unique_id, [FromQuery] string scene = "")
  20. {
  21. if (track_id <= 0)
  22. {
  23. return new APIResult(new { success = false, message = "miss" });
  24. }
  25. var link = await TracksCore.GetLinkByIdAsync(track_id);
  26. if (link == null)
  27. {
  28. return new APIResult(new { success = false, message = "not found" });
  29. }
  30. string trackScene = TracksCore.ResolveMetricScene(link, scene);
  31. var dto = new TrackRequestLogDTO
  32. {
  33. track_id = track_id,
  34. event_type = link.event_type,
  35. platform = link.platform,
  36. typename = link.typename,
  37. scene = trackScene,
  38. unique_id = unique_id,
  39. ip = _accessor.HttpContext.GetUserIp(),
  40. user_agent = Request.Headers.UserAgent.ToString(),
  41. referer = Request.Headers.Referer.ToString()
  42. };
  43. _ = TracksCore.LogTrackRequestAsync(dto);
  44. _ = TracksCore.TrackAsync(link, trackScene);
  45. return new APIResult(new { success = true, message = "ok" });
  46. }
  47. [HttpPost]
  48. public async Task<ActionResult> Create([FromQuery] string eventType, [FromQuery] string platform = "", [FromQuery] string typename = "", [FromQuery] string scene = "", [FromQuery] string uniqueId = "", [FromQuery] string description = "")
  49. {
  50. if (string.IsNullOrWhiteSpace(typename)) typename = platform;
  51. if (string.IsNullOrWhiteSpace(platform)) platform = typename;
  52. var link = await TracksCore.CreateLinkAsync(eventType, platform, typename, scene, uniqueId, description);
  53. if (link == null)
  54. {
  55. return new APIResult(new { success = false, message = "invalid params or eventType" });
  56. }
  57. //var request = _accessor.HttpContext!.Request;
  58. //string url = $"{request.Scheme}://{request.Host}{link.path}";
  59. return new APIResult(new { success = true, message = "ok", url = link.path });
  60. }
  61. [HttpGet]
  62. public async Task<ActionResult> Daily([FromQuery] int daysAgo = 0, [FromQuery] string reportDate = "", [FromQuery] bool includeToday = true, [FromQuery] bool includeYesterday = true)
  63. {
  64. var dates = new List<DateTime>();
  65. DateTime today = DateTime.Now.Date;
  66. if (!string.IsNullOrWhiteSpace(reportDate) && DateTime.TryParse(reportDate, out var parsed))
  67. {
  68. dates.Add(parsed.Date);
  69. if (includeToday && parsed.Date != today) dates.Add(today);
  70. }
  71. else
  72. {
  73. if (daysAgo > 0)
  74. {
  75. var date = today.AddDays(-daysAgo);
  76. dates.Add(date);
  77. if (includeToday && date != today) dates.Add(today);
  78. }
  79. else
  80. {
  81. dates.Add(today);
  82. if (includeYesterday) dates.Add(today.AddDays(-1));
  83. }
  84. }
  85. int rows = 0;
  86. var reportDates = new List<string>();
  87. var details = new List<object>();
  88. foreach (var date in dates.Distinct())
  89. {
  90. int dateRows = await TracksCore.FlushDailyAsync(date);
  91. rows += dateRows;
  92. reportDates.Add(date.ToString("yyyy-MM-dd"));
  93. details.Add(new { reportDate = date.ToString("yyyy-MM-dd"), rows = dateRows });
  94. }
  95. return new APIResult(new { success = true, message = "ok", rows, reportDates, details });
  96. }
  97. }
  98. }