using Microsoft.AspNetCore.Mvc; using CodePlay.Core.Models; using CodePlay.Core.Common; using CodePlay.Core.Services; namespace CodePlay.Web.Controllers; /// /// 代码转换控制器 /// [ApiController] [Route("api/[controller]")] public class ConversionController : ControllerBase { private readonly ConversionService _conversionService; private readonly ILogger _logger; public ConversionController( ConversionService conversionService, ILogger logger) { _conversionService = conversionService; _logger = logger; } /// /// 执行代码转换 /// /// 转换请求 /// 取消令牌 /// 转换结果 [HttpPost] [ProducesResponseType(typeof(ConversionResult), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task> ConvertAsync( [FromBody] ConversionRequest request, CancellationToken cancellationToken = default) { try { // 验证请求 if (string.IsNullOrWhiteSpace(request.SourceCode)) { return BadRequest(new ProblemDetails { Title = "Invalid Request", Detail = "Source code is required", Status = 400 }); } if (request.SourceLanguage == LanguageType.None || request.TargetLanguage == LanguageType.None) { return BadRequest(new ProblemDetails { Title = "Invalid Request", Detail = "Source and target languages must be specified", Status = 400 }); } if (request.SourceLanguage == request.TargetLanguage) { return BadRequest(new ProblemDetails { Title = "Invalid Request", Detail = "Source and target languages must be different", Status = 400 }); } if (request.ValidationRounds < 1 || request.ValidationRounds > 3) { return BadRequest(new ProblemDetails { Title = "Invalid Request", Detail = "Validation rounds must be between 1 and 3", Status = 400 }); } _logger.LogInformation( "Starting conversion from {SourceLanguage} to {TargetLanguage}", request.SourceLanguage, request.TargetLanguage); // 执行转换 var result = await _conversionService.ConvertAsync(request, cancellationToken); if (result.Success) { _logger.LogInformation( "Conversion completed successfully. Lines: {Lines}, Classes: {Classes}, Methods: {Methods}", result.Report?.LinesConverted, result.Report?.ClassesConverted, result.Report?.MethodsConverted); return Ok(result); } else { _logger.LogWarning( "Conversion failed: {Error}", result.ErrorMessage); return StatusCode(500, new ProblemDetails { Title = "Conversion Failed", Detail = result.ErrorMessage, Status = 500 }); } } catch (Exception ex) { _logger.LogError(ex, "Unexpected error during conversion"); return StatusCode(500, new ProblemDetails { Title = "Internal Server Error", Detail = "An unexpected error occurred during conversion", Status = 500 }); } } /// /// 获取支持的语言转换列表 /// /// 支持的语言对列表 [HttpGet("supported")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public ActionResult> GetSupportedConversions() { var supported = _conversionService.GetSupportedConversions() .Select(p => new LanguagePairDto { SourceLanguage = p.Source.ToString(), TargetLanguage = p.Target.ToString(), Supported = true }) .ToList(); return Ok(supported); } /// /// 检查指定的语言转换是否支持 /// [HttpGet("supported/{source}/{target}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public ActionResult IsConversionSupported( string source, string target) { if (!Enum.TryParse(source, out var sourceLang) || !Enum.TryParse(target, out var targetLang)) { return BadRequest("Invalid language type"); } var isSupported = _conversionService.IsConversionSupported(sourceLang, targetLang); if (isSupported) { return Ok(true); } else { return NotFound("Conversion not supported"); } } } /// /// 语言对 DTO /// public class LanguagePairDto { /// /// 源语言 /// public string SourceLanguage { get; set; } = string.Empty; /// /// 目标语言 /// public string TargetLanguage { get; set; } = string.Empty; /// /// 是否支持 /// public bool Supported { get; set; } }