using Microsoft.AspNetCore.Mvc; using CodePlay.Core.Converters; using CodePlay.Core.Models; using CodePlay.Core.Common; using CodePlay.Core.Services; using CodePlay.Core.Parsers; namespace CodePlay.WebAPI.Controllers; [ApiController] [Route("api/[controller]")] public class ConversionController : ControllerBase { private readonly ILogger _logger; public ConversionController(ILogger logger) { _logger = logger; } [HttpPost("convert")] public async Task> Convert([FromBody] ConversionRequest request) { try { _logger.LogInformation("收到转换请求:{Source} -> {Target}", request.SourceLanguage, request.TargetLanguage); if (string.IsNullOrWhiteSpace(request.SourceCode)) return BadRequest("源代码不能为空"); if (request.SourceLanguage.Equals("CSharp", StringComparison.OrdinalIgnoreCase) && request.TargetLanguage.Equals("Java", StringComparison.OrdinalIgnoreCase)) { var parser = new CSharpParser(); var tree = await parser.ParseAsync(request.SourceCode); var converter = new CSharpToJavaConverter(); var options = new ConversionOptions { KeepComments = true, KeepDocStrings = true, AutoFormat = true }; var result = await converter.ConvertAsync(tree, LanguageType.Java, options); _logger.LogInformation("转换完成:成功={Success}", result.Success); return Ok(result); } else { return BadRequest($"暂不支持 {request.SourceLanguage} -> {request.TargetLanguage} 转换"); } } catch (Exception ex) { _logger.LogError(ex, "转换失败"); return StatusCode(500, new { error = ex.Message }); } } [HttpGet("supported")] public ActionResult GetSupportedConversions() { return Ok(new[] { new { Source = "CSharp", Target = "Java", Status = "Ready" } }); } [HttpPost("batch")] public async Task> BatchConvert([FromBody] BatchConversionRequest request) { try { _logger.LogInformation("批量转换:{Count} files", request.Files?.Count ?? 0); var result = new BatchConversionResult { TotalFiles = request.Files?.Count ?? 0, Results = new List() }; if (request.Files == null) return BadRequest("文件列表为空"); foreach (var file in request.Files) { try { if (request.SourceLanguage.Equals("CSharp", StringComparison.OrdinalIgnoreCase) && request.TargetLanguage.Equals("Java", StringComparison.OrdinalIgnoreCase)) { var parser = new CSharpParser(); var tree = await parser.ParseAsync(file.Content); var converter = new CSharpToJavaConverter(); var convResult = await converter.ConvertAsync(tree, LanguageType.Java, new ConversionOptions()); result.Results.Add(new FileConversionResult { FileName = file.FileName, Success = convResult.Success, TransformedCode = convResult.TransformedCode, LinesConverted = convResult.Report?.LinesConverted ?? 0 }); if (convResult.Success) result.SuccessfulFiles++; } } catch (Exception ex) { result.Results.Add(new FileConversionResult { FileName = file.FileName, Success = false, ErrorMessage = ex.Message }); } } return Ok(result); } catch (Exception ex) { return StatusCode(500, new { error = ex.Message }); } } } public class BatchConversionRequest { public string SourceLanguage { get; set; } = ""; public string TargetLanguage { get; set; } = ""; public List? Files { get; set; } } public class FileRequest { public string FileName { get; set; } = ""; public string Content { get; set; } = ""; } public class BatchConversionResult { public bool Success => SuccessfulFiles > 0; public int TotalFiles { get; set; } public int SuccessfulFiles { get; set; } public List Results { get; set; } = new(); } public class FileConversionResult { public string FileName { get; set; } = ""; public bool Success { get; set; } public string? TransformedCode { get; set; } public string? ErrorMessage { get; set; } public int LinesConverted { get; set; } }