diff --git a/Expedience.Api/Controllers/ExpedienceController.cs b/Expedience.Api/Controllers/ExpedienceController.cs index ed8d028..4dd2911 100644 --- a/Expedience.Api/Controllers/ExpedienceController.cs +++ b/Expedience.Api/Controllers/ExpedienceController.cs @@ -125,13 +125,15 @@ namespace Expedience.Api.Controllers var results = new List(); foreach (var record in records) { - var topXResult = record.TopXResult; var dcr = record.DutyCompletionResult; + var territory = record.Territory; + var user = record.User; + var dutyCompletionResult = new DutyCompletionResult { - Id = topXResult.Id, - UserId = topXResult.UserId, - TerritoryId = topXResult.TerritoryId, + Id = dcr.Id, + UserId = user.UserId, + TerritoryId = territory.TerritoryId, IsMinILevel = recordType == 3, HasNpcMembers = recordType == 4, StartTime = dcr.StartTime, @@ -144,8 +146,23 @@ namespace Expedience.Api.Controllers PluginVersion = dcr.PluginVersion, Lang = dcr.Lang, UploadedAt = dcr.UploadedAt, - Territory = record.Territory, - User = record.User, + Territory = new Models.Territory + { + TerritoryId = dcr.TerritoryId, + PlaceName = territory.PlaceName, + ContentId = String.Empty, + ContentName = territory.ContentName, + ContentType = territory.ContentType, + Expac = territory.Expac, + Level = territory.Level, + }, + User = new User + { + UserId = user.UserId, + UserName = user.UserName, + UserHash = String.Empty, + WorldId = user.WorldId, + }, DataCenter = dcr.DataCenter, }; diff --git a/Expedience.Infrastructure/ExpedienceContext.cs b/Expedience.Infrastructure/ExpedienceContext.cs index 9880eda..4941384 100644 --- a/Expedience.Infrastructure/ExpedienceContext.cs +++ b/Expedience.Infrastructure/ExpedienceContext.cs @@ -1,4 +1,5 @@ -using Expedience.Infrastructure.Models; +using Expedience.Infrasctructure.Models; +using Expedience.Infrastructure.Models; using Expedience.Models; using Microsoft.EntityFrameworkCore; diff --git a/Expedience.Infrastructure/ExpedienceRepository.cs b/Expedience.Infrastructure/ExpedienceRepository.cs index 036f342..a358e4f 100644 --- a/Expedience.Infrastructure/ExpedienceRepository.cs +++ b/Expedience.Infrastructure/ExpedienceRepository.cs @@ -1,6 +1,10 @@ using System; +using System.Collections.Generic; +using EFCore.NamingConventions.Internal; using Enyim.Caching; +using Expedience.Infrasctructure.Models; using Expedience.Infrastructure.Models; +using Expedience.Models; using Microsoft.EntityFrameworkCore; namespace Expedience.Infrastructure; @@ -9,7 +13,7 @@ public interface IExpedienceRepository { ValueTask> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken); ValueTask> GetDeepDungeonRecords(CancellationToken cancellationToken); - ValueTask> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken); + ValueTask> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken); } public class ExpedienceRepository : IExpedienceRepository @@ -45,7 +49,7 @@ public class ExpedienceRepository : IExpedienceRepository return records; } - public async ValueTask> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken) + public async ValueTask> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken) { var cacheKey = $"xpd-topx-{recordType}-{territoryId}-{limit}"; @@ -56,17 +60,37 @@ public class ExpedienceRepository : IExpedienceRepository var topXResults = await _dbContext.TopXRecords.FromSqlInterpolated($"SELECT * FROM public.get_topxcompletionresults({recordType}, {territoryId}, {limit})") .ToListAsync(cancellationToken); - // Get the IDs we need for our related entities - var topXIds = topXResults.Select(r => r.Id).ToList(); + if (topXResults.Count == 0) return new List(); + + var uploadId = topXResults.First().Id; var userIds = topXResults.Select(r => r.UserId).Distinct().ToList(); - // Then, fetch the related DutyMembers and DutyCompletionResults - var dutyMembers = await _dbContext.DutyMembers - .Where(dm => topXIds.Contains(dm.UploadId)) - .ToListAsync(); + var dutyCompletionResult = await _dbContext.DutyCompletionResults + .FirstAsync(dcr => dcr.Id == uploadId); - var dutyCompletionResults = await _dbContext.DutyCompletionResults - .Where(dcr => topXIds.Contains(dcr.Id)) + var dcrDto = new DutyCompletionResultDto + { + Id = uploadId, + UserId = dutyCompletionResult.UserId, + TerritoryId = dutyCompletionResult.TerritoryId, + HasEcho = dutyCompletionResult.HasEcho, + IsUnrestricted = dutyCompletionResult.IsUnrestricted, + IsMinILevel = dutyCompletionResult.IsMinILevel, + HasNpcMembers = dutyCompletionResult.HasNpcMembers, + StartTime = dutyCompletionResult.StartTime, + EndTime = dutyCompletionResult.EndTime, + Hours = dutyCompletionResult.Hours, + Minutes = dutyCompletionResult.Minutes, + Seconds = dutyCompletionResult.Seconds, + Milliseconds = dutyCompletionResult.Milliseconds, + GameVersion = dutyCompletionResult.GameVersion, + PluginVersion = dutyCompletionResult.PluginVersion, + Lang = dutyCompletionResult.Lang, + DataCenter = dutyCompletionResult.DataCenter, + UploadedAt = dutyCompletionResult.UploadedAt + }; + var dutyMembers = await _dbContext.DutyMembers + .Where(dm => dm.UploadId == uploadId) .ToListAsync(); var users = await _dbContext.Users @@ -74,19 +98,49 @@ public class ExpedienceRepository : IExpedienceRepository .ToListAsync(); var territory = await _dbContext.Territories - .FirstAsync(t => territoryId == t.TerritoryId); + .FirstAsync(t => t.TerritoryId == territoryId); - // Create TopXCompletionResultFull objects - var fullResults = topXResults.Select(result => new TopXCompletionResultFull + var territoryDto = new TerritoryDto + { + TerritoryId = territory.TerritoryId, + PlaceName = territory.PlaceName, + ContentName = territory.ContentName, + Level = territory.Level, + ContentType = territory.ContentType, + Expac = territory.Expac + }; + + + var resultDtos = topXResults.Select(result => new TopXCompletionResultDto { - TopXResult = result, - DutyMembers = dutyMembers.Where(dm => dm.UploadId == result.Id).ToList(), - DutyCompletionResult = dutyCompletionResults.First(dcr => dcr.Id == result.Id), - User = users.First(u => u.UserId == result.UserId), - Territory = territory + Rank = result.Rank, + Duration = result.Duration, + DutyCompletionResult = dcrDto, + DutyMembers = dutyMembers + .Where(dm => dm.UploadId == result.Id) + .Select(dm => new DutyMemberDto + { + UploadId = dm.UploadId, + GroupNumber = dm.GroupNumber, + MemberNumber = dm.MemberNumber, + Level = dm.Level, + ClassJob = dm.ClassJob, + IsNpc = dm.IsNpc + }).ToList(), + Territory = territoryDto +, + User = users + .Where(u => u.UserId == result.UserId) + .Select(u => new UserDto + { + UserId = u.UserId, + UserName = u.UserName, + WorldId = u.WorldId + }).FirstOrDefault() }).ToList(); - - return fullResults; + + + return resultDtos; }); return records; diff --git a/Expedience.Infrastructure/Models/TopXCompletionResult.cs b/Expedience.Infrastructure/Models/TopXCompletionResult.cs index 00f4dc7..ff93065 100644 --- a/Expedience.Infrastructure/Models/TopXCompletionResult.cs +++ b/Expedience.Infrastructure/Models/TopXCompletionResult.cs @@ -1,35 +1,30 @@ -using Expedience.Models; -using System; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; -namespace Expedience.Infrastructure.Models; - -public class TopXCompletionResult +namespace Expedience.Infrasctructure.Models { - public int Rank { get; set; } - public Guid Id { get; set; } - public int TerritoryId { get; set; } - public string PlaceName { get; set; } - public string ContentName { get; set; } - public DateTime StartTime { get; set; } - public DateTime EndTime { get; set; } - public TimeSpan Duration { get; set; } - public int Level { get; set; } - public string ContentType { get; set; } - public string Expac { get; set; } - public DateTime UploadedAt { get; set; } - public int UserId { get; set; } - public string Username { get; set; } - public int WorldId { get; set; } - public string Datacenter { get; set; } - public string PluginVersion { get; set; } - public string GameVersion { get; set; } + public class TopXCompletionResult + { + public int Rank { get; set; } + public Guid Id { get; set; } + public int TerritoryId { get; set; } + public string PlaceName { get; set; } + public string ContentName { get; set; } + public DateTime StartTime { get; set; } + public DateTime EndTime { get; set; } + public TimeSpan Duration { get; set; } + public int Level { get; set; } + public string ContentType { get; set; } + public string Expac { get; set; } + public DateTime UploadedAt { get; set; } + public int UserId { get; set; } + public string Username { get; set; } + public int WorldId { get; set; } + public string Datacenter { get; set; } + public string PluginVersion { get; set; } + public string GameVersion { get; set; } + } } - -public class TopXCompletionResultFull -{ - public TopXCompletionResult TopXResult { get; set; } - public List DutyMembers { get; set; } - public DutyCompletionResult DutyCompletionResult { get; set; } - public User User { get; set; } - public Territory Territory { get; set; } -} \ No newline at end of file diff --git a/Expedience.Infrastructure/Models/TopXCompletionResultDto.cs b/Expedience.Infrastructure/Models/TopXCompletionResultDto.cs new file mode 100644 index 0000000..48c9c64 --- /dev/null +++ b/Expedience.Infrastructure/Models/TopXCompletionResultDto.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Expedience.Models +{ + public class TopXCompletionResultDto + { + public int Rank { get; set; } + public TimeSpan Duration { get; set; } + public DutyCompletionResultDto DutyCompletionResult { get; set; } + public List DutyMembers { get; set; } + public TerritoryDto Territory { get; set; } + public UserDto User { get; set; } + } + + public class DutyMemberDto + { + public Guid UploadId { get; set; } + public int GroupNumber { get; set; } + public int MemberNumber { get; set; } + public int Level { get; set; } + public string ClassJob { get; set; } + public bool IsNpc { get; set; } + } + + public class TerritoryDto + { + public int TerritoryId { get; set; } + public string PlaceName { get; set; } + public string ContentName { get; set; } + public int Level { get; set; } + public string ContentType { get; set; } + public string Expac { get; set; } + } + + public class UserDto + { + public int UserId { get; set; } + public string UserName { get; set; } + public int WorldId { get; set; } + } + + public class DutyCompletionResultDto + { + public Guid Id { get; set; } + public int UserId { get; set; } + public int TerritoryId { get; set; } + public bool HasEcho { get; set; } + public bool IsUnrestricted { get; set; } + public bool IsMinILevel { get; set; } + public bool HasNpcMembers { get; set; } + public DateTime StartTime { get; set; } + public DateTime EndTime { get; set; } + public int Hours { get; set; } + public int Minutes { get; set; } + public int Seconds { get; set; } + public int Milliseconds { get; set; } + public string GameVersion { get; set; } + public string PluginVersion { get; set; } + public string Lang { get; set; } + public string DataCenter { get; set; } + public DateTime UploadedAt { get; set; } + + } +}