Skip to content

Commit da879e0

Browse files
committed
Add Gainers, Losers, Most Active data
1 parent 4f36144 commit da879e0

File tree

9 files changed

+157
-1
lines changed

9 files changed

+157
-1
lines changed

FinancialModelingPrepApi/Abstractions/IFinancialModelingPrepApiClient.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
44
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
55
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
6+
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
67
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
78

89
namespace MatthiWare.FinancialModelingPrep
@@ -42,5 +43,10 @@ public interface IFinancialModelingPrepApiClient
4243
/// All Stock Time Series Endpoints are grouped here
4344
/// </summary>
4445
IStockTimeSeriesProvider StockTimeSeries { get; }
46+
47+
/// <summary>
48+
/// All Stock Market Related Endpoints are grouped here (Most Active, Gainers, Losers)
49+
/// </summary>
50+
IStockMarketProvider StockMarket { get; }
4551
}
4652
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using MatthiWare.FinancialModelingPrep.Model;
2+
using MatthiWare.FinancialModelingPrep.Model.StockMarket;
3+
using System.Collections.Generic;
4+
using System.Threading.Tasks;
5+
6+
namespace MatthiWare.FinancialModelingPrep.Abstractions.StockMarket
7+
{
8+
public interface IStockMarketProvider
9+
{
10+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetMostActiveStocksAsync();
11+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetBiggestGainerStocksAsync();
12+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetBiggestLoserStocksAsync();
13+
}
14+
}

FinancialModelingPrepApi/Core/FinancialModelingPrepApiClient.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
44
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
55
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
6+
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
67
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
78

89
namespace MatthiWare.FinancialModelingPrep.Core
@@ -28,19 +29,24 @@ public class FinancialModelingPrepApiClient : IFinancialModelingPrepApiClient
2829
/// <inheritdoc/>
2930
public IStockTimeSeriesProvider StockTimeSeries { get; }
3031

32+
/// <inheritdoc/>
33+
public IStockMarketProvider StockMarket { get; }
34+
3135
public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation,
3236
IMarketIndexesProvider marketIndexes,
3337
IAdvancedDataProvider advancedData,
3438
ICalendarsProvider calendars,
3539
IInstitutionalFundProvider institutionalFund,
36-
IStockTimeSeriesProvider stockTimeSeries)
40+
IStockTimeSeriesProvider stockTimeSeries,
41+
IStockMarketProvider stockMarket)
3742
{
3843
CompanyValuation = companyValuation;
3944
MarketIndexes = marketIndexes;
4045
AdvancedData = advancedData;
4146
Calendars = calendars;
4247
InstitutionalFund = institutionalFund;
4348
StockTimeSeries = stockTimeSeries;
49+
StockMarket = stockMarket;
4450
}
4551
}
4652
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
2+
using MatthiWare.FinancialModelingPrep.Core.Http;
3+
using MatthiWare.FinancialModelingPrep.Model;
4+
using MatthiWare.FinancialModelingPrep.Model.StockMarket;
5+
using System.Collections.Generic;
6+
using System.Collections.Specialized;
7+
using System.Threading.Tasks;
8+
9+
namespace MatthiWare.FinancialModelingPrep.Core.StockMarket
10+
{
11+
public sealed class StockMarketProvider : IStockMarketProvider
12+
{
13+
private const string ActivesEndpoint = "actives";
14+
private const string GainersEndpoint = "gainers";
15+
private const string LosersEndpoint = "losers";
16+
17+
private readonly FinancialModelingPrepHttpClient client;
18+
19+
public StockMarketProvider(FinancialModelingPrepHttpClient client)
20+
{
21+
this.client = client ?? throw new System.ArgumentNullException(nameof(client));
22+
}
23+
24+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetBiggestGainerStocksAsync()
25+
=> GetStockMarketData(GainersEndpoint);
26+
27+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetBiggestLoserStocksAsync()
28+
=> GetStockMarketData(LosersEndpoint);
29+
30+
public Task<ApiResponse<List<StockMarketSymbolResponse>>> GetMostActiveStocksAsync()
31+
=> GetStockMarketData(ActivesEndpoint);
32+
33+
private Task<ApiResponse<List<StockMarketSymbolResponse>>> GetStockMarketData(string endpoint)
34+
{
35+
const string url = "[version]/[endpoint]";
36+
37+
var pathParams = new NameValueCollection()
38+
{
39+
{ "version", ApiVersion.v3.ToString() },
40+
{ "endpoint", endpoint },
41+
};
42+
43+
return client.GetJsonAsync<List<StockMarketSymbolResponse>>(url, pathParams, null);
44+
}
45+
}
46+
}

FinancialModelingPrepApi/DependencyInjectionExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using MatthiWare.FinancialModelingPrep.Abstractions.Http;
55
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
66
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
7+
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
78
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
89
using MatthiWare.FinancialModelingPrep.Core;
910
using MatthiWare.FinancialModelingPrep.Core.AdvancedData;
@@ -12,6 +13,7 @@
1213
using MatthiWare.FinancialModelingPrep.Core.Http;
1314
using MatthiWare.FinancialModelingPrep.Core.InstitutionalFund;
1415
using MatthiWare.FinancialModelingPrep.Core.MarketIndexes;
16+
using MatthiWare.FinancialModelingPrep.Core.StockMarket;
1517
using MatthiWare.FinancialModelingPrep.Core.StockTimeSeries;
1618
using Microsoft.Extensions.DependencyInjection;
1719
using Microsoft.Extensions.DependencyInjection.Extensions;
@@ -44,6 +46,7 @@ public static void AddFinancialModelingPrepApiClient(this IServiceCollection ser
4446
services.TryAddTransient<ICalendarsProvider, CalendarsProvider>();
4547
services.TryAddTransient<IInstitutionalFundProvider, InstitutionalFundProvider>();
4648
services.TryAddTransient<IStockTimeSeriesProvider, StockTimeSeriesProvider>();
49+
services.TryAddTransient<IStockMarketProvider, StockMarketProvider>();
4750
}
4851
}
4952
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace MatthiWare.FinancialModelingPrep.Model.StockMarket
4+
{
5+
public class StockMarketSymbolResponse
6+
{
7+
[JsonPropertyName("ticker")]
8+
public string Ticker { get; set; }
9+
10+
[JsonPropertyName("changes")]
11+
public double Changes { get; set; }
12+
13+
[JsonPropertyName("price")]
14+
public string Price { get; set; }
15+
16+
[JsonPropertyName("changesPercentage")]
17+
public string ChangesPercentage { get; set; }
18+
19+
[JsonPropertyName("companyName")]
20+
public string CompanyName { get; set; }
21+
}
22+
}

Tests/ClientFactoryTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,11 @@ public void API_Contains_StockTimeSeries_Provider()
4747
{
4848
Assert.NotNull(api.StockTimeSeries);
4949
}
50+
51+
[Fact]
52+
public void API_Contains_StockMarket_Provider()
53+
{
54+
Assert.NotNull(api.StockMarket);
55+
}
5056
}
5157
}

Tests/ResolveApiTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,13 @@ public void API_Contains_StockTimeSeries_Provider()
5858

5959
Assert.NotNull(api.StockTimeSeries);
6060
}
61+
62+
[Fact]
63+
public void API_Contains_StockMarket_Provider()
64+
{
65+
var api = ServiceProvider.GetRequiredService<IFinancialModelingPrepApiClient>();
66+
67+
Assert.NotNull(api.StockMarket);
68+
}
6169
}
6270
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using System.Threading.Tasks;
4+
using Xunit;
5+
using Xunit.Abstractions;
6+
7+
namespace Tests.StockMarket
8+
{
9+
public class StockMarketTests : TestingBase
10+
{
11+
private readonly IStockMarketProvider api;
12+
13+
public StockMarketTests(ITestOutputHelper testOutput) : base(testOutput)
14+
{
15+
api = ServiceProvider.GetRequiredService<IStockMarketProvider>();
16+
}
17+
18+
[Fact]
19+
public async Task GetMostActiveStocksAsync()
20+
{
21+
var result = await api.GetMostActiveStocksAsync();
22+
23+
result.AssertNoErrors();
24+
Assert.NotEmpty(result.Data);
25+
}
26+
27+
[Fact]
28+
public async Task GetBiggestGainerStocksAsync()
29+
{
30+
var result = await api.GetBiggestGainerStocksAsync();
31+
32+
result.AssertNoErrors();
33+
Assert.NotEmpty(result.Data);
34+
}
35+
36+
[Fact]
37+
public async Task GetBiggestLoserStocksAsync()
38+
{
39+
var result = await api.GetBiggestLoserStocksAsync();
40+
41+
result.AssertNoErrors();
42+
Assert.NotEmpty(result.Data);
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)