using DbController; using Tabletop.Core.Models; namespace Tabletop.Core.Services { public class SurfaceService : IModelService { 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(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> GetAllAsync(IDbController dbController, CancellationToken cancellationToken = default) { string sql = "SELECT * FROM Surfaces"; var list = await dbController.SelectDataAsync(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 GetAsync(int surfaceId, IDbController dbController, CancellationToken cancellationToken = default) { string sql = @"SELECT * FROM Surfaces WHERE SurfaceId = @SURFACE_ID"; var surface = await dbController.GetFirstAsync(sql, new { SURFACE_ID = surfaceId }, cancellationToken); return surface; } private static async Task LoadSurfaceDescriptionsAsync(List list, IDbController dbController, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); if (list.Count != 0) { IEnumerable surfaceIds = list.Select(x => x.SurfaceId); string sql = $"SELECT * FROM SurfaceDescription WHERE SurfaceId IN ({string.Join(",", surfaceIds)})"; List descriptions = await dbController.SelectDataAsync(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(); } } }