Replace custom socket implementation with SignalR.
Replace MSAL and custom cookie auth with Microsoft.Identity.EntityFramework Also some UI redesign to accommodate different login experience.
This commit is contained in:
18
Shogi.Database/Session/Functions/MaxNewSessionsPerUser.sql
Normal file
18
Shogi.Database/Session/Functions/MaxNewSessionsPerUser.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
CREATE FUNCTION [session].[MaxNewSessionsPerUser]() RETURNS INT
|
||||
AS
|
||||
BEGIN
|
||||
|
||||
DECLARE @MaxNewSessionsCreatedByAnyOneUser INT;
|
||||
|
||||
WITH CountOfNewSessionsPerPlayer AS
|
||||
(
|
||||
SELECT COUNT(*) as TotalNewSessions
|
||||
FROM [session].[Session]
|
||||
WHERE Player2Id IS NULL
|
||||
GROUP BY Player1Id
|
||||
)
|
||||
SELECT @MaxNewSessionsCreatedByAnyOneUser = MAX(CountOfNewSessionsPerPlayer.TotalNewSessions)
|
||||
FROM CountOfNewSessionsPerPlayer
|
||||
|
||||
RETURN @MaxNewSessionsCreatedByAnyOneUser
|
||||
END
|
||||
@@ -1,9 +1,9 @@
|
||||
CREATE PROCEDURE [session].[CreateMove]
|
||||
@To VARCHAR(2),
|
||||
@From VARCHAR(2) = NULL,
|
||||
@To VARCHAR(2),
|
||||
@From VARCHAR(2) = NULL,
|
||||
@IsPromotion BIT = 0,
|
||||
@PieceFromHand NVARCHAR(13) = NULL,
|
||||
@SessionName [session].[SessionName]
|
||||
@PieceFromHand NVARCHAR(13) = NULL,
|
||||
@SessionId [session].[SessionSurrogateKey]
|
||||
AS
|
||||
|
||||
BEGIN
|
||||
@@ -13,11 +13,6 @@ BEGIN
|
||||
|
||||
BEGIN TRANSACTION
|
||||
|
||||
DECLARE @SessionId BIGINT = 0;
|
||||
SELECT @SessionId = Id
|
||||
FROM [session].[Session]
|
||||
WHERE [Name] = @SessionName;
|
||||
|
||||
DECLARE @PieceIdFromhand INT = NULL;
|
||||
SELECT @PieceIdFromhand = Id
|
||||
FROM [session].[Piece]
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
CREATE PROCEDURE [session].[CreateSession]
|
||||
@Name [session].[SessionName],
|
||||
@Player1Name [user].[UserName]
|
||||
@Id [session].[SessionSurrogateKey],
|
||||
@Player1Id [dbo].[AspNetUsersId]
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
INSERT INTO [session].[Session] ([Name], Player1Id)
|
||||
SELECT @Name, Id
|
||||
FROM [user].[User]
|
||||
WHERE [Name] = @Player1Name
|
||||
INSERT INTO [session].[Session]
|
||||
([Id], Player1Id)
|
||||
VALUES
|
||||
(@Id, @Player1Id)
|
||||
|
||||
END
|
||||
@@ -1,5 +1,5 @@
|
||||
CREATE PROCEDURE [session].[DeleteSession]
|
||||
@Name [session].[SessionName]
|
||||
@Id [session].[SessionSurrogateKey]
|
||||
AS
|
||||
|
||||
DELETE FROM [session].[Session] WHERE [Name] = @Name;
|
||||
DELETE FROM [session].[Session] WHERE [Id] = @Id;
|
||||
@@ -1,5 +1,5 @@
|
||||
CREATE PROCEDURE [session].[ReadSession]
|
||||
@Name [session].[SessionName]
|
||||
@Id [session].[SessionSurrogateKey]
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON -- Performance boost
|
||||
@@ -10,13 +10,12 @@ BEGIN
|
||||
|
||||
-- Session
|
||||
SELECT
|
||||
sess.[Name],
|
||||
p1.[Name] as Player1,
|
||||
p2.[Name] as Player2
|
||||
FROM [session].[Session] sess
|
||||
INNER JOIN [user].[User] p1 on sess.Player1Id = p1.Id
|
||||
LEFT JOIN [user].[User] p2 on sess.Player2Id = p2.Id
|
||||
WHERE sess.[Name] = @Name;
|
||||
Id,
|
||||
Player1Id,
|
||||
Player2Id,
|
||||
CreatedDate
|
||||
FROM [session].[Session]
|
||||
WHERE Id = @Id;
|
||||
|
||||
-- Player moves
|
||||
SELECT
|
||||
@@ -27,7 +26,7 @@ BEGIN
|
||||
FROM [session].[Move] mv
|
||||
INNER JOIN [session].[Session] sess ON sess.Id = mv.SessionId
|
||||
LEFT JOIN [session].Piece piece on piece.Id = mv.PieceIdFromHand
|
||||
WHERE sess.[Name] = @Name;
|
||||
WHERE sess.[Id] = @Id;
|
||||
|
||||
COMMIT
|
||||
END
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
CREATE PROCEDURE [session].[ReadSessionPlayerCount]
|
||||
@PlayerName [user].UserName
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @PlayerId as BIGINT;
|
||||
SELECT @PlayerId = Id
|
||||
FROM [user].[User]
|
||||
WHERE [Name] = @PlayerName;
|
||||
|
||||
-- Result set of sessions which @PlayerName participates in.
|
||||
SELECT
|
||||
[Name],
|
||||
CASE
|
||||
WHEN Player2Id IS NULL THEN 1
|
||||
ELSE 2
|
||||
END AS PlayerCount
|
||||
FROM [session].[Session]
|
||||
WHERE Player1Id = @PlayerId OR Player2Id = @PlayerId;
|
||||
|
||||
-- Result set of sessions which @PlayerName does not participate in.
|
||||
SELECT
|
||||
[Name],
|
||||
CASE
|
||||
WHEN Player2Id IS NULL THEN 1
|
||||
ELSE 2
|
||||
END AS PlayerCount
|
||||
FROM [session].[Session]
|
||||
WHERE Player1Id <> @PlayerId AND ISNULL(Player2Id, 0) <> @PlayerId;
|
||||
END
|
||||
@@ -0,0 +1,21 @@
|
||||
CREATE PROCEDURE [session].[ReadSessionsMetadata]
|
||||
@PlayerId [dbo].[AspNetUsersId]
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- Read all sessions, in this order:
|
||||
-- 1. sessions created by the logged-in user
|
||||
-- 2. any other sessions the logged-in user participates in
|
||||
-- 3. all other sessions
|
||||
SELECT
|
||||
Id, Player1Id, Player2Id, [Session].CreatedDate,
|
||||
case
|
||||
when Player1Id = @PlayerId then 0
|
||||
when Player2Id = @PlayerId then 1
|
||||
else 2
|
||||
end as OrderBy
|
||||
FROM [session].[Session]
|
||||
Order By OrderBy ASC, CreatedDate DESC
|
||||
|
||||
END
|
||||
@@ -1,13 +0,0 @@
|
||||
CREATE PROCEDURE [session].[ReadUsersBySession]
|
||||
@SessionName [session].[SessionName]
|
||||
AS
|
||||
|
||||
SELECT
|
||||
p1.[Name] as Player1Name,
|
||||
p1.DisplayName as Player1DisplayName,
|
||||
p2.[Name] as Player2Name,
|
||||
p2.DisplayName as Player2Displayname
|
||||
FROM [session].[Session] sess
|
||||
INNER JOIN [user].[User] p1 ON sess.Player1Id = p1.Id
|
||||
LEFT JOIN [user].[User] p2 on sess.Player2Id = p2.Id
|
||||
WHERE sess.[Name] = @SessionName;
|
||||
@@ -1,16 +1,13 @@
|
||||
CREATE PROCEDURE [session].[SetPlayer2]
|
||||
@SessionName [session].[SessionName],
|
||||
@Player2Name [user].[UserName] NULL
|
||||
@SessionId [session].[SessionSurrogateKey],
|
||||
@PlayerId [dbo].[AspNetUsersId]
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @player2Id BIGINT;
|
||||
SELECT @player2Id = Id FROM [user].[User] WHERE [Name] = @Player2Name;
|
||||
|
||||
UPDATE sess
|
||||
SET Player2Id = @player2Id
|
||||
FROM [session].[Session] sess
|
||||
WHERE sess.[Name] = @SessionName;
|
||||
|
||||
UPDATE [session].[Session]
|
||||
SET Player2Id = @PlayerId
|
||||
FROM [session].[Session]
|
||||
WHERE Id = @SessionId;
|
||||
|
||||
END
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
CREATE TABLE [session].[Move]
|
||||
(
|
||||
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
|
||||
[SessionId] BIGINT NOT NULL,
|
||||
[To] VARCHAR(2) NOT NULL,
|
||||
[From] VARCHAR(2) NULL,
|
||||
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
|
||||
[SessionId] [session].[SessionSurrogateKey] NOT NULL,
|
||||
[To] VARCHAR(2) NOT NULL,
|
||||
[From] VARCHAR(2) NULL,
|
||||
[PieceIdFromHand] INT NULL,
|
||||
[IsPromotion] BIT DEFAULT 0
|
||||
[IsPromotion] BIT DEFAULT 0
|
||||
|
||||
CONSTRAINT [Cannot end where you start]
|
||||
CHECK ([From] <> [To]),
|
||||
|
||||
@@ -1,16 +1,8 @@
|
||||
CREATE TABLE [session].[Session]
|
||||
(
|
||||
Id BIGINT NOT NULL PRIMARY KEY IDENTITY,
|
||||
[Name] [session].[SessionName] UNIQUE,
|
||||
Player1Id BIGINT NOT NULL,
|
||||
Player2Id BIGINT NULL,
|
||||
Created DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET(),
|
||||
|
||||
CONSTRAINT FK_Player1_User FOREIGN KEY (Player1Id) REFERENCES [user].[User] (Id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE,
|
||||
|
||||
CONSTRAINT FK_Player2_User FOREIGN KEY (Player2Id) REFERENCES [user].[User] (Id)
|
||||
ON DELETE NO ACTION
|
||||
ON UPDATE NO ACTION
|
||||
Id [session].[SessionSurrogateKey] PRIMARY KEY,
|
||||
Player1Id [dbo].[AspNetUsersId] NOT NULL,
|
||||
Player2Id [dbo].[AspNetUsersId] NULL,
|
||||
[CreatedDate] DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET(),
|
||||
CONSTRAINT [CK_Session_LimitedNewSessions] CHECK ([session].MaxNewSessionsPerUser() < 4),
|
||||
)
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
CREATE TYPE [session].[SessionName]
|
||||
FROM nvarchar(50) NOT NULL
|
||||
2
Shogi.Database/Session/Types/SessionSurrogateKey.sql
Normal file
2
Shogi.Database/Session/Types/SessionSurrogateKey.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
CREATE TYPE [session].[SessionSurrogateKey]
|
||||
FROM CHAR(36) NOT NULL
|
||||
Reference in New Issue
Block a user