From 1daa33b1f0324ac6628da63a9cd0c8c86444d543 Mon Sep 17 00:00:00 2001 From: ilitirit Date: Fri, 9 Aug 2024 18:00:11 +0200 Subject: [PATCH] Data access update --- .../Controllers/ExpedienceController.cs | 31 ++++++++++--------- .../ExpedienceContext.cs | 23 -------------- .../ExpedienceRepository.cs | 25 +++++++++------ .../Models/TopXCompletionResult.cs | 12 ++++--- 4 files changed, 40 insertions(+), 51 deletions(-) diff --git a/Expedience.Api/Controllers/ExpedienceController.cs b/Expedience.Api/Controllers/ExpedienceController.cs index e5e1d66..ed8d028 100644 --- a/Expedience.Api/Controllers/ExpedienceController.cs +++ b/Expedience.Api/Controllers/ExpedienceController.cs @@ -121,29 +121,32 @@ namespace Expedience.Api.Controllers var repository = scope.ServiceProvider.GetService(); var records = await repository.GetTopXRecords(recordType, territoryId, limit, cancellationToken); + var results = new List(); foreach (var record in records) { + var topXResult = record.TopXResult; + var dcr = record.DutyCompletionResult; var dutyCompletionResult = new DutyCompletionResult { - Id = record.Id, - UserId = record.UserId, - TerritoryId = record.TerritoryId, + Id = topXResult.Id, + UserId = topXResult.UserId, + TerritoryId = topXResult.TerritoryId, IsMinILevel = recordType == 3, HasNpcMembers = recordType == 4, - StartTime = record.StartTime, - EndTime = record.EndTime, - Hours = record.Duration.Hours, - Minutes = record.Duration.Minutes, - Seconds = record.Duration.Seconds, - Milliseconds = record.Duration.Milliseconds, - GameVersion = record.GameVersion, - PluginVersion = record.PluginVersion, + StartTime = dcr.StartTime, + EndTime = dcr.EndTime, + Hours = dcr.Hours, + Minutes = dcr.Minutes, + Seconds = dcr.Seconds, + Milliseconds = dcr.Milliseconds, + GameVersion = dcr.GameVersion, + PluginVersion = dcr.PluginVersion, + Lang = dcr.Lang, + UploadedAt = dcr.UploadedAt, Territory = record.Territory, User = record.User, - DataCenter = record.DutyCompletionResult.DataCenter, - UploadedAt = record.UploadedAt, - Lang = record.DutyCompletionResult.Lang, + DataCenter = dcr.DataCenter, }; results.Add(dutyCompletionResult); diff --git a/Expedience.Infrastructure/ExpedienceContext.cs b/Expedience.Infrastructure/ExpedienceContext.cs index 59efec6..9880eda 100644 --- a/Expedience.Infrastructure/ExpedienceContext.cs +++ b/Expedience.Infrastructure/ExpedienceContext.cs @@ -81,29 +81,6 @@ namespace Expedience.Infrastructure { cfg.HasNoKey(); cfg.ToView("TopXCompletionResults"); // This is just a placeholder name - - // If you want to include navigation properties: - cfg.HasOne(e => e.Territory) - .WithMany() - .HasForeignKey(e => e.TerritoryId) - .OnDelete(DeleteBehavior.NoAction); - - cfg.HasOne(e => e.User) - .WithMany() - .HasForeignKey(e => e.UserId) - .OnDelete(DeleteBehavior.NoAction); - - // Configure the relationship with DutyMembers - cfg.HasMany(e => e.DutyMembers) - .WithOne() - .HasForeignKey("UploadId") // Assuming UploadId in DutyMember corresponds to Id in TopXCompletionResult - .OnDelete(DeleteBehavior.NoAction); - - // Configure the one-to-one relationship with DutyCompletionResult - cfg.HasOne(e => e.DutyCompletionResult) - .WithOne() - .HasForeignKey("Id") - .OnDelete(DeleteBehavior.NoAction); }); base.OnModelCreating(modelBuilder); diff --git a/Expedience.Infrastructure/ExpedienceRepository.cs b/Expedience.Infrastructure/ExpedienceRepository.cs index 312a78c..036f342 100644 --- a/Expedience.Infrastructure/ExpedienceRepository.cs +++ b/Expedience.Infrastructure/ExpedienceRepository.cs @@ -9,7 +9,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 +45,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}"; @@ -73,15 +73,20 @@ public class ExpedienceRepository : IExpedienceRepository .Where(u => userIds.Contains(u.UserId)) .ToListAsync(); - // Now, associate the DutyMembers and DutyCompletionResults with their corresponding TopXCompletionResults - foreach (var result in topXResults) - { - result.DutyMembers = dutyMembers.Where(dm => dm.UploadId == result.Id).ToList(); - result.DutyCompletionResult = dutyCompletionResults.First(dcr => dcr.Id == result.Id); - result.User = users.First(u => u.UserId == result.UserId); - } + var territory = await _dbContext.Territories + .FirstAsync(t => territoryId == t.TerritoryId); - return topXResults; + // Create TopXCompletionResultFull objects + var fullResults = topXResults.Select(result => new TopXCompletionResultFull + { + 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 + }).ToList(); + + return fullResults; }); return records; diff --git a/Expedience.Infrastructure/Models/TopXCompletionResult.cs b/Expedience.Infrastructure/Models/TopXCompletionResult.cs index bb81c34..17399ec 100644 --- a/Expedience.Infrastructure/Models/TopXCompletionResult.cs +++ b/Expedience.Infrastructure/Models/TopXCompletionResult.cs @@ -23,9 +23,13 @@ public class TopXCompletionResult public string Datacenter { get; set; } public string PluginVersion { get; set; } public string GameVersion { get; set; } +} - public Territory Territory { get; set; } = null!; - public User User { get; set; } = null!; - public ICollection DutyMembers { get; set; } = null!; - public DutyCompletionResult DutyCompletionResult { get; set; } = null!; +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