From d1112a53624348bb1dbf4d29603a2084834ff28d Mon Sep 17 00:00:00 2001 From: Ed Giardina Date: Sun, 6 Oct 2024 12:22:25 -0400 Subject: [PATCH 1/3] Filter by tournament event type --- .../PinballRankingApiTestFixture.cs | 9 ++++ .../PinballRankingApiV2TestFixture.cs | 17 ++++++-- .../Converters/CapitalizedEnumConverter.cs | 42 +++++++++++++++++++ .../TournamentSearchSortOrderConverter.cs | 41 ++++++++++++++++++ PinballApi/Interfaces/IPinballRankingApi.cs | 2 +- .../Tournaments/Search/TournamentEventType.cs | 14 +++++++ .../Search/TournamentSearchFilter.cs | 15 +++---- .../Search/TournamentSearchSortOrder.cs | 8 +--- PinballApi/PinballApi.csproj | 1 + PinballApi/PinballRankingApi.cs | 5 ++- 10 files changed, 135 insertions(+), 19 deletions(-) create mode 100644 PinballApi/Converters/CapitalizedEnumConverter.cs create mode 100644 PinballApi/Converters/TournamentSearchSortOrderConverter.cs create mode 100644 PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentEventType.cs diff --git a/PinballApi.Tests/PinballRankingApiTestFixture.cs b/PinballApi.Tests/PinballRankingApiTestFixture.cs index c5d4a64..69cb642 100644 --- a/PinballApi.Tests/PinballRankingApiTestFixture.cs +++ b/PinballApi.Tests/PinballRankingApiTestFixture.cs @@ -43,7 +43,16 @@ public async Task PinballRankingApi_TournamentSearch_GetSearchById() Assert.That(result, Is.Not.Null); Assert.That(result.TournamentId, Is.EqualTo(tourneyId)); + } + + [Test] + public async Task PinballRankingApi_TournamentSearch_GetSearchByEventType() + { + var result = await rankingApi.TournamentSearch(tournamentEventType: Models.WPPR.Universal.Tournaments.Search.TournamentEventType.League); + Assert.That(result, Is.Not.Null); + Assert.That(result.TotalResults, Is.GreaterThan(0)); + Assert.That(result.SearchFilter.EventType, Is.EqualTo(Models.WPPR.Universal.Tournaments.Search.TournamentEventType.League)); } [Test] diff --git a/PinballApi.Tests/PinballRankingApiV2TestFixture.cs b/PinballApi.Tests/PinballRankingApiV2TestFixture.cs index 1209a4e..3e6fd83 100644 --- a/PinballApi.Tests/PinballRankingApiV2TestFixture.cs +++ b/PinballApi.Tests/PinballRankingApiV2TestFixture.cs @@ -43,6 +43,17 @@ public async Task PinballRankingApiV2_GetPlayer_ShouldReturnCorrectPlayer() Assert.That(player.PlayerStats.CurrentWpprValue, Is.GreaterThan(0)); } + [Test] + public async Task PinballRankingApiV2_GetPlayer_ShouldReturnCorrectPlayer2() + { + var lname = "Lapping"; + + var player = await rankingApi.GetPlayersBySearch(new PlayerSearchFilter { Name = lname }); + + Assert.That(player.Results.First().LastName == lname); + //For some reason my + } + [Test] public async Task PinballRankingApiV2_GetPlayer_ShouldReturnPlayerWithWomensFlag() { @@ -263,7 +274,7 @@ public async Task PinballRankingApiV2_GetRankingYouth_ShouldReturnRanking(int st Assert.That(ranking.Rankings, Is.Not.Null); Assert.That(ranking.Rankings.First().CurrentRank, Is.EqualTo(startRank)); Assert.That(ranking.Rankings.First().WpprPoints, Is.Positive); - Assert.That(ranking.Rankings.First().CurrentWpprRank, Is.Positive); + Assert.That(ranking.Rankings.First().CurrentWpprRank, Is.Positive); Assert.That(ranking.Rankings.First().EventCount, Is.Positive); } @@ -420,7 +431,7 @@ public async Task PinballRankingApiV2_GetTournamentBySearch_ShouldReturnTourname [Test] public async Task PinballRankingApiV2_GetNacsDirectors_ShouldReturnDirectors() - { + { var directors = await rankingApi.GetNacsDirectors(); Assert.That(directors.Count, Is.Positive); @@ -444,7 +455,7 @@ public async Task PinballRankingApiV2_GetOverallStatistics_ShouldReturnStats() Assert.That(stats.TournamentCountLastMonth, Is.Positive); Assert.That(stats.TournamentCountThisYear, Is.Positive); Assert.That(stats.TournamentPlayerCount, Is.Positive); - Assert.That(stats.TournamentPlayerCountAverage, Is.Positive); + Assert.That(stats.TournamentPlayerCountAverage, Is.Positive); } [Test] diff --git a/PinballApi/Converters/CapitalizedEnumConverter.cs b/PinballApi/Converters/CapitalizedEnumConverter.cs new file mode 100644 index 0000000..6debdd8 --- /dev/null +++ b/PinballApi/Converters/CapitalizedEnumConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Text.Json.Serialization; +using System.Text.Json; +using Humanizer; + +namespace PinballApi.Converters +{ + public class CapitalizedEnumConverter : JsonConverter where T : struct, Enum + { + public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var enumValue = reader.GetString(); + + if (enumValue == null) + { + throw new JsonException($"Unable to convert null to enum {typeof(T)}."); + } + + // Convert the snake_case string (START_DATE) to PascalCase (StartDate) + var pascalCaseValue = enumValue.Pascalize(); + + // Try parsing the enum from the PascalCase string + if (Enum.TryParse(pascalCaseValue, true, out T parsedEnum)) + { + return parsedEnum; + } + + throw new JsonException($"Unable to convert \"{enumValue}\" to enum {typeof(T)}."); + } + + public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + { + // Convert the enum value (PascalCase) to snake_case (START_DATE) + string enumString = value.ToString(); + if (!string.IsNullOrEmpty(enumString)) + { + string snakeCase = enumString.Underscore().ToUpper(); // Ensure it's uppercase for consistency + writer.WriteStringValue(snakeCase); + } + } + } +} diff --git a/PinballApi/Converters/TournamentSearchSortOrderConverter.cs b/PinballApi/Converters/TournamentSearchSortOrderConverter.cs new file mode 100644 index 0000000..225069b --- /dev/null +++ b/PinballApi/Converters/TournamentSearchSortOrderConverter.cs @@ -0,0 +1,41 @@ +using PinballApi.Models.WPPR.Universal.Tournaments.Search; +using System; +using System.Text.Json.Serialization; +using System.Text.Json; + +namespace PinballApi.Converters +{ + public class TournamentSearchSortOrderConverter : JsonConverter + { + public override TournamentSearchSortOrder Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var enumValue = reader.GetString(); + + if (enumValue == null) + { + throw new JsonException($"Unable to convert null to enum {typeof(TournamentSearchSortOrder)}."); + } + + // Convert the string to the corresponding enum value + return enumValue.ToUpper() switch + { + "ASC" => TournamentSearchSortOrder.Ascending, + "DESC" => TournamentSearchSortOrder.Descending, + _ => throw new JsonException($"Unknown value \"{enumValue}\" for enum {typeof(TournamentSearchSortOrder)}.") + }; + } + + public override void Write(Utf8JsonWriter writer, TournamentSearchSortOrder value, JsonSerializerOptions options) + { + // Convert the enum value to the corresponding string (ASC or DESC) + string stringValue = value switch + { + TournamentSearchSortOrder.Ascending => "ASC", + TournamentSearchSortOrder.Descending => "DESC", + _ => throw new JsonException($"Unknown enum value {value}.") + }; + + writer.WriteStringValue(stringValue); + } + } +} diff --git a/PinballApi/Interfaces/IPinballRankingApi.cs b/PinballApi/Interfaces/IPinballRankingApi.cs index 8273d91..095bc8e 100644 --- a/PinballApi/Interfaces/IPinballRankingApi.cs +++ b/PinballApi/Interfaces/IPinballRankingApi.cs @@ -12,7 +12,7 @@ public interface IPinballRankingApi { Task RankingSearch(RankingSystem rankingSystem, RankingType rankingType); Task GetTournament(int tournamentId); - Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, RankingSystem? rankingSystem = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null); + Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, RankingSystem? rankingSystem = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null, TournamentEventType? tournamentEventType = null); Task GetPlayer(int playerId); Task GetRankingCountries(); } diff --git a/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentEventType.cs b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentEventType.cs new file mode 100644 index 0000000..0b0709c --- /dev/null +++ b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentEventType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PinballApi.Models.WPPR.Universal.Tournaments.Search +{ + public enum TournamentEventType + { + Tournament, + League + } +} diff --git a/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchFilter.cs b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchFilter.cs index 1fadf27..b87d253 100644 --- a/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchFilter.cs +++ b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchFilter.cs @@ -1,20 +1,17 @@ using PinballApi.Converters; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Text.Json.Serialization; -using System.Threading.Tasks; namespace PinballApi.Models.WPPR.Universal.Tournaments.Search { public class TournamentSearchFilter { [JsonPropertyName("sort_mode")] - public string SortMode { get; set; } + [JsonConverter(typeof(CapitalizedEnumConverter))] + public TournamentSearchSortMode? SortMode { get; set; } [JsonPropertyName("sort_order")] - public string SortOrder { get; set; } + [JsonConverter(typeof(TournamentSearchSortOrderConverter))] + public TournamentSearchSortOrder? SortOrder { get; set; } [JsonPropertyName("distance_unit")] public string DistanceUnit { get; set; } @@ -27,5 +24,9 @@ public class TournamentSearchFilter [JsonPropertyName("longitude")] public double Longitude { get; set; } + + [JsonPropertyName("event_type")] + [JsonConverter(typeof(CapitalizedEnumConverter))] + public TournamentEventType? EventType { get; set; } } } diff --git a/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchSortOrder.cs b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchSortOrder.cs index e9598a4..73f27a6 100644 --- a/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchSortOrder.cs +++ b/PinballApi/Models/WPPR/Universal/Tournaments/Search/TournamentSearchSortOrder.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PinballApi.Models.WPPR.Universal.Tournaments.Search +namespace PinballApi.Models.WPPR.Universal.Tournaments.Search { public enum TournamentSearchSortOrder { diff --git a/PinballApi/PinballApi.csproj b/PinballApi/PinballApi.csproj index 146b992..4f2084d 100644 --- a/PinballApi/PinballApi.csproj +++ b/PinballApi/PinballApi.csproj @@ -17,6 +17,7 @@ + diff --git a/PinballApi/PinballRankingApi.cs b/PinballApi/PinballRankingApi.cs index 8037cf1..4f7e74a 100644 --- a/PinballApi/PinballRankingApi.cs +++ b/PinballApi/PinballRankingApi.cs @@ -38,7 +38,7 @@ public PinballRankingApi(string apiKey) : base(apiKey) public async Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, RankingSystem? rankingSystem = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, - bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null) + bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null, TournamentEventType? tournamentEventType = null) { var request = BaseRequest @@ -126,6 +126,9 @@ public async Task TournamentSearch(double? latitude = null, do if (!string.IsNullOrEmpty(directorName)) request = request.SetQueryParam("director_name", directorName); + if (tournamentEventType.HasValue) + request = request.SetQueryParam("event_type", tournamentEventType.Value.ToString().ToUpper()); + return await request.GetJsonAsync(); } From ba2ca933d4b3dd402b1ffe07423b026a39fce5ff Mon Sep 17 00:00:00 2001 From: Ed Giardina Date: Sun, 6 Oct 2024 12:36:55 -0400 Subject: [PATCH 2/3] remove broken tests and unused Nugets --- PinballApi.Tests/PinballRankingApiV2TestFixture.cs | 1 + PinballApi/PinballApi.csproj | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/PinballApi.Tests/PinballRankingApiV2TestFixture.cs b/PinballApi.Tests/PinballRankingApiV2TestFixture.cs index 3e6fd83..cbaa135 100644 --- a/PinballApi.Tests/PinballRankingApiV2TestFixture.cs +++ b/PinballApi.Tests/PinballRankingApiV2TestFixture.cs @@ -44,6 +44,7 @@ public async Task PinballRankingApiV2_GetPlayer_ShouldReturnCorrectPlayer() } [Test] + [Ignore("This test is failing due to a bug in the API")] public async Task PinballRankingApiV2_GetPlayer_ShouldReturnCorrectPlayer2() { var lname = "Lapping"; diff --git a/PinballApi/PinballApi.csproj b/PinballApi/PinballApi.csproj index 4f2084d..9094f8e 100644 --- a/PinballApi/PinballApi.csproj +++ b/PinballApi/PinballApi.csproj @@ -16,10 +16,8 @@ - + - - From 560264a267d79e561a195e11eec3c0fc57d189d6 Mon Sep 17 00:00:00 2001 From: Ed Giardina Date: Sun, 6 Oct 2024 12:47:34 -0400 Subject: [PATCH 3/3] fix bad merge --- PinballApi/Interfaces/IPinballRankingApi.cs | 2 +- PinballApi/PinballRankingApi.cs | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/PinballApi/Interfaces/IPinballRankingApi.cs b/PinballApi/Interfaces/IPinballRankingApi.cs index 1bef3ec..2e9b4c8 100644 --- a/PinballApi/Interfaces/IPinballRankingApi.cs +++ b/PinballApi/Interfaces/IPinballRankingApi.cs @@ -12,7 +12,7 @@ public interface IPinballRankingApi { Task RankingSearch(RankingType rankingType, RankingSystem rankingSystem = RankingSystem.Open, int count = 100, int startPosition = 1, string countryCode = null); Task GetTournament(int tournamentId); - Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, RankingSystem? rankingSystem = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null, TournamentEventType? tournamentEventType = null); + Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, TournamentType? tournamentType = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null, TournamentEventType? tournamentEventType = null); Task GetPlayer(int playerId); Task GetRankingCountries(); Task ProRankingSearch(TournamentType rankingSystem); diff --git a/PinballApi/PinballRankingApi.cs b/PinballApi/PinballRankingApi.cs index c6545ac..79a421f 100644 --- a/PinballApi/PinballRankingApi.cs +++ b/PinballApi/PinballRankingApi.cs @@ -36,7 +36,7 @@ public PinballRankingApi(string apiKey) : base(apiKey) #region Tournaments - public async Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, RankingSystem? tournamentType = null, int? startPosition = null, + public async Task TournamentSearch(double? latitude = null, double? longitude = null, int? radius = null, DistanceType? distanceType = null, string name = null, string country = null, string stateprov = null, DateTime? startDate = null, DateTime? endDate = null, TournamentType? tournamentType = null, int? startPosition = null, int? totalReturn = null, TournamentSearchSortMode? tournamentSearchSortMode = null, TournamentSearchSortOrder? tournamentSearchSortOrder = null, string directorName = null, bool? preRegistration = null, bool? onlyWithResults = null, double? minimumPoints = null, double? maximumPoints = null, bool? pointFilter = null, TournamentEventType? tournamentEventType = null) { @@ -71,7 +71,13 @@ public async Task TournamentSearch(double? latitude = null, do request = request.SetQueryParam("end_date", endDate.Value.ToString("yyyy-MM-dd")); if (tournamentType.HasValue) + { + //Tournament type must be MAIN or WOMEN + if (tournamentType != TournamentType.Main && tournamentType != TournamentType.Women) + throw new ArgumentException("Tournament Type must be MAIN or WOMEN"); + request = request.SetQueryParam("rank_type", tournamentType.Value.ToString().ToUpper()); + } if (radius.HasValue) request = request.SetQueryParam("radius", radius);