|
|
|
@ -1,6 +1,10 @@
|
|
|
|
using System;
|
|
|
|
using System;
|
|
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using EFCore.NamingConventions.Internal;
|
|
|
|
using Enyim.Caching;
|
|
|
|
using Enyim.Caching;
|
|
|
|
|
|
|
|
using Expedience.Infrasctructure.Models;
|
|
|
|
using Expedience.Infrastructure.Models;
|
|
|
|
using Expedience.Infrastructure.Models;
|
|
|
|
|
|
|
|
using Expedience.Models;
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Expedience.Infrastructure;
|
|
|
|
namespace Expedience.Infrastructure;
|
|
|
|
@ -9,7 +13,7 @@ public interface IExpedienceRepository
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken);
|
|
|
|
ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken);
|
|
|
|
ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(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
|
|
|
|
public class ExpedienceRepository : IExpedienceRepository
|
|
|
|
@ -45,7 +49,7 @@ public class ExpedienceRepository : IExpedienceRepository
|
|
|
|
return records;
|
|
|
|
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}";
|
|
|
|
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})")
|
|
|
|
var topXResults = await _dbContext.TopXRecords.FromSqlInterpolated($"SELECT * FROM public.get_topxcompletionresults({recordType}, {territoryId}, {limit})")
|
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
// Get the IDs we need for our related entities
|
|
|
|
if (topXResults.Count == 0) return new List<TopXCompletionResultDto>();
|
|
|
|
var topXIds = topXResults.Select(r => r.Id).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
var uploadId = topXResults.First().Id;
|
|
|
|
var userIds = topXResults.Select(r => r.UserId).Distinct().ToList();
|
|
|
|
var userIds = topXResults.Select(r => r.UserId).Distinct().ToList();
|
|
|
|
|
|
|
|
|
|
|
|
// Then, fetch the related DutyMembers and DutyCompletionResults
|
|
|
|
var dutyCompletionResult = await _dbContext.DutyCompletionResults
|
|
|
|
var dutyMembers = await _dbContext.DutyMembers
|
|
|
|
.FirstAsync(dcr => dcr.Id == uploadId);
|
|
|
|
.Where(dm => topXIds.Contains(dm.UploadId))
|
|
|
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var dutyCompletionResults = await _dbContext.DutyCompletionResults
|
|
|
|
var dcrDto = new DutyCompletionResultDto
|
|
|
|
.Where(dcr => topXIds.Contains(dcr.Id))
|
|
|
|
{
|
|
|
|
|
|
|
|
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();
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
var users = await _dbContext.Users
|
|
|
|
var users = await _dbContext.Users
|
|
|
|
@ -74,19 +98,49 @@ public class ExpedienceRepository : IExpedienceRepository
|
|
|
|
.ToListAsync();
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
var territory = await _dbContext.Territories
|
|
|
|
var territory = await _dbContext.Territories
|
|
|
|
.FirstAsync(t => territoryId == t.TerritoryId);
|
|
|
|
.FirstAsync(t => t.TerritoryId == territoryId);
|
|
|
|
|
|
|
|
|
|
|
|
// Create TopXCompletionResultFull objects
|
|
|
|
var territoryDto = new TerritoryDto
|
|
|
|
var fullResults = topXResults.Select(result => new TopXCompletionResultFull
|
|
|
|
{
|
|
|
|
|
|
|
|
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,
|
|
|
|
Rank = result.Rank,
|
|
|
|
DutyMembers = dutyMembers.Where(dm => dm.UploadId == result.Id).ToList(),
|
|
|
|
Duration = result.Duration,
|
|
|
|
DutyCompletionResult = dutyCompletionResults.First(dcr => dcr.Id == result.Id),
|
|
|
|
DutyCompletionResult = dcrDto,
|
|
|
|
User = users.First(u => u.UserId == result.UserId),
|
|
|
|
DutyMembers = dutyMembers
|
|
|
|
Territory = territory
|
|
|
|
.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();
|
|
|
|
}).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
return fullResults;
|
|
|
|
|
|
|
|
|
|
|
|
return resultDtos;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return records;
|
|
|
|
return records;
|
|
|
|
|