This commit is contained in:
2026-05-06 14:48:12 +03:00
parent f1e8a9f8da
commit 711810d8c2
6 changed files with 109 additions and 82 deletions
+8 -21
View File
@@ -1,3 +1,4 @@
using Api.Clients.Api.Contracts;
using Api.Models.Requests;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
@@ -13,12 +14,12 @@ namespace Api.Controllers;
[EnableRateLimiting("cv-matcher")]
public sealed class CvMatcherController : ControllerBase
{
private readonly Api.Clients.Api.Contracts.ICvMatcherApi _cvApi;
private readonly ICvMatcherApi _cvApi;
private readonly IConfiguration _configuration;
private readonly ILogger<CvMatcherController> _logger;
public CvMatcherController(
Api.Clients.Api.Contracts.ICvMatcherApi cvApi,
ICvMatcherApi cvApi,
IConfiguration configuration,
ILogger<CvMatcherController> logger)
{
@@ -34,6 +35,7 @@ public sealed class CvMatcherController : ControllerBase
/// <param name="gdprConsent">Whether the user consented to GDPR processing.</param>
/// <param name="ct">Cancellation token.</param>
[HttpPost("upload")]
[Consumes("multipart/form-data")]
[RequestSizeLimit(8 * 1024 * 1024)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
@@ -43,21 +45,16 @@ public sealed class CvMatcherController : ControllerBase
[SwaggerResponse(StatusCodes.Status400BadRequest, "Missing or invalid input")]
[SwaggerResponse(StatusCodes.Status502BadGateway, "Upstream cv-matcher-api error")]
public async Task<IActionResult> UploadCv(
[FromForm(Name = "cv")] IFormFile? cv,
[FromForm] bool gdprConsent,
[FromForm] UploadCvRequest request,
CancellationToken ct)
{
if (cv is null)
if (request.Cv is null)
{
return BadRequest(new { error = "Missing CV PDF." });
}
var baseUrl = GetCvMatcherBaseUrl();
if (string.IsNullOrWhiteSpace(baseUrl))
{
_logger.LogError("CvMatcherApi:BaseUrl is not configured. The public API cannot proxy CV upload requests.");
return StatusCode(StatusCodes.Status502BadGateway, new { error = "CV matcher API is not configured." });
}
var cv = request.Cv;
var gdprConsent = request.GdprConsent;
try
{
@@ -96,13 +93,6 @@ public sealed class CvMatcherController : ControllerBase
[SwaggerResponse(StatusCodes.Status502BadGateway, "Upstream cv-matcher-api error")]
public async Task<IActionResult> MatchJob([FromBody] JobMatchRequest request, CancellationToken ct)
{
var baseUrl = GetCvMatcherBaseUrl();
if (string.IsNullOrWhiteSpace(baseUrl))
{
_logger.LogError("CvMatcherApi:BaseUrl is not configured. The public API cannot proxy job matching requests.");
return StatusCode(StatusCodes.Status502BadGateway, new { error = "CV matcher API is not configured." });
}
try
{
_logger.LogInformation("Proxying job match request to cv-matcher-api. CvDocumentId={CvDocumentId}, HasJobUrl={HasJobUrl}, HasJobDescription={HasJobDescription}",
@@ -124,9 +114,6 @@ public sealed class CvMatcherController : ControllerBase
return StatusCode(StatusCodes.Status502BadGateway, new { error = "CV matcher API request failed." });
}
}
private string GetCvMatcherBaseUrl() => _configuration["CvMatcherApi:BaseUrl"] ?? string.Empty;
// Refit client is configured in Program.cs; this helper only reads config for diagnostics
private static async Task<ContentResult> ProxyResponseAsync(HttpResponseMessage response, CancellationToken ct)