using Bitget_Server.Domain.Enums; using Bitget_Server.Infrastructure.Bitget; using Microsoft.AspNetCore.Mvc; namespace Bitget_Server.Api.Controllers; /// /// 기존 WinForms 의 BitGetWebSocektStart / closeWebSocket 버튼 REST 화. /// [ApiController] [Route("api/websocket")] [Produces("application/json")] public class WebSocketController : ControllerBase { private readonly BitgetWebSocketClient _ws; private readonly ILogger _logger; public WebSocketController(BitgetWebSocketClient ws, ILogger logger) { _ws = ws; _logger = logger; } /// 현재 WebSocket 연결 상태. [HttpGet("status")] [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] public IActionResult GetStatus() => Ok(new { connected = _ws.IsConnected }); /// /// WebSocket 연결 시작. subscribeArgs 는 Bitget 공식 포맷의 args 리스트. /// 예: [{"instType":"USDT-FUTURES","channel":"ticker","instId":"BTCUSDT"}] /// [HttpPost("start")] [ProducesResponseType(StatusCodes.Status202Accepted)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task Start( [FromQuery] BitgetWebSocketType type, [FromBody] IEnumerable subscribeArgs, CancellationToken ct) { try { var dic = new Dictionary { { "op", "subscribe" }, { "args", subscribeArgs ?? Array.Empty() } }; await _ws.StartAsync(type, dic, ct); return Accepted(); } catch (Exception ex) { _logger.LogError(ex, "WebSocket Start 실패"); return Problem(detail: ex.Message, statusCode: StatusCodes.Status500InternalServerError, title: "WebSocket start failed"); } } /// WebSocket 연결 종료. [HttpPost("stop")] [ProducesResponseType(StatusCodes.Status204NoContent)] public async Task Stop(CancellationToken ct) { await _ws.StopAsync(ct); return NoContent(); } }