diff --git a/Application/Dto/MusicDto.cs b/Application/Dto/MusicDto.cs new file mode 100644 index 0000000..a4ce476 --- /dev/null +++ b/Application/Dto/MusicDto.cs @@ -0,0 +1,33 @@ +using System.Xml.Serialization; + +namespace Application.Dto; + +public class MusicDto +{ + [XmlAttribute(AttributeName = "id")] + public int Id { get; set; } + + [XmlElement("music_id")] + public int MusicId { get; set; } + + [XmlElement(ElementName = "title")] + public string Title { get; set; } = string.Empty; + + [XmlElement(ElementName = "artist")] + public string Artist { get; set; } = string.Empty; + + [XmlElement(ElementName = "release_date")] + public string ReleaseDate { get; set; } = "2013-01-01 08:00:00"; + + [XmlElement(ElementName = "end_date")] + public string EndDate { get; set; } = "2030-01-01 08:00:00"; + + [XmlElement("new_flag")] + public int NewFlag { get; set; } + + [XmlElement("use_flag")] + public int UseFlag { get; set; } + + [XmlElement("calc_flag")] + public int CalcFlag { get; set; } +} \ No newline at end of file diff --git a/Application/Game/Card/Read/ReadMusicQuery.cs b/Application/Game/Card/Read/ReadMusicQuery.cs index 047a789..9175bbe 100644 --- a/Application/Game/Card/Read/ReadMusicQuery.cs +++ b/Application/Game/Card/Read/ReadMusicQuery.cs @@ -1,6 +1,8 @@ +using System.Diagnostics.CodeAnalysis; using Application.Common.Extensions; using Application.Common.Models; using Application.Interfaces; +using Application.Mappers; using Domain.Enums; using Microsoft.EntityFrameworkCore; @@ -11,12 +13,26 @@ public record ReadMusicQuery(long CardId) : IRequestWrapper; public class ReadMusicQueryHandler : CardRequestHandlerBase { + private const string MUSIC_XPATH = "/root/music/record"; public ReadMusicQueryHandler(ICardDependencyAggregate aggregate) : base(aggregate) { } - public override Task> Handle(ReadMusicQuery request, CancellationToken cancellationToken) + [SuppressMessage("ReSharper.DPA", "DPA0007: Large number of DB records", + Justification = "To return all musics, the whole table need to be returned")] + public override async Task> Handle(ReadMusicQuery request, CancellationToken cancellationToken) { - throw new NotImplementedException(); + var musics = await MusicDbContext.MusicUnlocks.ToListAsync(cancellationToken: cancellationToken); + var dtoList = musics.Select((unlock, i) => + { + var dto = unlock.MusicToDto(); + dto.Id = i; + dto.CalcFlag = Random.Shared.NextDouble() >= 0.5 ? 1 : 0; + return dto; + }); + + var result = dtoList.SerializeCardDataList(MUSIC_XPATH); + + return new ServiceResult(result); } } diff --git a/Application/Mappers/MusicMapper.cs b/Application/Mappers/MusicMapper.cs new file mode 100644 index 0000000..6940c5a --- /dev/null +++ b/Application/Mappers/MusicMapper.cs @@ -0,0 +1,13 @@ +using Application.Dto; +using Domain.Entities; +using Riok.Mapperly.Abstractions; + +namespace Application.Mappers; + +[Mapper] +public static partial class MusicMapper +{ + public static partial MusicDto MusicToDto(this MusicUnlock music); + + private static int BoolToInt(bool value) => value ? 1 : 0; +} \ No newline at end of file diff --git a/Domain/Entities/MusicUnlock.cs b/Domain/Entities/MusicUnlock.cs index c9debbc..74b245c 100644 --- a/Domain/Entities/MusicUnlock.cs +++ b/Domain/Entities/MusicUnlock.cs @@ -6,7 +6,7 @@ public partial class MusicUnlock public string Title { get; set; } = string.Empty; - public string Artist { get; set; } = string.Empty; + public string? Artist { get; set; } = string.Empty; public DateTime ReleaseDate { get; set; } diff --git a/Infrastructure/Persistence/MusicDbContext.cs b/Infrastructure/Persistence/MusicDbContext.cs index b2559f8..4be3a46 100644 --- a/Infrastructure/Persistence/MusicDbContext.cs +++ b/Infrastructure/Persistence/MusicDbContext.cs @@ -67,7 +67,7 @@ public partial class MusicDbContext : DbContext, IMusicDbContext entity.Property(e => e.MusicId) .ValueGeneratedNever() .HasColumnName("music_id"); - entity.Property(e => e.Artist).HasColumnName("artist"); + entity.Property(e => e.Artist).HasColumnName("artist").IsRequired(false); entity.Property(e => e.Title).HasColumnName("title"); entity.Property(e => e.ReleaseDate).HasColumnName("release_date"); entity.Property(e => e.EndDate).HasColumnName("end_date");