|
@@ -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;
|
|
using YunhuiKit;
|
|
|
|
|
|
|
|
namespace molilian.api.Controllers
|
|
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" });
|
|
return new APIResult(new { success = false, message = "miss" });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- var link = await TracksCore.GetLinkByIdAsync(track_id);
|
|
|
|
|
|
|
+ var link = await TracksCore.GetLinkByIdAsync(parsedTrackId);
|
|
|
if (link == null)
|
|
if (link == null)
|
|
|
{
|
|
{
|
|
|
return new APIResult(new { success = false, message = "not found" });
|
|
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
|
|
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,
|
|
event_type = link.event_type,
|
|
|
platform = link.platform,
|
|
platform = link.platform,
|
|
|
typename = link.typename,
|
|
typename = link.typename,
|
|
|
scene = trackScene,
|
|
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(),
|
|
user_agent = Request.Headers.UserAgent.ToString(),
|
|
|
referer = Request.Headers.Referer.ToString()
|
|
referer = Request.Headers.Referer.ToString()
|
|
|
};
|
|
};
|
|
|
_ = TracksCore.LogTrackRequestAsync(dto);
|
|
_ = TracksCore.LogTrackRequestAsync(dto);
|
|
|
- _ = TracksCore.TrackAsync(link, trackScene, account_id);
|
|
|
|
|
|
|
+ _ = TracksCore.TrackAsync(link, trackScene, parsedAccountId);
|
|
|
return new APIResult(new { success = true, message = "ok" });
|
|
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 });
|
|
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();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|