Initial import into Gitea
This commit is contained in:
83
TikTokApi/Controllers/InternalController.cs
Normal file
83
TikTokApi/Controllers/InternalController.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using TikTokApi.Models;
|
||||
using TikTokApi.Security;
|
||||
using TikTokApi.Services;
|
||||
|
||||
namespace TikTokApi.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// Internal API endpoint called by Gateway.
|
||||
/// Protected by X-Internal-Key header validation.
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("internal")]
|
||||
public sealed class InternalController : ControllerBase
|
||||
{
|
||||
private readonly TikTokMarketingService _tikTokAds;
|
||||
private readonly ILogger<InternalController> _logger;
|
||||
|
||||
public InternalController(TikTokMarketingService tikTokAds, ILogger<InternalController> logger)
|
||||
{
|
||||
_tikTokAds = tikTokAds;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Health check - no auth required.
|
||||
/// </summary>
|
||||
[HttpGet("health")]
|
||||
public IActionResult Health()
|
||||
{
|
||||
_logger.LogDebug("[InternalController] Health check");
|
||||
return Ok(new
|
||||
{
|
||||
ok = true,
|
||||
service = "TikTokApi",
|
||||
timestamp = DateTimeOffset.UtcNow
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Main execution endpoint - Gateway calls this.
|
||||
/// Protected by InternalAuthFilter.
|
||||
/// </summary>
|
||||
[ServiceFilter(typeof(InternalAuthFilter))]
|
||||
[HttpPost("execute")]
|
||||
public async Task<IActionResult> Execute([FromBody] ProviderRequest request, CancellationToken ct)
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"[InternalController] Execute called | Operation={Operation} RequestId={RequestId}",
|
||||
request?.Operation, request?.RequestId);
|
||||
|
||||
if (request == null)
|
||||
{
|
||||
return BadRequest(ProviderResponse.Fail(null, "VALIDATION", "Request body is required"));
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(request.Operation))
|
||||
{
|
||||
return BadRequest(ProviderResponse.Fail(request.RequestId, "VALIDATION", "Operation is required"));
|
||||
}
|
||||
|
||||
var result = await _tikTokAds.ExecuteAsync(request, ct);
|
||||
|
||||
if (result.Ok)
|
||||
{
|
||||
return Ok(result);
|
||||
}
|
||||
else
|
||||
{
|
||||
var statusCode = result.Error?.Code switch
|
||||
{
|
||||
"VALIDATION" => 400,
|
||||
"NOT_FOUND" => 404,
|
||||
"UNAUTHORIZED" => 401,
|
||||
"FORBIDDEN" => 403,
|
||||
"RATE_LIMITED" => 429,
|
||||
_ => 400
|
||||
};
|
||||
|
||||
return StatusCode(statusCode, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user