Files
Tabletop/Tabletop.Core/Services/SurfaceService.cs
2025-12-30 02:22:44 +01:00

113 lines
4.0 KiB
C#

using DbController;
using Tabletop.Core.Models;
namespace Tabletop.Core.Services
{
public class SurfaceService : IModelService<Surface, int>
{
public async Task CreateAsync(Surface input, IDbController dbController, CancellationToken cancellationToken = default)
{
string sql = $@"INSERT INTO Surfaces
(
Image
)
VALUES
(
@IMAGE
); {dbController.GetLastIdSql()}";
input.SurfaceId = await dbController.GetFirstAsync<int>(sql, input.GetParameters(), cancellationToken);
foreach (var description in input.Description)
{
sql = @"INSERT INTO SurfaceDescription
(
SurfaceId,
Code,
Name,
Description
)
VALUES
(
@SURFACE_ID,
@CODE,
@NAME,
@DESCRIPTION
)";
var parameters = new
{
BATTLEGROUND_ID = input.SurfaceId,
CODE = description.Code,
NAME = description.Name,
description = description.Description,
};
await dbController.QueryAsync(sql, parameters, cancellationToken);
}
}
public async Task DeleteAsync(Surface input, IDbController dbController, CancellationToken cancellationToken = default)
{
string sql = "DELETE FROM Surfaces WHERE SurfaceId = @SURFACE_ID";
await dbController.QueryAsync(sql, new
{
SURFACE_ID = input.SurfaceId
}, cancellationToken);
}
public static async Task<List<Surface>> GetAllAsync(IDbController dbController, CancellationToken cancellationToken = default)
{
string sql = "SELECT * FROM Surfaces";
var list = await dbController.SelectDataAsync<Surface>(sql, cancellationToken: cancellationToken);
foreach(var item in list)
{
if(item.Image != null)
{
string base64String = Convert.ToBase64String(item.Image);
item.ConvertedImage = $"data:image/png;base64,{base64String}";
}
}
await LoadSurfaceDescriptionsAsync(list, dbController, cancellationToken);
return list;
}
public async Task<Surface?> GetAsync(int surfaceId, IDbController dbController, CancellationToken cancellationToken = default)
{
string sql = @"SELECT * FROM Surfaces WHERE SurfaceId = @SURFACE_ID";
var surface = await dbController.GetFirstAsync<Surface>(sql, new
{
SURFACE_ID = surfaceId
}, cancellationToken);
return surface;
}
private static async Task LoadSurfaceDescriptionsAsync(List<Surface> list, IDbController dbController, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
if (list.Count != 0)
{
IEnumerable<int> surfaceIds = list.Select(x => x.SurfaceId);
string sql = $"SELECT * FROM SurfaceDescription WHERE SurfaceId IN ({string.Join(",", surfaceIds)})";
List<SurfaceDescription> descriptions = await dbController.SelectDataAsync<SurfaceDescription>(sql, null, cancellationToken);
foreach (var battleLocation in list)
{
battleLocation.Description = [.. descriptions.Where(x => x.SurfaceId == battleLocation.SurfaceId)];
}
}
}
public Task UpdateAsync(Surface input, IDbController dbController, CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
}
}