More refactoring

main
ilitirit 1 year ago
parent e79436df83
commit 097df1a124

@ -125,13 +125,15 @@ namespace Expedience.Api.Controllers
var results = new List<DutyCompletionResult>();
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,
};

@ -1,4 +1,5 @@
using Expedience.Infrastructure.Models;
using Expedience.Infrasctructure.Models;
using Expedience.Infrastructure.Models;
using Expedience.Models;
using Microsoft.EntityFrameworkCore;

@ -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<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken);
ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(CancellationToken cancellationToken);
ValueTask<List<TopXCompletionResultFull>> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken);
ValueTask<List<TopXCompletionResultDto>> 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<List<TopXCompletionResultFull>> GetTopXRecords(int recordType, int territoryId, int limit, CancellationToken cancellationToken)
public async ValueTask<List<TopXCompletionResultDto>> 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<TopXCompletionResultDto>();
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
{
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
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
{
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;

@ -1,10 +1,13 @@
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 class TopXCompletionResult
{
public int Rank { get; set; }
public Guid Id { get; set; }
public int TerritoryId { get; set; }
@ -23,13 +26,5 @@ public class TopXCompletionResult
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<DutyMember> DutyMembers { get; set; }
public DutyCompletionResult DutyCompletionResult { get; set; }
public User User { get; set; }
public Territory Territory { get; set; }
}
}

@ -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<DutyMemberDto> 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; }
}
}
Loading…
Cancel
Save