Skip to content

Commit 1e88c90

Browse files
Add analytics API implementations and validation tests
- Introduced fake implementations for various analytics APIs including Game, Global, Map, Player, and Server analytics. - Created the DashboardAnalyticsApi and associated methods for retrieving dashboard analytics data. - Implemented validation logic for analytics query parameters in AnalyticsQueryValidator. - Added unit tests for validating analytics query parameters, ensuring correct behavior for time windows and bucket limits.
1 parent 4ad1eea commit 1e88c90

78 files changed

Lines changed: 2313 additions & 16 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
2+
3+
public enum AnalyticsBucket
4+
{
5+
FifteenMinutes,
6+
OneHour,
7+
OneDay
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
2+
3+
public static class AnalyticsQueryDefaults
4+
{
5+
public const int DefaultTop = 10;
6+
public const int MinTop = 1;
7+
public const int MaxTop = 100;
8+
9+
public const int FifteenMinuteMaxDays = 3;
10+
public const int OneHourMaxDays = 31;
11+
public const int OneDayMaxDays = 366;
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Dashboard;
5+
6+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
7+
8+
public interface IDashboardAnalyticsApi
9+
{
10+
Task<ApiResult<DashboardSummaryDto>> GetSummary(DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
11+
Task<ApiResult<DashboardTrendsDto>> GetTrends(DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
12+
Task<ApiResult<DashboardCompositionDto>> GetComposition(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
5+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Games;
6+
7+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
8+
9+
public interface IGameAnalyticsApi
10+
{
11+
Task<ApiResult<GameOverviewDto>> GetOverview(GameType gameType, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
12+
Task<ApiResult<GameTimeseriesDto>> GetTimeseries(GameType gameType, DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
13+
Task<ApiResult<GameServerBreakdownDto>> GetServerBreakdown(GameType gameType, DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
14+
Task<ApiResult<GamePlayerBreakdownDto>> GetPlayerBreakdown(GameType gameType, DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
15+
Task<ApiResult<GameMapBreakdownDto>> GetMapBreakdown(GameType gameType, DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Global;
5+
6+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
7+
8+
public interface IGlobalAnalyticsApi
9+
{
10+
Task<ApiResult<GlobalOverviewDto>> GetOverview(DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
11+
Task<ApiResult<GlobalTimeseriesDto>> GetTimeseries(DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
12+
Task<ApiResult<GlobalGameBreakdownDto>> GetGameBreakdown(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
13+
Task<ApiResult<GlobalServerBreakdownDto>> GetServerBreakdown(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
14+
Task<ApiResult<GlobalPlayerActivityDto>> GetPlayerActivity(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
15+
Task<ApiResult<GlobalGeoDistributionDto>> GetGeoDistribution(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
16+
Task<ApiResult<GlobalModerationDto>> GetModeration(DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
17+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Maps;
5+
6+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
7+
8+
public interface IMapAnalyticsApi
9+
{
10+
Task<ApiResult<MapOverviewDto>> GetOverview(Guid mapId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
11+
Task<ApiResult<MapTrendsDto>> GetTrends(Guid mapId, DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
12+
Task<ApiResult<MapRankingsDto>> GetRankings(DateTime fromUtc, DateTime toUtc, int top = AnalyticsQueryDefaults.DefaultTop, CancellationToken cancellationToken = default);
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Players;
5+
6+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
7+
8+
public interface IPlayerAnalyticsV2Api
9+
{
10+
Task<ApiResult<PlayerOverviewDto>> GetOverview(Guid playerId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
11+
Task<ApiResult<PlayerTrendsDto>> GetTrends(Guid playerId, DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
12+
Task<ApiResult<PlayerRelatedActivityDto>> GetRelatedActivity(Guid playerId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
13+
Task<ApiResult<PlayerModerationSummaryDto>> GetModerationSummary(Guid playerId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using MX.Api.Abstractions;
2+
3+
using XtremeIdiots.Portal.Repository.Abstractions.Constants.V1.Analytics;
4+
using XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics.Servers;
5+
6+
namespace XtremeIdiots.Portal.Repository.Abstractions.Interfaces.V1;
7+
8+
public interface IServerAnalyticsApi
9+
{
10+
Task<ApiResult<ServerOverviewDto>> GetOverview(Guid gameServerId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
11+
Task<ApiResult<ServerTimeseriesDto>> GetTimeseries(Guid gameServerId, DateTime fromUtc, DateTime toUtc, AnalyticsBucket bucket, CancellationToken cancellationToken = default);
12+
Task<ApiResult<ServerSummaryDto>> GetSummary(Guid gameServerId, DateTime fromUtc, DateTime toUtc, CancellationToken cancellationToken = default);
13+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Newtonsoft.Json;
2+
3+
namespace XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics;
4+
5+
public record AnalyticsBreakdownItemDto : IDto
6+
{
7+
[JsonProperty]
8+
public string Key { get; internal set; } = string.Empty;
9+
10+
[JsonProperty]
11+
public string Label { get; internal set; } = string.Empty;
12+
13+
[JsonProperty]
14+
public int Count { get; internal set; }
15+
16+
[JsonProperty]
17+
public double? Score { get; internal set; }
18+
19+
[JsonIgnore]
20+
public Dictionary<string, string> TelemetryProperties => [];
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Newtonsoft.Json;
2+
3+
namespace XtremeIdiots.Portal.Repository.Abstractions.Models.V1.Analytics;
4+
5+
public record AnalyticsSummaryMetricDto : IDto
6+
{
7+
[JsonProperty]
8+
public string Name { get; internal set; } = string.Empty;
9+
10+
[JsonProperty]
11+
public double Value { get; internal set; }
12+
13+
[JsonProperty]
14+
public string? Unit { get; internal set; }
15+
16+
[JsonIgnore]
17+
public Dictionary<string, string> TelemetryProperties => [];
18+
}

0 commit comments

Comments
 (0)