using Fengling.Console.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Fengling.Console.Controllers; [ApiController] [Route("api/[controller]")] [Authorize] public class OAuthClientsController : ControllerBase { private readonly IOAuthClientService _service; private readonly ILogger _logger; public OAuthClientsController( IOAuthClientService service, ILogger logger) { _service = service; _logger = logger; } [HttpGet] public async Task> GetClients( [FromQuery] int page = 1, [FromQuery] int pageSize = 10, [FromQuery] string? displayName = null, [FromQuery] string? clientId = null, [FromQuery] string? status = null) { try { var (items, totalCount) = await _service.GetClientsAsync(page, pageSize, displayName, clientId, status); return Ok(new { items, totalCount, page, pageSize }); } catch (Exception ex) { _logger.LogError(ex, "Error getting clients"); return StatusCode(500, new { message = ex.Message }); } } [HttpGet("options")] public ActionResult GetClientOptions() { return Ok(_service.GetClientOptions()); } [HttpGet("{id}")] public async Task> GetClient(string id) { try { var client = await _service.GetClientAsync(id); if (client == null) { return NotFound(); } return Ok(client); } catch (Exception ex) { _logger.LogError(ex, "Error getting client {Id}", id); return StatusCode(500, new { message = ex.Message }); } } [HttpPost] public async Task> CreateClient([FromBody] CreateClientDto dto) { try { var result = await _service.CreateClientAsync(dto); return StatusCode(201, result); } catch (InvalidOperationException ex) { return BadRequest(new { message = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error creating client"); return StatusCode(500, new { message = ex.Message }); } } [HttpPost("{id}/generate-secret")] public async Task GenerateSecret(string id) { try { var result = await _service.GenerateSecretAsync(id); return Ok(result); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error generating secret for client {Id}", id); return StatusCode(500, new { message = ex.Message }); } } [HttpDelete("{id}")] public async Task DeleteClient(string id) { try { await _service.DeleteClientAsync(id); return NoContent(); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error deleting client {Id}", id); return StatusCode(500, new { message = ex.Message }); } } [HttpPut("{id}")] public async Task UpdateClient(string id, [FromBody] UpdateClientDto dto) { try { await _service.UpdateClientAsync(id, dto); return NoContent(); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error updating client {Id}", id); return StatusCode(500, new { message = ex.Message }); } } }