diff --git a/Backend.cs b/Backend.cs index d75d60d..451c7f1 100644 --- a/Backend.cs +++ b/Backend.cs @@ -1,5 +1,6 @@ using Backend.DatabaseHandler; using Backend.ServiceHander; +using Backend.Interface; using Microsoft.AspNetCore.HttpOverrides; var builder = WebApplication.CreateBuilder(args); diff --git a/Controller/MarketDataController.cs b/Controller/MarketDataController.cs index d299ff5..6d2568a 100644 --- a/Controller/MarketDataController.cs +++ b/Controller/MarketDataController.cs @@ -2,7 +2,7 @@ using Backend.ServiceHander; using Backend.MarketDataRequest; using Microsoft.AspNetCore.Mvc; -namespace BackendApi.Controller +namespace Backend.Controller { [ApiController] [Route("api/market")] diff --git a/Controller/UserInterestController.cs b/Controller/UserInterestController.cs index eeb35a8..a95c9a0 100644 --- a/Controller/UserInterestController.cs +++ b/Controller/UserInterestController.cs @@ -1,66 +1,68 @@ using Backend.DatabaseHandler; -using Backend.UserInterests; +using Backend.ServiceHander; +using Backend.Interface; using Microsoft.AspNetCore.Mvc; -namespace Backend.Controllers; - -[ApiController] -[Route("api/user-interest")] -public sealed class UserInterestController : ControllerBase +namespace Backend.Controllers { - private readonly IUserInterestStore _store; - - public UserInterestController(IUserInterestStore store) + [ApiController] + [Route("api/user-interest")] + public sealed class UserInterestController : ControllerBase { - _store = store; - } + private readonly IUserInterestStore _store; - [HttpGet("fetch")] - public async Task> FetchAll( - [FromQuery] string user, - [FromQuery] string type) - { - try + public UserInterestController(IUserInterestStore store) { - List items = await _store.FetchAllAsync(user, type); - return Ok(new UserInterestFetchResponse + _store = store; + } + + [HttpGet("fetch")] + public async Task> FetchAll( + [FromQuery] string user, + [FromQuery] string type) + { + try { - Items = items - }); + List items = await _store.FetchAllAsync(user, type); + return Ok(new UserInterestFetchResponse + { + Items = items + }); + } + catch (ArgumentException ex) + { + return BadRequest(ex.Message); + } } - catch (ArgumentException ex) - { - return BadRequest(ex.Message); - } - } - [HttpPost("add")] - public async Task> Add( - [FromBody] UserInterestModifyRequest request) - { - try + [HttpPost("add")] + public async Task> Add( + [FromBody] UserInterestModifyRequest request) { - bool success = await _store.AddAsync(request.User, request.Type, request.Value); - return Ok(new BoolResponse { Success = success }); + try + { + bool success = await _store.AddAsync(request.User, request.Type, request.Value); + return Ok(new BoolResponse { Success = success }); + } + catch (ArgumentException ex) + { + return BadRequest(ex.Message); + } } - catch (ArgumentException ex) - { - return BadRequest(ex.Message); - } - } - [HttpDelete("remove")] - public async Task> Remove( - [FromBody] UserInterestModifyRequest request) - { - try + [HttpDelete("remove")] + public async Task> Remove( + [FromBody] UserInterestModifyRequest request) { - bool success = await _store.RemoveAsync(request.User, request.Type, request.Value); - return Ok(new BoolResponse { Success = success }); - } - catch (ArgumentException ex) - { - return BadRequest(ex.Message); + try + { + bool success = await _store.RemoveAsync(request.User, request.Type, request.Value); + return Ok(new BoolResponse { Success = success }); + } + catch (ArgumentException ex) + { + return BadRequest(ex.Message); + } } } } \ No newline at end of file diff --git a/DatabaseHandler/IUserInterestCache.cs b/DatabaseHandler/IUserInterestCache.cs deleted file mode 100644 index f9ed3f7..0000000 --- a/DatabaseHandler/IUserInterestCache.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Backend.DatabaseHandler; - -public interface IUserInterestStore -{ - Task> FetchAllAsync(string user, string type); - Task AddAsync(string user, string type, string value); - Task RemoveAsync(string user, string type, string value); -} \ No newline at end of file diff --git a/DatabaseHandler/PostgresHistoricalMarketDataStore.cs b/DatabaseHandler/PostgresHistoricalMarketDataStore.cs index ac449f7..50a4cd9 100644 --- a/DatabaseHandler/PostgresHistoricalMarketDataStore.cs +++ b/DatabaseHandler/PostgresHistoricalMarketDataStore.cs @@ -1,4 +1,5 @@ using Backend.MarketDataRequest; +using Backend.Interface; using Npgsql; namespace Backend.DatabaseHandler diff --git a/DatabaseHandler/PostgresUserInterestStore.cs b/DatabaseHandler/PostgresUserInterestStore.cs index dffecd3..d9f39bb 100644 --- a/DatabaseHandler/PostgresUserInterestStore.cs +++ b/DatabaseHandler/PostgresUserInterestStore.cs @@ -1,4 +1,5 @@ using Npgsql; +using Backend.Interface; namespace Backend.DatabaseHandler; diff --git a/DatabaseHandler/IHistoricalMarketDataCache.cs b/Interface/IHistoricalMarketDataCache.cs similarity index 88% rename from DatabaseHandler/IHistoricalMarketDataCache.cs rename to Interface/IHistoricalMarketDataCache.cs index fc44641..d4e2b42 100644 --- a/DatabaseHandler/IHistoricalMarketDataCache.cs +++ b/Interface/IHistoricalMarketDataCache.cs @@ -1,6 +1,7 @@ using Backend.MarketDataRequest; +using Backend.DatabaseHandler; -namespace Backend.DatabaseHandler +namespace Backend.Interface { public interface IHistoricalMarketDataCache { diff --git a/Interface/IUserInterestCache.cs b/Interface/IUserInterestCache.cs new file mode 100644 index 0000000..01233e1 --- /dev/null +++ b/Interface/IUserInterestCache.cs @@ -0,0 +1,9 @@ +namespace Backend.Interface +{ + public interface IUserInterestStore + { + Task> FetchAllAsync(string user, string type); + Task AddAsync(string user, string type, string value); + Task RemoveAsync(string user, string type, string value); + } +} \ No newline at end of file diff --git a/MarketDataRequest/IBGatewayControl.cs b/MarketDataRequest/IBGatewayControl.cs index 8778d11..a9eb51e 100644 --- a/MarketDataRequest/IBGatewayControl.cs +++ b/MarketDataRequest/IBGatewayControl.cs @@ -25,7 +25,7 @@ namespace Backend.MarketDataRequest private readonly ConcurrentDictionary _liveSnapshotsByRequest = new(); private readonly ConcurrentDictionary> _liveRequests = new(); - //Fundamentals data + // Fundamentals data private readonly ConcurrentDictionary _fundamentalsSnapshotsByRequest = new(); private readonly ConcurrentDictionary> _fundamentalsRequests = new(); @@ -131,6 +131,7 @@ namespace Backend.MarketDataRequest Console.WriteLine($"[error] id={id}, code={errorCode}, time={errorTime}, msg={errorMsg}"); + // Live requests if (id > 0 && _liveRequests.TryRemove(id, out var liveTcs)) { Client.cancelMktData(id); @@ -141,6 +142,7 @@ namespace Backend.MarketDataRequest return; } + // Historical requests if (id > 0 && _historyRequests.TryRemove(id, out var historyTcs)) { _BarsByRequest.TryRemove(id, out _); @@ -150,6 +152,7 @@ namespace Backend.MarketDataRequest return; } + // Fundamentals if (id > 0 && _fundamentalsRequests.TryRemove(id, out var fundamentalsTcs)) { Client.cancelMktData(id); diff --git a/ServiceHandler/MarketDataHander.cs b/ServiceHandler/MarketDataHander.cs index 3f85d8c..d7c865e 100644 --- a/ServiceHandler/MarketDataHander.cs +++ b/ServiceHandler/MarketDataHander.cs @@ -1,5 +1,6 @@ using Backend.DatabaseHandler; using Backend.MarketDataRequest; +using Backend.Interface; using IBApi; using System.Globalization; diff --git a/ServiceHandler/UserInterestsHandler.cs b/ServiceHandler/UserInterestsHandler.cs new file mode 100644 index 0000000..95d40c9 --- /dev/null +++ b/ServiceHandler/UserInterestsHandler.cs @@ -0,0 +1,25 @@ +namespace Backend.ServiceHander +{ + public sealed class UserInterestFetchRequest + { + public string User { get; set; } = string.Empty; + public string Type { get; set; } = string.Empty; // "symbol" or "topic" + } + + public sealed class UserInterestModifyRequest + { + public string User { get; set; } = string.Empty; + public string Type { get; set; } = string.Empty; // "symbol" or "topic" + public string Value { get; set; } = string.Empty; // symbol or topic + } + + public sealed class UserInterestFetchResponse + { + public List Items { get; set; } = new(); + } + + public sealed class BoolResponse + { + public bool Success { get; set; } + } +} \ No newline at end of file diff --git a/UserInterests/UserInterests.cs b/UserInterests/UserInterests.cs deleted file mode 100644 index 6271da8..0000000 --- a/UserInterests/UserInterests.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Backend.UserInterests; - -public sealed class UserInterestFetchRequest -{ - public string User { get; set; } = string.Empty; - public string Type { get; set; } = string.Empty; // "symbol" or "topic" -} - -public sealed class UserInterestModifyRequest -{ - public string User { get; set; } = string.Empty; - public string Type { get; set; } = string.Empty; // "symbol" or "topic" - public string Value { get; set; } = string.Empty; // symbol or topic -} - -public sealed class UserInterestFetchResponse -{ - public List Items { get; set; } = new(); -} - -public sealed class BoolResponse -{ - public bool Success { get; set; } -} \ No newline at end of file