using Microsoft.AspNetCore.Mvc; using CodePlay.Core.Models; using System.Collections.Concurrent; namespace CodePlay.WebAPI.Controllers; [ApiController] [Route("api/[controller]")] public class ProjectController : ControllerBase { private static readonly ConcurrentDictionary _projects = new(); private readonly ILogger _logger; public ProjectController(ILogger logger) => _logger = logger; [HttpPost] public ActionResult Create([FromBody] ProjectCreateRequest request) { var project = new ProjectInfo { Id = Guid.NewGuid(), Name = request.Name ?? "Untitled", SourceLanguage = request.SourceLanguage, TargetLanguage = request.TargetLanguage, CreatedAt = DateTime.UtcNow, Files = new List() }; _projects[project.Id] = project; return Created($"/api/projects/{project.Id}", project); } [HttpGet] public ActionResult> GetAll() => _projects.Values.OrderByDescending(p => p.CreatedAt).ToList(); [HttpGet("{id:guid}")] public ActionResult GetById(Guid id) => _projects.TryGetValue(id, out var p) ? p : NotFound(); [HttpPost("{id:guid}/files")] public ActionResult AddFile(Guid id, [FromBody] FileAddRequest req) { if (!_projects.TryGetValue(id, out var p)) return NotFound(); if (!p.Files.Contains(req.FileName)) { p.Files.Add(req.FileName); p.UpdatedAt = DateTime.UtcNow; } return Ok(p); } [HttpDelete("{id:guid}")] public IActionResult Delete(Guid id) => _projects.TryRemove(id, out _) ? NoContent() : NotFound(); } public class ProjectCreateRequest { public string? Name { get; set; } public string SourceLanguage { get; set; } = ""; public string TargetLanguage { get; set; } = ""; } public class FileAddRequest { public string FileName { get; set; } = ""; }