1
0
mirror of synced 2025-02-07 15:01:25 +01:00

Use mapper for SongPlayDatum database models

This commit is contained in:
shiibe 2024-03-13 14:43:43 -04:00
parent d8dd7e741b
commit cb41c29970
27 changed files with 150 additions and 126 deletions

View File

@ -1,7 +1,6 @@
using GameDatabase.Entities; using GameDatabase.Entities;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using SharedProject.Utils; using SharedProject.Utils;
using SharedProject.Entities;
namespace GameDatabase.Context namespace GameDatabase.Context
{ {

View File

@ -1,7 +1,6 @@
using GameDatabase.Entities; using GameDatabase.Entities;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using SharedProject.Enums; using SharedProject.Enums;
using SharedProject.Entities;
namespace GameDatabase.Context; namespace GameDatabase.Context;

View File

@ -1,5 +1,4 @@
using SharedProject.Enums; using SharedProject.Enums;
using SharedProject.Entities;
namespace GameDatabase.Entities; namespace GameDatabase.Entities;

View File

@ -1,6 +1,4 @@
using SharedProject.Entities; namespace GameDatabase.Entities
namespace GameDatabase.Entities
{ {
public partial class Card public partial class Card
{ {

View File

@ -1,6 +1,4 @@
using SharedProject.Entities; namespace GameDatabase.Entities
namespace GameDatabase.Entities
{ {
public partial class Credential public partial class Credential
{ {

View File

@ -1,5 +1,4 @@
using SharedProject.Enums; using SharedProject.Enums;
using SharedProject.Entities;
namespace GameDatabase.Entities; namespace GameDatabase.Entities;

View File

@ -1,5 +1,4 @@
using SharedProject.Enums; using SharedProject.Enums;
using SharedProject.Entities;
namespace GameDatabase.Entities namespace GameDatabase.Entities
{ {

View File

@ -0,0 +1,28 @@
using SharedProject.Enums;
namespace GameDatabase.Entities;
public partial class SongPlayDatum
{
public long Id { get; set; }
public uint Baid { get; set; }
public uint SongNumber { get; set; }
public uint SongId { get; set; }
public Difficulty Difficulty { get; set; }
public CrownType Crown { get; set; }
public uint Score { get; set; }
public uint ScoreRate { get; set; }
public ScoreRank ScoreRank { get; set; }
public uint GoodCount { get; set; }
public uint OkCount { get; set; }
public uint MissCount { get; set; }
public uint ComboCount { get; set; }
public uint HitCount { get; set; }
public uint DrumrollCount { get; set; }
public bool Skipped { get; set; }
public DateTime PlayTime { get; set; }
public virtual UserDatum? Ba { get; set; }
}

View File

@ -1,4 +1,4 @@
namespace SharedProject.Entities; namespace GameDatabase.Entities;
public class Token public class Token
{ {

View File

@ -0,0 +1,37 @@
using SharedProject.Enums;
namespace GameDatabase.Entities;
public partial class UserDatum
{
public uint Baid { get; set; }
public string MyDonName { get; set; } = string.Empty;
public uint MyDonNameLanguage { get; set; }
public string Title { get; set; } = string.Empty;
public uint TitlePlateId { get; set; }
public string FavoriteSongsArray { get; set; } = "[]";
public string ToneFlgArray { get; set; } = "[]";
public string TitleFlgArray { get; set; } = "[]";
public string CostumeFlgArray { get; set; } = "[[],[],[],[],[]]";
public string GenericInfoFlgArray { get; set; } = "[]";
public short OptionSetting { get; set; }
public int NotesPosition { get; set; }
public bool IsVoiceOn { get; set; }
public bool IsSkipOn { get; set; }
public string DifficultyPlayedArray { get; set; } = "[]";
public string DifficultySettingArray { get; set; } = "[]";
public uint SelectedToneId { get; set; }
public DateTime LastPlayDatetime { get; set; }
public uint LastPlayMode { get; set; }
public uint ColorBody { get; set; }
public uint ColorFace { get; set; }
public uint ColorLimb { get; set; }
public string CostumeData { get; set; } = "[]";
public bool DisplayDan { get; set; }
public bool DisplayAchievement { get; set; }
public Difficulty AchievementDisplayDifficulty { get; set; }
public int AiWinCount { get; set; }
public List<Token> Tokens { get; set; } = new();
public string UnlockedSongIdList { get; set; } = "[]";
public bool IsAdmin { get; set; }
}

View File

@ -1,38 +0,0 @@
using SharedProject.Enums;
namespace SharedProject.Entities
{
public partial class UserDatum
{
public uint Baid { get; set; }
public string MyDonName { get; set; } = string.Empty;
public uint MyDonNameLanguage { get; set; }
public string Title { get; set; } = string.Empty;
public uint TitlePlateId { get; set; }
public string FavoriteSongsArray { get; set; } = "[]";
public string ToneFlgArray { get; set; } = "[]";
public string TitleFlgArray { get; set; } = "[]";
public string CostumeFlgArray { get; set; } = "[[],[],[],[],[]]";
public string GenericInfoFlgArray { get; set; } = "[]";
public short OptionSetting { get; set; }
public int NotesPosition { get; set; }
public bool IsVoiceOn { get; set; }
public bool IsSkipOn { get; set; }
public string DifficultyPlayedArray { get; set; } = "[]";
public string DifficultySettingArray { get; set; } = "[]";
public uint SelectedToneId { get; set; }
public DateTime LastPlayDatetime { get; set; }
public uint LastPlayMode { get; set; }
public uint ColorBody { get; set; }
public uint ColorFace { get; set; }
public uint ColorLimb { get; set; }
public string CostumeData { get; set; } = "[]";
public bool DisplayDan { get; set; }
public bool DisplayAchievement { get; set; }
public Difficulty AchievementDisplayDifficulty { get; set; }
public int AiWinCount { get; set; }
public List<Token> Tokens { get; set; } = new();
public string UnlockedSongIdList { get; set; } = "[]";
public bool IsAdmin { get; set; }
}
}

View File

@ -1,5 +1,4 @@
using SharedProject.Enums; using SharedProject.Enums;
using SharedProject.Entities;
namespace SharedProject.Models; namespace SharedProject.Models;
@ -48,5 +47,5 @@ public class SongBestData
public bool ShowAiData { get; set; } public bool ShowAiData { get; set; }
public List<SongPlayDatum> RecentPlayData { get; set; } = new(); public List<SongPlayDatumDto> RecentPlayData { get; set; } = new();
} }

View File

@ -1,14 +1,10 @@
using SharedProject.Enums; using SharedProject.Enums;
namespace SharedProject.Entities namespace SharedProject.Models
{ {
public partial class SongPlayDatum public class SongPlayDatumDto
{ {
public long Id { get; set; }
public uint Baid { get; set; }
public uint SongNumber { get; set; } public uint SongNumber { get; set; }
public uint SongId { get; set; } public uint SongId { get; set; }
public Difficulty Difficulty { get; set; } public Difficulty Difficulty { get; set; }
public CrownType Crown { get; set; } public CrownType Crown { get; set; }
@ -23,7 +19,5 @@ namespace SharedProject.Entities
public uint DrumrollCount { get; set; } public uint DrumrollCount { get; set; }
public bool Skipped { get; set; } public bool Skipped { get; set; }
public DateTime PlayTime { get; set; } public DateTime PlayTime { get; set; }
public virtual UserDatum? Ba { get; set; }
} }
} }

View File

@ -1,4 +1,4 @@
using SharedProject.Entities; using GameDatabase.Entities;
using System.Text.Json; using System.Text.Json;
namespace TaikoLocalServer.Common.Utils; namespace TaikoLocalServer.Common.Utils;

View File

@ -1,61 +1,75 @@
using SharedProject.Models.Responses; using Riok.Mapperly.Abstractions;
using SharedProject.Models.Responses;
using SharedProject.Models;
using GameDatabase.Entities;
namespace TaikoLocalServer.Controllers.Api; namespace TaikoLocalServer.Controllers.Api
[ApiController]
[Route("api/[controller]")]
public class PlayDataController : BaseController<PlayDataController>
{ {
private readonly IUserDatumService userDatumService; [ApiController]
[Route("api/[controller]")]
private readonly ISongBestDatumService songBestDatumService; public class PlayDataController : BaseController<PlayDataController>
private readonly ISongPlayDatumService songPlayDatumService;
public PlayDataController(IUserDatumService userDatumService, ISongBestDatumService songBestDatumService,
ISongPlayDatumService songPlayDatumService)
{ {
this.userDatumService = userDatumService; private readonly IUserDatumService userDatumService;
this.songBestDatumService = songBestDatumService; private readonly ISongBestDatumService songBestDatumService;
this.songPlayDatumService = songPlayDatumService; private readonly ISongPlayDatumService songPlayDatumService;
private readonly SongBestResponseMapper _songBestResponseMapper; // Inject SongBestResponseMapper
public PlayDataController(IUserDatumService userDatumService, ISongBestDatumService songBestDatumService,
ISongPlayDatumService songPlayDatumService, SongBestResponseMapper songBestResponseMapper)
{
this.userDatumService = userDatumService;
this.songBestDatumService = songBestDatumService;
this.songPlayDatumService = songPlayDatumService;
_songBestResponseMapper = songBestResponseMapper; // Assign the injected mapper
}
[HttpGet("{baid}")]
public async Task<ActionResult<SongBestResponse>> GetSongBestRecords(uint baid)
{
{
var user = await userDatumService.GetFirstUserDatumOrNull(baid);
if (user is null)
{
return NotFound();
}
var songBestRecords = await songBestDatumService.GetAllSongBestAsModel(baid);
var songPlayData = await songPlayDatumService.GetSongPlayDatumByBaid(baid);
foreach (var songBestData in songBestRecords)
{
var songPlayLogs = songPlayData.Where(datum => datum.SongId == songBestData.SongId &&
datum.Difficulty == songBestData.Difficulty).ToList();
songBestData.PlayCount = songPlayLogs.Count;
songBestData.ClearCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Clear);
songBestData.FullComboCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Gold);
songBestData.PerfectCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Dondaful);
}
var favoriteSongs = await userDatumService.GetFavoriteSongIds(baid);
var favoriteSet = favoriteSongs.ToHashSet();
foreach (var songBestRecord in songBestRecords.Where(songBestRecord => favoriteSet.Contains(songBestRecord.SongId)))
{
songBestRecord.IsFavorite = true;
}
foreach (var songBestRecord in songBestRecords)
{
songBestRecord.RecentPlayData = songPlayData
.Where(datum => datum.SongId == songBestRecord.SongId && datum.Difficulty == songBestRecord.Difficulty)
.Select(SongBestResponseMapper.MapToDto)
.ToList();
}
return Ok(new SongBestResponse
{
SongBestData = songBestRecords
});
}
}
} }
[HttpGet("{baid}")] [Mapper(EnumMappingStrategy = EnumMappingStrategy.ByName)]
public async Task<ActionResult<SongBestResponse>> GetSongBestRecords(uint baid) public partial class SongBestResponseMapper
{ {
var user = await userDatumService.GetFirstUserDatumOrNull(baid); public static partial SongPlayDatumDto MapToDto(SongPlayDatum entity);
if (user is null)
{
return NotFound();
}
var songBestRecords = await songBestDatumService.GetAllSongBestAsModel(baid);
var playLogs = await songPlayDatumService.GetSongPlayDatumByBaid(baid);
foreach (var songBestData in songBestRecords)
{
var songPlayLogs = playLogs.Where(datum => datum.SongId == songBestData.SongId &&
datum.Difficulty == songBestData.Difficulty).ToList();
songBestData.PlayCount = songPlayLogs.Count;
songBestData.ClearCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Clear);
songBestData.FullComboCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Gold);
songBestData.PerfectCount = songPlayLogs.Count(datum => datum.Crown >= CrownType.Dondaful);
}
var favoriteSongs = await userDatumService.GetFavoriteSongIds(baid);
var favoriteSet = favoriteSongs.ToHashSet();
foreach (var songBestRecord in songBestRecords.Where(songBestRecord => favoriteSet.Contains(songBestRecord.SongId)))
{
songBestRecord.IsFavorite = true;
}
foreach (var songBestRecord in songBestRecords)
{
songBestRecord.RecentPlayData = playLogs.Where(datum => datum.SongId == songBestRecord.SongId)
.OrderByDescending(datum => datum.PlayTime).Take(10).ToList();
}
return Ok(new SongBestResponse
{
SongBestData = songBestRecords
});
} }
} }

View File

@ -1,5 +1,5 @@
using System.Text.Json; using System.Text.Json;
using SharedProject.Entities; using GameDatabase.Entities;
using Throw; using Throw;
namespace TaikoLocalServer.Controllers.Game; namespace TaikoLocalServer.Controllers.Game;

View File

@ -1,5 +1,5 @@
using System.Text.Json; using System.Text.Json;
using SharedProject.Entities; using GameDatabase.Entities;
using Throw; using Throw;
namespace TaikoLocalServer.Controllers.Game; namespace TaikoLocalServer.Controllers.Game;

View File

@ -1,5 +1,4 @@
using GameDatabase.Entities; using GameDatabase.Entities;
using SharedProject.Entities;
namespace TaikoLocalServer.Controllers.Game; namespace TaikoLocalServer.Controllers.Game;

View File

@ -1,5 +1,4 @@
using GameDatabase.Entities; using GameDatabase.Entities;
using SharedProject.Entities;
using System.Globalization; using System.Globalization;
using System.Text.Json; using System.Text.Json;
using Throw; using Throw;

View File

@ -11,6 +11,7 @@ using TaikoLocalServer.Settings;
using Throw; using Throw;
using Serilog; using Serilog;
using SharedProject.Utils; using SharedProject.Utils;
using TaikoLocalServer.Controllers.Api;
Log.Logger = new LoggerConfiguration() Log.Logger = new LoggerConfiguration()
.WriteTo.Console() .WriteTo.Console()
@ -88,6 +89,7 @@ try
}); });
}); });
builder.Services.AddTaikoDbServices(); builder.Services.AddTaikoDbServices();
builder.Services.AddSingleton<SongBestResponseMapper>();
var app = builder.Build(); var app = builder.Build();

View File

@ -1,4 +1,4 @@
using SharedProject.Entities; using GameDatabase.Entities;
namespace TaikoLocalServer.Services.Interfaces; namespace TaikoLocalServer.Services.Interfaces;

View File

@ -1,4 +1,4 @@
using SharedProject.Entities; using GameDatabase.Entities;
namespace TaikoLocalServer.Services.Interfaces; namespace TaikoLocalServer.Services.Interfaces;

View File

@ -1,6 +1,5 @@
using GameDatabase.Context; using GameDatabase.Context;
using GameDatabase.Entities; using GameDatabase.Entities;
using SharedProject.Entities;
using SharedProject.Models; using SharedProject.Models;
using Swan.Mapping; using Swan.Mapping;
using Throw; using Throw;

View File

@ -1,5 +1,5 @@
using GameDatabase.Context; using GameDatabase.Context;
using SharedProject.Entities; using GameDatabase.Entities;
namespace TaikoLocalServer.Services; namespace TaikoLocalServer.Services;

View File

@ -1,5 +1,5 @@
using GameDatabase.Context; using GameDatabase.Context;
using SharedProject.Entities; using GameDatabase.Entities;
using System.Text.Json; using System.Text.Json;
using Throw; using Throw;

View File

@ -24,6 +24,7 @@
</PackageReference> </PackageReference>
<PackageReference Include="protobuf-net" Version="3.2.26" /> <PackageReference Include="protobuf-net" Version="3.2.26" />
<PackageReference Include="protobuf-net.AspNetCore" Version="3.2.12" /> <PackageReference Include="protobuf-net.AspNetCore" Version="3.2.12" />
<PackageReference Include="Riok.Mapperly" Version="3.4.0" ExcludeAssets="runtime" PrivateAssets="all" />
<PackageReference Include="Serilog.AspNetCore" Version="7.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="7.0.0" />
<PackageReference Include="Serilog.Expressions" Version="4.0.0-dev-00137" /> <PackageReference Include="Serilog.Expressions" Version="4.0.0-dev-00137" />
<PackageReference Include="Serilog.Sinks.File.Header" Version="1.0.2" /> <PackageReference Include="Serilog.Sinks.File.Header" Version="1.0.2" />

View File

@ -1,5 +1,4 @@
@using TaikoWebUI.Utilities; @using TaikoWebUI.Utilities;
@using SharedProject.Entities;
<MudCard Outlined="true" Elevation="0"> <MudCard Outlined="true" Elevation="0">
<MudCardHeader> <MudCardHeader>
@ -54,6 +53,6 @@
</MudCard> </MudCard>
@code { @code {
[Parameter] public List<SongPlayDatum> Items { get; set; } = new List<SongPlayDatum>(); [Parameter] public List<SongPlayDatumDto> Items { get; set; } = new List<SongPlayDatumDto>();
private const string IconStyle = "width:25px; height:25px;"; private const string IconStyle = "width:25px; height:25px;";
} }