Files
myAi/cv-matcher-api/Controllers/CvController.cs
T
claude f608bec742
Build and Push Docker Images / build (push) Failing after 0s
Changes
2026-05-07 19:32:07 +03:00

76 lines
3.1 KiB
C#

using CvMatcher.Models.Requests;
using Api.Services.Contracts;
using Microsoft.AspNetCore.Mvc;
using CvMatcher.Models.Responses;
using Shared.Models.Requests;
namespace Api.Controllers;
[ApiController]
[Route("api/cv")]
public sealed class CvController : ControllerBase
{
private readonly ICvMatcherService _service;
private readonly ILogger<CvController> _logger;
public CvController(ICvMatcherService service, ILogger<CvController> logger)
{
_service = service;
_logger = logger;
}
[HttpPost("upload")]
[RequestSizeLimit(10 * 1024 * 1024)]
public async Task<ActionResult<CvUploadResponse>> Upload([FromForm] UploadFileRequest request, CancellationToken ct)
{
try
{
if (request.File is null) return BadRequest(new { error = "Missing CV PDF." });
_logger.LogInformation("CV upload received. FileName={FileName}, Size={SizeBytes}", request.File.FileName, request.File.Length);
var result = await _service.UploadCvAsync(request.File, ct);
_logger.LogInformation("CV upload processed. CvDocumentId={CvDocumentId}, Cached={Cached}", result.DocumentId, result.Cached);
return Ok(result);
}
catch (InvalidOperationException ex)
{
_logger.LogWarning(ex, "Invalid CV upload request.");
return BadRequest(new { error = ex.Message });
}
}
[HttpPost("find-jobs")]
public async Task<ActionResult<FindJobsResponse>> FindJobs([FromBody] FindJobsRequest request, CancellationToken ct)
{
try
{
_logger.LogInformation("Find jobs request received. CvDocumentId={CvDocumentId}, TopK={TopK}", request.CvDocumentId, request.TopK);
var result = await _service.FindJobsAsync(request, ct);
_logger.LogInformation("Find jobs completed. CvDocumentId={CvDocumentId}, ResultCount={ResultCount}", request.CvDocumentId, result.Jobs.Count);
return result;
}
catch (InvalidOperationException ex)
{
_logger.LogWarning(ex, "Invalid find jobs request.");
return BadRequest(new { error = ex.Message });
}
}
[HttpPost("match-job")]
public async Task<ActionResult<JobMatchResponse>> MatchJob([FromBody] MatchJobRequest request, CancellationToken ct)
{
try
{
_logger.LogInformation("Match job request received. CvDocumentId={CvDocumentId}, HasJobUrl={HasJobUrl}, HasJobDescription={HasJobDescription}, EmailRequested={EmailRequested}",
request.CvDocumentId, !string.IsNullOrWhiteSpace(request.JobUrl), !string.IsNullOrWhiteSpace(request.JobDescription), !string.IsNullOrWhiteSpace(request.Email));
var result = await _service.MatchJobAsync(request, ct);
_logger.LogInformation("Match job completed. CvDocumentId={CvDocumentId}, Score={Score}, Cached={Cached}", request.CvDocumentId, result.Score, result.Cached);
return result;
}
catch (InvalidOperationException ex)
{
_logger.LogWarning(ex, "Invalid match job request.");
return BadRequest(new { error = ex.Message });
}
}
}