dodo hold 2 місяців тому
батько
коміт
e46f7ae1e1
1 змінених файлів з 103 додано та 28 видалено
  1. 103 28
      molilian.api/Controllers/public/TracksController.cs

+ 103 - 28
molilian.api/Controllers/public/TracksController.cs

@@ -1,53 +1,62 @@
-using molilian.core;
-using dodohold.core;
-using Microsoft.AspNetCore.Mvc;
-using System.Text.Json;
-using TencentCloud.Ecm.V20190719.Models;
+using molilian.core;
+using dodohold.core;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Mvc;
+using System.Text.Json;
+using TencentCloud.Ecm.V20190719.Models;
 using YunhuiKit;
 
 namespace molilian.api.Controllers
 {
-    [ApiController]
-    [Route("[controller]/[action]")]
-    public class TracksController : ControllerBase
-    {
-
-        protected IHttpContextAccessor _accessor;
-        public TracksController(IHttpContextAccessor accessor)
-        {
-            _accessor = accessor;
-        }
-
-        [HttpGet]
-        public async Task<ActionResult> Track([FromQuery] int track_id, [FromQuery] string unique_id, [FromQuery] string scene = "", [FromQuery] int account_id = 0)
+    [ApiController]
+    [Route("[controller]/[action]")]
+    public class TracksController : ControllerBase
+    {
+        protected IHttpContextAccessor _accessor;
+        public TracksController(IHttpContextAccessor accessor)
         {
-            if (track_id <= 0)
+            _accessor = accessor;
+        }
+
+        [HttpGet]
+        public async Task<ActionResult> Track([FromQuery] string? track_id = null, [FromQuery] string? unique_id = null, [FromQuery] string? scene = "", [FromQuery] string? account_id = null)
+        {
+            bool validTrackId = int.TryParse(track_id, out int parsedTrackId) && parsedTrackId > 0;
+            int parsedAccountId = 0;
+            bool validAccountId = string.IsNullOrWhiteSpace(account_id) || int.TryParse(account_id, out parsedAccountId);
+            parsedAccountId = validAccountId ? Math.Max(parsedAccountId, 0) : 0;
+            string requestUniqueId = unique_id ?? string.Empty;
+            string requestScene = scene ?? string.Empty;
+
+            await WriteTrackRequestTextLogAsync(track_id, unique_id, scene, account_id, parsedTrackId, validTrackId, parsedAccountId, validAccountId);
+
+            if (!validTrackId)
             {
                 return new APIResult(new { success = false, message = "miss" });
             }
 
-            var link = await TracksCore.GetLinkByIdAsync(track_id);
+            var link = await TracksCore.GetLinkByIdAsync(parsedTrackId);
             if (link == null)
             {
                 return new APIResult(new { success = false, message = "not found" });
             }
 
-            string trackScene = TracksCore.ResolveMetricScene(link, scene);
+            string trackScene = TracksCore.ResolveMetricScene(link, requestScene);
             var dto = new TrackRequestLogDTO
             {
-                track_id = track_id,
-                account_id = Math.Max(account_id, 0),
+                track_id = parsedTrackId,
+                account_id = parsedAccountId,
                 event_type = link.event_type,
                 platform = link.platform,
                 typename = link.typename,
                 scene = trackScene,
-                unique_id = unique_id,
-                ip = _accessor.HttpContext.GetUserIp(),
+                unique_id = requestUniqueId,
+                ip = _accessor.HttpContext?.GetUserIp() ?? string.Empty,
                 user_agent = Request.Headers.UserAgent.ToString(),
                 referer = Request.Headers.Referer.ToString()
             };
             _ = TracksCore.LogTrackRequestAsync(dto);
-            _ = TracksCore.TrackAsync(link, trackScene, account_id);
+            _ = TracksCore.TrackAsync(link, trackScene, parsedAccountId);
             return new APIResult(new { success = true, message = "ok" });
         }
 
@@ -105,5 +114,71 @@ namespace molilian.api.Controllers
             return new APIResult(new { success = true, message = "ok", rows, reportDates, details });
 
         }
-    }
-}
+
+        private async Task WriteTrackRequestTextLogAsync(
+            string? rawTrackId,
+            string? rawUniqueId,
+            string? rawScene,
+            string? rawAccountId,
+            int parsedTrackId,
+            bool validTrackId,
+            int parsedAccountId,
+            bool validAccountId)
+        {
+            try
+            {
+                string rawTarget = HttpContext.Features.Get<IHttpRequestFeature>()?.RawTarget ?? $"{Request.Path}{Request.QueryString}";
+                string rawQuery = string.Empty;
+                int rawQueryIndex = rawTarget.IndexOf('?');
+                if (rawQueryIndex >= 0 && rawQueryIndex < rawTarget.Length - 1)
+                {
+                    rawQuery = rawTarget[(rawQueryIndex + 1)..];
+                }
+
+                var logItem = new
+                {
+                    time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
+                    method = Request.Method,
+                    scheme = Request.Scheme,
+                    host = Request.Host.Value,
+                    path = Request.Path.Value ?? string.Empty,
+                    raw_target = rawTarget,
+                    raw_query = rawQuery,
+                    raw_query_string = Request.QueryString.Value ?? string.Empty,
+                    query = Request.Query.ToDictionary(item => item.Key, item => item.Value.ToArray()),
+                    bound = new
+                    {
+                        track_id = rawTrackId ?? string.Empty,
+                        unique_id = rawUniqueId ?? string.Empty,
+                        scene = rawScene ?? string.Empty,
+                        account_id = rawAccountId ?? string.Empty
+                    },
+                    parsed = new
+                    {
+                        track_id = parsedTrackId,
+                        track_id_valid = validTrackId,
+                        account_id = parsedAccountId,
+                        account_id_valid = validAccountId
+                    },
+                    ip = _accessor.HttpContext?.GetUserIp() ?? string.Empty,
+                    remote_ip = HttpContext.Connection.RemoteIpAddress?.ToString() ?? string.Empty,
+                    x_forwarded_for = Request.Headers["X-Forwarded-For"].ToString(),
+                    x_original_url = Request.Headers["X-Original-URL"].ToString(),
+                    x_rewrite_url = Request.Headers["X-Rewrite-URL"].ToString(),
+                    user_agent = Request.Headers.UserAgent.ToString(),
+                    referer = Request.Headers.Referer.ToString()
+                };
+
+                await new LoggerLibrary("tracks", "track_request")
+                    .Info(JsonSerializer.Serialize(logItem))
+                    .SaveAsync();
+            }
+            catch (Exception ex)
+            {
+                _ = new LoggerLibrary("tracks", "track_request_error")
+                    .Info(ex.Message, ex.StackTrace)
+                    .SaveAsync();
+            }
+        }
+    }
+}