revamping domain

This commit is contained in:
2022-10-30 18:36:23 -05:00
parent b8ac227199
commit 689de35c3b
16 changed files with 161 additions and 105 deletions

View File

@@ -37,7 +37,7 @@ public class SessionController : ControllerBase
{
var userId = User.GetShogiUserId();
if (string.IsNullOrWhiteSpace(userId)) return this.Unauthorized();
var session = new Domain.Session(request.Name, Domain.BoardState.StandardStarting, userId);
var session = new Domain.ShogiBoard(request.Name, Domain.BoardState.StandardStarting, userId);
try
{
await sessionRepository.CreateSession(session);
@@ -161,6 +161,13 @@ public class SessionController : ControllerBase
});
}
[HttpGet("{name}")]
public async Task<ActionResult<ReadSessionResponse>> GetSession(string name)
{
await Task.CompletedTask;
return new ReadSessionResponse();
}
//[HttpPut("{sessionName}")]
//public async Task<IActionResult> PutJoinSession([FromRoute] string sessionName)
//{

View File

@@ -3,24 +3,25 @@ using System;
namespace Shogi.Api.Repositories.CouchModels
{
public abstract class CouchDocument
{
[JsonProperty("_id")] public string Id { get; set; }
[JsonProperty("_rev")] public string? RevisionId { get; set; }
public WhichDocumentType DocumentType { get; }
public DateTimeOffset CreatedDate { get; set; }
[Obsolete]
public abstract class CouchDocument
{
[JsonProperty("_id")] public string Id { get; set; }
[JsonProperty("_rev")] public string? RevisionId { get; set; }
public WhichDocumentType DocumentType { get; }
public DateTimeOffset CreatedDate { get; set; }
public CouchDocument(WhichDocumentType documentType)
: this(string.Empty, documentType, DateTimeOffset.UtcNow) { }
public CouchDocument(WhichDocumentType documentType)
: this(string.Empty, documentType, DateTimeOffset.UtcNow) { }
public CouchDocument(string id, WhichDocumentType documentType)
: this(id, documentType, DateTimeOffset.UtcNow) { }
public CouchDocument(string id, WhichDocumentType documentType)
: this(id, documentType, DateTimeOffset.UtcNow) { }
public CouchDocument(string id, WhichDocumentType documentType, DateTimeOffset createdDate)
{
Id = id;
DocumentType = documentType;
CreatedDate = createdDate;
}
}
public CouchDocument(string id, WhichDocumentType documentType, DateTimeOffset createdDate)
{
Id = id;
DocumentType = documentType;
CreatedDate = createdDate;
}
}
}

View File

@@ -0,0 +1,11 @@
namespace Shogi.Api.Repositories.Dto
{
public class SessionDto
{
public string Name { get; set; }
public string Player1 { get; set; }
public string Player2 { get; set; }
public bool GameOver { get; set; }
public string BoardState { get; set; }
}
}

View File

@@ -6,23 +6,33 @@ namespace Shogi.Api.Repositories;
public class QueryRepository : IQueryRespository
{
private readonly string connectionString;
private readonly string connectionString;
public QueryRepository(IConfiguration configuration)
{
connectionString = configuration.GetConnectionString("ShogiDatabase");
}
public QueryRepository(IConfiguration configuration)
{
connectionString = configuration.GetConnectionString("ShogiDatabase");
}
public async Task<IEnumerable<SessionMetadata>> ReadAllSessionsMetadata()
{
using var connection = new SqlConnection(connectionString);
return await connection.QueryAsync<SessionMetadata>(
"session.ReadAllSessionsMetadata",
commandType: System.Data.CommandType.StoredProcedure);
}
public async Task<IEnumerable<SessionMetadata>> ReadAllSessionsMetadata()
{
using var connection = new SqlConnection(connectionString);
return await connection.QueryAsync<SessionMetadata>(
"session.ReadAllSessionsMetadata",
commandType: System.Data.CommandType.StoredProcedure);
}
public async Task<SessionMetadata?> ReadSession(string name)
{
using var connection = new SqlConnection(connectionString);
var results = await connection.QueryAsync<SessionMetadata>(
"session.ReadSession",
commandType: System.Data.CommandType.StoredProcedure);
return results.SingleOrDefault();
}
}
public interface IQueryRespository
{
Task<IEnumerable<SessionMetadata>> ReadAllSessionsMetadata();
Task<IEnumerable<SessionMetadata>> ReadAllSessionsMetadata();
Task<SessionMetadata?> ReadSession(string name);
}

View File

@@ -1,4 +1,5 @@
using Dapper;
using Shogi.Api.Repositories.Dto;
using Shogi.Domain;
using System.Data;
using System.Data.SqlClient;
@@ -8,30 +9,48 @@ namespace Shogi.Api.Repositories;
public class SessionRepository : ISessionRepository
{
private readonly string connectionString;
private readonly string connectionString;
public SessionRepository(IConfiguration configuration)
{
connectionString = configuration.GetConnectionString("ShogiDatabase");
}
public SessionRepository(IConfiguration configuration)
{
connectionString = configuration.GetConnectionString("ShogiDatabase");
}
public async Task CreateSession(Session session)
{
var initialBoardState = JsonSerializer.Serialize(session.BoardState);
using var connection = new SqlConnection(connectionString);
await connection.ExecuteAsync(
"session.CreateSession",
new
{
SessionName = session.Name,
Player1Name = session.Player1,
InitialBoardStateDocument = initialBoardState
},
commandType: CommandType.StoredProcedure);
}
public async Task CreateSession(ShogiBoard session, string player1)
{
var initialBoardState = JsonSerializer.Serialize(session.BoardState);
using var connection = new SqlConnection(connectionString);
await connection.ExecuteAsync(
"session.CreateSession",
new
{
SessionName = session.Name,
Player1Name = player1,
InitialBoardStateDocument = initialBoardState
},
commandType: CommandType.StoredProcedure);
}
public async Task ReadSession(string name)
{
using var connection = new SqlConnection(connectionString);
var results = await connection.QueryAsync<SessionDto>(
"session.ReadSession",
commandType: CommandType.StoredProcedure);
if (!results.Any())
{
return null;
}
var dto = results.First();
return new Session(
name: dto.Name,
initialState: JsonSerializer.Deserialize< dto.BoardState)
}
}
public interface ISessionRepository
{
Task CreateSession(Session session);
Task CreateSession(ShogiBoard session);
}

View File

@@ -11,6 +11,17 @@
<UserSecretsId>973a1f5f-ef25-4f1c-a24d-b0fc7d016ab8</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Repositories\CouchModels\**" />
<Content Remove="Repositories\CouchModels\**" />
<EmbeddedResource Remove="Repositories\CouchModels\**" />
<None Remove="Repositories\CouchModels\**" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Repositories\GameboardRepository.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.2.2" />
<PackageReference Include="Azure.Identity" Version="1.6.1" />