Add DeepDungeon stuff

main
ilitirit 3 years ago
parent cbcd104ad5
commit 40e9776380

@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore;
namespace Expedience.Api.Controllers namespace Expedience.Api.Controllers
{ {
[Route("api/[controller]")] [Route("api")]
[ApiController] [ApiController]
public class ExpedienceController : ControllerBase public class ExpedienceController : ControllerBase
{ {
@ -50,42 +50,42 @@ namespace Expedience.Api.Controllers
return Ok(); return Ok();
} }
[HttpGet("DutyCompletionRecords/{expac}")] [HttpGet("UserName/{worldId}/{userHash}")]
public async Task<ActionResult> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken) public async Task<ActionResult> GetUserName(int worldId, string userHash, CancellationToken cancellationToken)
{ {
try try
{ {
using var scope = _serviceScopeFactory.CreateScope(); using var scope = _serviceScopeFactory.CreateScope();
using var repository = scope.ServiceProvider.GetService<IExpedienceRepository>(); using var dbContext = scope.ServiceProvider.GetRequiredService<ExpedienceContext>();
var results = await repository.GetDutyCompletionRecords(expac, cancellationToken); var user = await dbContext.Users.FirstOrDefaultAsync(x => x.UserHash == userHash && x.WorldId == worldId, cancellationToken);
return Ok(results); if (user != null)
return Ok(user.UserName);
else
return NotFound();
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error getting Duty Completion Records for {expac}: {errorMessage}", expac, ex.Message); _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", worldId, userHash, ex.Message);
} }
return StatusCode(500); return StatusCode(500);
} }
[HttpGet("UserName/{worldId}/{userHash}")] [HttpGet("DeepDungeonRecords")]
public async Task<ActionResult> GetUserName(int worldId, string userHash, CancellationToken cancellationToken) public async Task<ActionResult> GetDeepDungeonRecords(CancellationToken cancellationToken)
{ {
try try
{ {
using var scope = _serviceScopeFactory.CreateScope(); using var scope = _serviceScopeFactory.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<ExpedienceContext>(); var repository = scope.ServiceProvider.GetService<IExpedienceRepository>();
var user = await dbContext.Users.FirstOrDefaultAsync(x => x.UserHash == userHash && x.WorldId == worldId, cancellationToken); var results = await repository.GetDeepDungeonRecords(cancellationToken);
if (user != null) return Ok(results);
return Ok(user.UserName);
else
return NotFound();
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", worldId, userHash, ex.Message); _logger.LogError(ex, "Error getting Deep Dungeon Records: {errorMessage}", ex.Message);
} }
return StatusCode(500); return StatusCode(500);

@ -18,6 +18,7 @@ namespace Expedience.Infrastructure
public DbSet<User> Users { get; set; } public DbSet<User> Users { get; set; }
public DbSet<DutyCompletionRecord> DutyCompletionRecords { get; set; } public DbSet<DutyCompletionRecord> DutyCompletionRecords { get; set; }
public DbSet<DeepDungeonRecord> DeepDungeonRecords { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
@ -71,6 +72,10 @@ namespace Expedience.Infrastructure
.HasNoKey() .HasNoKey()
.ToTable(t => t.ExcludeFromMigrations()); .ToTable(t => t.ExcludeFromMigrations());
modelBuilder.Entity<DeepDungeonRecord>()
.HasNoKey()
.ToTable(t => t.ExcludeFromMigrations());
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
} }
} }

@ -1,15 +1,14 @@
using System; using System;
using Enyim.Caching; using Enyim.Caching;
using Expedience.Infrastructure.Models; using Expedience.Infrastructure.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
namespace Expedience.Infrastructure namespace Expedience.Infrastructure;
{
public interface IExpedienceRepository : IDisposable public interface IExpedienceRepository
{ {
Task<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken); ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken);
ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(CancellationToken cancellationToken);
} }
public class ExpedienceRepository : IExpedienceRepository public class ExpedienceRepository : IExpedienceRepository
@ -23,20 +22,25 @@ namespace Expedience.Infrastructure
_memcachedClient = memcachedClient; _memcachedClient = memcachedClient;
} }
public async Task<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken) public async ValueTask<List<DutyCompletionRecord>> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken)
{ {
var cacheKey = $"xpd-dcr-{expac}"; var cacheKey = $"xpd-dcr-{expac}";
var cacheSeconds = 600; var cacheSeconds = 600;
var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds, var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds,
async () => await _dbContext.DutyCompletionRecords.FromSqlInterpolated($"SELECT * FROM public.get_dutycompletionrecords({expac})") async () => await _dbContext.DutyCompletionRecords.FromSqlInterpolated($"SELECT * FROM public.get_dutycompletionrecords({expac})")
.ToListAsync()); .ToListAsync(cancellationToken));
return records; return records;
} }
public void Dispose() public async ValueTask<List<DeepDungeonRecord>> GetDeepDungeonRecords(CancellationToken cancellationToken)
{ {
//_memcachedClient.Dispose(); var cacheKey = $"xpd-dd";
} var cacheSeconds = 600;
var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds,
async () => await _dbContext.DeepDungeonRecords.FromSqlInterpolated($"SELECT * FROM public.get_deepdungeonresults()")
.ToListAsync(cancellationToken));
return records;
} }
} }

@ -0,0 +1,16 @@
using System;
namespace Expedience.Infrastructure.Models;
public class DeepDungeonRecord
{
public int TerritoryId { get; set; }
public string DeepDungeon { get; set; }
public string Floor { get; set; }
public int Level { get; set; }
public int SortKey { get; set; }
public TimeSpan? MinParty { get; set; }
public TimeSpan? AvgParty { get; set; }
public TimeSpan? MinSolo { get; set; }
public TimeSpan? AvgSolo { get; set; }
}
Loading…
Cancel
Save