using Dapper; using Shogi.Api.Extensions; using Shogi.Api.Repositories.Dto; using Shogi.Domain; using System.Data; using System.Data.SqlClient; namespace Shogi.Api.Repositories; public class SessionRepository : ISessionRepository { private readonly string connectionString; public SessionRepository(IConfiguration configuration) { connectionString = configuration.GetConnectionString("ShogiDatabase"); } public async Task CreateSession(Session session) { using var connection = new SqlConnection(connectionString); await connection.ExecuteAsync( "session.CreateSession", new { session.Name, Player1Name = session.Player1, }, commandType: CommandType.StoredProcedure); } public async Task DeleteSession(string name) { using var connection = new SqlConnection(connectionString); await connection.ExecuteAsync( "session.DeleteSession", new { Name = name }, commandType: CommandType.StoredProcedure); } public async Task ReadSession(string name) { using var connection = new SqlConnection(connectionString); var results = await connection.QueryMultipleAsync( "session.ReadSession", new { Name = name }, commandType: CommandType.StoredProcedure); var sessionDtos = await results.ReadAsync(); if (!sessionDtos.Any()) return null; var dto = sessionDtos.First(); var session = new Session(dto.Name, dto.Player1); if (!string.IsNullOrWhiteSpace(dto.Player2)) session.AddPlayer2(dto.Player2); var moveDtos = await results.ReadAsync(); foreach (var move in moveDtos) { if (move.PieceFromHand.HasValue) { session.Board.Move(move.PieceFromHand.Value, move.To); } else { session.Board.Move(move.From, move.To, false); } } return session; } public async Task CreateMove(string sessionName, Contracts.Api.MovePieceCommand command) { using var connection = new SqlConnection(connectionString); await connection.ExecuteAsync( "session.CreateMove", new { To = command.To, From = command.From, IsPromotion = command.IsPromotion }, commandType: CommandType.StoredProcedure); } } public interface ISessionRepository { Task CreateSession(Session session); Task DeleteSession(string name); Task ReadSession(string name); }