using Canon.Server.DataTransferObjects; using Canon.Server.Entities; using Canon.Server.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Canon.Server.Controllers; [ApiController] [Route("api/[controller]")] public class CompilerController(CompileDbContext dbContext, CompilerService compilerService) : ControllerBase { [HttpGet] public async Task>> ListResponses([FromQuery] int start = 1, [FromQuery] int end = 20) { if (end <= start || start < 1) { return BadRequest(); } IQueryable results = from item in dbContext.CompileResults.AsNoTracking() orderby item.CompileTime descending select item; IEnumerable cachedResults = await results.ToListAsync(); IEnumerable responses = cachedResults.Skip(start - 1) .Take(end - start + 1) .Select(result => new CompileResponse(result)); return Ok(responses); } [HttpGet("{compileId}")] public async Task> GetResponse(string compileId) { CompileResult? result = await (from item in dbContext.CompileResults.AsNoTracking() where item.CompileId == compileId select item).FirstOrDefaultAsync(); if (result is null) { return NotFound(); } return Ok(new CompileResponse(result)); } [HttpPost] public async Task> Compile(SourceCode sourceCode) { CompileResponse response = await compilerService.Compile(sourceCode); return Ok(response); } [HttpDelete("{compileId}")] [ProducesResponseType(204)] [ProducesResponseType(404)] public async Task DeleteCompileResult(string compileId) { CompileResult? result = await (from item in dbContext.CompileResults where item.CompileId == compileId select item).FirstOrDefaultAsync(); if (result is null) { return NotFound(); } dbContext.CompileResults.Remove(result); await dbContext.SaveChangesAsync(); return NoContent(); } [HttpDelete] [ProducesResponseType(204)] public async Task DeleteAllCompileResult() { dbContext.CompileResults.RemoveRange(dbContext.CompileResults); await dbContext.SaveChangesAsync(); return NoContent(); } }