using Managing.Application.Abstractions; using Managing.Application.Abstractions.Services; using Managing.Application.Hubs; using Managing.Application.Workers.Abstractions; using Managing.Domain.Candles; using Managing.Domain.Statistics; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using static Managing.Common.Enums; namespace Managing.Api.Controllers; /// /// Controller for handling data-related operations such as retrieving tickers, spotlight data, and candles. /// Requires authorization for access. /// [ApiController] [Authorize] [Route("[controller]")] public class DataController : ControllerBase { private readonly IExchangeService _exchangeService; private readonly IAccountService _accountService; private readonly ICacheService _cacheService; private readonly IStatisticService _statisticService; private readonly IHubContext _hubContext; /// /// Initializes a new instance of the class. /// /// Service for interacting with exchanges. /// Service for account management. /// Service for caching data. /// Service for statistical analysis. /// SignalR hub context for real-time communication. public DataController( IExchangeService exchangeService, IAccountService accountService, ICacheService cacheService, IStatisticService statisticService, IHubContext hubContext) { _exchangeService = exchangeService; _accountService = accountService; _cacheService = cacheService; _statisticService = statisticService; _hubContext = hubContext; } /// /// Retrieves tickers for a given account and timeframe, utilizing caching to improve performance. /// /// The name of the account to retrieve tickers for. /// The timeframe for which to retrieve tickers. /// An array of tickers. [HttpPost("GetTickers")] public async Task> GetTickers(string accountName, Timeframe timeframe) { var account = await _accountService.GetAccount(accountName, true, false); var cacheKey = string.Concat(accountName, timeframe.ToString()); var tickers = _cacheService.GetOrSave(cacheKey, () => { return _exchangeService.GetTickers(account, timeframe).Result; }, TimeSpan.FromHours(2)); return Ok(tickers); } /// /// Retrieves the latest spotlight overview, using caching to enhance response times. /// /// A object containing spotlight data. [HttpGet("Spotlight")] public ActionResult GetSpotlight() { var overview = _cacheService.GetOrSave(nameof(SpotlightOverview), () => { return _statisticService.GetLastSpotlight(DateTime.Now.AddHours(-3)); }, TimeSpan.FromMinutes(2)); if (overview?.Spotlights.Count < overview?.ScenarioCount) { overview = _statisticService.GetLastSpotlight(DateTime.Now.AddHours(-3)); } return Ok(overview); } /// /// Retrieves candle data for a given exchange, ticker, start date, and timeframe. /// /// The exchange to retrieve candles from. /// The ticker symbol to retrieve candles for. /// The start date for the candle data. /// The timeframe for the candle data. /// A list of objects. [HttpGet("GetCandles")] public async Task>> GetCandles(TradingExchanges exchange, Ticker ticker, DateTime startDate, Timeframe timeframe) { return Ok(await _exchangeService.GetCandlesInflux(exchange, ticker, startDate, timeframe)); } }