Feat: Game Rounds and Damage Log.

This commit is contained in:
2026-02-11 22:11:15 +00:00
parent 29ddd1ded0
commit 1cd9b7c976
20 changed files with 860 additions and 171 deletions

View File

@@ -18,6 +18,7 @@ RETURNS TABLE (
, location_name TEXT
, start_on TIMESTAMP
, end_on TIMESTAMP
, starting_life INT
, active BOOLEAN
, created_on TIMESTAMP
, created_by_user_id INT
@@ -60,6 +61,7 @@ BEGIN
, GAME.location_name
, GAME.start_on
, GAME.end_on
, GAME.starting_life
, GAME.active
, GAME.created_on
, GAME.created_by_user_id

View File

@@ -26,7 +26,7 @@ BEGIN
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Round_Player_Damage;
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Error;
CREATE TABLE Temp_MTG_Round_Damage_Save_Game (
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Game (
game_id INT NOT NULL
, notes TEXT
, is_commander BOOLEAN
@@ -43,7 +43,7 @@ BEGIN
, change_set_id INT
);
CREATE TABLE Temp_MTG_Round_Damage_Save_Player (
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Player (
player_id INT NOT NULL
, game_id INT
, user_id INT
@@ -59,7 +59,7 @@ BEGIN
, change_set_id INT
);
CREATE TABLE Temp_MTG_Round_Damage_Save_Round (
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Round (
temp_id INT NOT NULL
, round_id INT
, game_id INT
@@ -74,10 +74,10 @@ BEGIN
, is_new BOOLEAN
, error_name TEXT
, is_duplicate BOOLEAN
, is_duplicate BOOLEAN DEFAULT FALSE
);
CREATE TABLE Temp_MTG_Round_Damage_Save_Round_Player_Damage (
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Round_Player_Damage (
temp_id INT NOT NULL
, damage_id INT
, temp_round_id INT
@@ -96,7 +96,7 @@ BEGIN
, is_new BOOLEAN
, error_name TEXT
, is_duplicate BOOLEAN
, is_duplicate BOOLEAN DEFAULT FALSE
);
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Error (
@@ -147,7 +147,7 @@ BEGIN
, COALESCE(ROUND_T.updated_last_on, v_time_start) -- updated_last_on
, COALESCE(ROUND_T.updated_last_by_user_id, a_user_id) -- updated_last_by_user_id
, CASE WHEN ROUND.round_id IS NULL THEN TRUE ELSE FALSE END AS is_new
, CASE WHEN TCG_ROUND.round_id IS NULL THEN TRUE ELSE FALSE END AS is_new
, CONCAT(
'Round { id: '
, CAST(ROUND_T.round_id AS VARCHAR)
@@ -160,12 +160,12 @@ BEGIN
, ' }'
) -- error_name
FROM tcg.public.TCG_MTG_Game_Round_Temp ROUND_T
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND
ON ROUND_T.round_id = ROUND.round_id
LEFT JOIN tcg.public.TCG_MTG_Game_Round TCG_ROUND
ON ROUND_T.round_id = TCG_ROUND.round_id
OR (
COALESCE(ROUND_T.round_id, 0) < 1
AND ROUND_T.game_id = ROUND.game_id
AND ROUND_T.display_order = ROUND.display_order
AND ROUND_T.game_id = TCG_ROUND.game_id
AND ROUND_T.display_order = TCG_ROUND.display_order
)
WHERE ROUND_T.guid = a_guid
;
@@ -243,16 +243,18 @@ BEGIN
WHERE PLAYER_DAMAGE_T.guid = a_guid
;
UPDATE Temp_MTG_Round_Damage_Save_Round
SET round_id = COALESCE(ROUND.round_id, ROUND_T.round_id, 0)
FROM tcg.public.TCG_MTG_Game_Round_Temp ROUND_T
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND
ON ROUND_T.round_id = ROUND.round_id
OR (
ROUND_T.game_id = ROUND.game_id
AND ROUND_T.display_order = ROUND.display_order
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
SET round_id = COALESCE(TCG_ROUND.round_id, T_ROUND.round_id)
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
WHERE
(
T_ROUND.round_id = TCG_ROUND.round_id
OR (
T_ROUND.game_id = TCG_ROUND.game_id
AND T_ROUND.display_order = TCG_ROUND.display_order
)
)
WHERE COALESCE(ROUND_T.round_id, 0) < 1
AND COALESCE(T_ROUND.round_id, 0) < 1
;
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
@@ -350,6 +352,22 @@ BEGIN
OR PLAYER.player_id = T_PLAYER_DAMAGE.received_from_commander_player_id
;
/*
INSERT INTO Temp_MTG_Round_Damage_Save_Error (
error_type_id
, message
)
SELECT
v_bad_data_error_type_id -- error_type_id
, CONCAT(
'Rounds: '
, STRING_AGG(T_ROUND.error_name, ', ')
, '.'
) -- message
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
;
*/
-- Validate Round
-- Missing fields
WITH Round_Missing_Field AS (
@@ -404,7 +422,25 @@ BEGIN
-- Duplicate
WITH
All_Round AS (
Existing_Round AS (
SELECT
TCG_ROUND.round_id
, TCG_ROUND.game_id
, TCG_ROUND.display_order
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON TCG_ROUND.round_id = T_ROUND.round_id
WHERE
TCG_ROUND.active
/*
AND NOT EXISTS (
SELECT 1
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
WHERE T_ROUND.round_id = TCG_ROUND.round_id
)
*/
AND T_ROUND.temp_id IS NULL
)
, All_Round AS (
SELECT
T_ROUND.temp_id
, T_ROUND.game_id
@@ -414,27 +450,23 @@ BEGIN
UNION
SELECT
NULL AS temp_id
, ROUND.game_id
, ROUND.display_order
, EXISTING_ROUND.game_id
, EXISTING_ROUND.display_order
, FALSE AS is_save_record
FROM tcg.public.TCG_MTG_Game_Round ROUND
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON ROUND.round_id = T_ROUND.round_id
WHERE
T_ROUND.round_id IS NULL
AND ROUND.active
FROM Existing_Round EXISTING_ROUND
)
, Unique_Game_Round AS (
SELECT
ALL_ROUND.game_id
, ALL_ROUND.display_order
, COUNT(*) AS count
, COUNT(*) AS count_rounds
FROM All_Round ALL_ROUND
GROUP BY
ALL_ROUND.game_id
, ALL_ROUND.display_order
)
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_GAME_ROUND.count, 0) > 1 THEN TRUE ELSE FALSE END
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_GAME_ROUND.count_rounds, 0) > 1 THEN TRUE ELSE FALSE END
FROM Unique_Game_Round UNIQUE_GAME_ROUND
WHERE
T_ROUND.game_id = UNIQUE_GAME_ROUND.game_id
@@ -462,6 +494,123 @@ BEGIN
;
END IF;
/*
-- Testing TESTING
WITH
Existing_Round AS (
SELECT
TCG_ROUND.round_id
, TCG_ROUND.game_id
, TCG_ROUND.display_order
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON TCG_ROUND.round_id = T_ROUND.round_id
WHERE
TCG_ROUND.active
/*
AND NOT EXISTS (
SELECT *
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
WHERE T_ROUND.round_id = TCG_ROUND.round_id
)
*/
AND T_ROUND.temp_id IS NULL
)
, All_Round AS (
SELECT
T_ROUND.temp_id
, T_ROUND.round_id
, T_ROUND.game_id
, T_ROUND.display_order
, TRUE AS is_save_record
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
UNION
SELECT
NULL AS temp_id
, EXISTING_ROUND.round_id
, EXISTING_ROUND.game_id
, EXISTING_ROUND.display_order
, FALSE AS is_save_record
FROM Existing_Round EXISTING_ROUND
)
, Unique_Game_Round AS (
SELECT
ALL_ROUND.game_id
, ALL_ROUND.display_order
, COUNT(*) AS count_rounds
FROM All_Round ALL_ROUND
GROUP BY
ALL_ROUND.game_id
, ALL_ROUND.display_order
)
INSERT INTO Temp_MTG_Round_Damage_Save_Error (
error_type_id
, message
)
SELECT
v_bad_data_error_type_id -- error_type_id
, CONCAT(
'TEST: Existing rounds: '
, STRING_AGG(
CONCAT(
'{ Round ID: '
, CAST(EXISTING_ROUND.round_id AS VARCHAR)
, ', Game ID: '
, CAST(EXISTING_ROUND.game_id AS VARCHAR)
, ', Display order: '
, CAST(EXISTING_ROUND.display_order AS VARCHAR)
, ' }'
)
, ', '
)
) -- message
FROM Existing_Round EXISTING_ROUND
UNION
SELECT
v_bad_data_error_type_id -- error_type_id
, CONCAT(
'TEST: All rounds: '
-- , STRING_AGG(CONCAT(ALL_ROUND.temp_id, ' - ', ALL_ROUND.game_id, ' - ', ALL_ROUND.display_order), ', ')
, STRING_AGG(
CONCAT(
'{ Temp ID: '
, CAST(ALL_ROUND.temp_id AS VARCHAR)
, ', Round ID: '
, CAST(ALL_ROUND.round_id AS VARCHAR)
, ', Game ID: '
, CAST(ALL_ROUND.game_id AS VARCHAR)
, ', Display order: '
, CAST(ALL_ROUND.display_order AS VARCHAR)
, ' }'
)
, ', '
)
) -- message
FROM All_Round ALL_ROUND
UNION
SELECT
v_bad_data_error_type_id -- error_type_id
, CONCAT(
'TEST: Unique rounds: '
-- , STRING_AGG(CONCAT(UNIQUE_ROUND.game_id, ' - ', UNIQUE_ROUND.display_order, ' - ', UNIQUE_ROUND.count_rounds), ', ')
, STRING_AGG(
CONCAT(
'{ Game ID: '
, CAST(UNIQUE_ROUND.game_id AS VARCHAR)
, ', Display order: '
, CAST(UNIQUE_ROUND.display_order AS VARCHAR)
, ' Count: '
, CAST(UNIQUE_ROUND.count_rounds AS VARCHAR)
, ' }'
)
, ', '
)
) -- message
FROM Unique_Game_Round UNIQUE_ROUND
;
*/
-- Validate Damage
-- Missing fields
WITH Player_Damage_Missing_Field AS (
@@ -550,7 +699,18 @@ BEGIN
-- Duplicate Round Player Damage
WITH
All_Player_Damage AS (
Existing_Player_Damage AS (
SELECT
T_PLAYER_DAMAGE.round_id
, T_PLAYER_DAMAGE.player_id
, COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) AS received_from_commander_player_id
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
LEFT JOIN Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE ON PLAYER_DAMAGE.damage_id = T_PLAYER_DAMAGE.damage_id
WHERE
T_PLAYER_DAMAGE.temp_id IS NULL
AND PLAYER_DAMAGE.active
)
, All_Player_Damage AS (
SELECT
T_PLAYER_DAMAGE.temp_id
, T_PLAYER_DAMAGE.round_id
@@ -561,22 +721,18 @@ BEGIN
UNION
SELECT
NULL AS temp_id
, T_PLAYER_DAMAGE.round_id
, T_PLAYER_DAMAGE.player_id
, COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) AS received_from_commander_player_id
, EXISTING_PLAYER_DAMAGE.round_id
, EXISTING_PLAYER_DAMAGE.player_id
, EXISTING_PLAYER_DAMAGE.received_from_commander_player_id
, FALSE AS is_save_record
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
LEFT JOIN Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE ON PLAYER_DAMAGE.damage_id = T_PLAYER_DAMAGE.damage_id
WHERE
T_PLAYER_DAMAGE.damage_id IS NULL
AND PLAYER_DAMAGE.active
FROM Existing_Player_Damage EXISTING_PLAYER_DAMAGE
)
, Unique_Game_Player_Damage AS (
SELECT
ALL_PLAYER_DAMAGE.round_id
, ALL_PLAYER_DAMAGE.player_id
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
, COUNT(*) AS count
, COUNT(*) AS count_damage
FROM All_Player_Damage ALL_PLAYER_DAMAGE
GROUP BY
ALL_PLAYER_DAMAGE.round_id
@@ -584,12 +740,12 @@ BEGIN
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
)
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_PLAYER_DAMAGE.count, 0) > 1 THEN TRUE ELSE FALSE END
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_PLAYER_DAMAGE.count_damage, 0) > 1 THEN TRUE ELSE FALSE END
FROM Unique_Game_Player_Damage UNIQUE_PLAYER_DAMAGE
WHERE
T_PLAYER_DAMAGE.round_id = UNIQUE_PLAYER_DAMAGE.round_id
AND T_PLAYER_DAMAGE.player_id = UNIQUE_PLAYER_DAMAGE.player_id
AND T_PLAYER_DAMAGE.received_from_commander_player_id = UNIQUE_PLAYER_DAMAGE.received_from_commander_player_id
AND COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) = UNIQUE_PLAYER_DAMAGE.received_from_commander_player_id
;
IF EXISTS (
@@ -725,7 +881,7 @@ BEGIN
, T_ROUND.display_order
;
UPDATE tcg.public.TCG_MTG_Game_Round ROUND
UPDATE tcg.public.TCG_MTG_Game_Round TCG_ROUND
SET
game_id = T_ROUND.game_id
, notes = T_ROUND.notes
@@ -736,16 +892,16 @@ BEGIN
, change_set_id = v_change_set_id
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
WHERE
ROUND.round_id = T_ROUND.round_id
TCG_ROUND.round_id = T_ROUND.round_id
AND NOT T_ROUND.is_new
;
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
SET round_id = ROUND.round_id
FROM tcg.public.TCG_MTG_Game_Round ROUND
SET round_id = TCG_ROUND.round_id
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
WHERE
T_ROUND.game_id = ROUND.game_id
AND T_ROUND.display_order = ROUND.display_order
T_ROUND.game_id = TCG_ROUND.game_id
AND T_ROUND.display_order = TCG_ROUND.display_order
AND T_ROUND.is_new
;
@@ -865,8 +1021,59 @@ DECLARE
v_user_id INT := 3;
v_success BOOLEAN;
BEGIN
v_guid := gen_random_uuid();
v_guid := '6307bed6-73a1-41ab-9a90-79e18e14dd81'::UUID; -- gen_random_uuid();
CALL tcg.public.USP_TCG_MTG_Game_Round_Damage_Save (
a_comment := v_comment -- a_comment
, a_guid := v_guid -- a_guid
, a_user_id := v_user_id -- a_user_id
, o_success := v_success -- o_success
);
RAISE NOTICE 'Success: %', CASE WHEN v_success THEN 'TRUE' ELSE 'FALSE' END;
END;
$$;
SELECT *
-- DELETE
FROM tcg.public.Error ERROR
LEFT JOIN tcg.public.Error_Type ERROR_TYPE ON ERROR.error_type_id = ERROR_TYPE.error_type_id
;
SELECT *
FROM tcg.public.Error_Type ERROR_TYPE
;
SELECT *
FROM tcg.public.TCG_Change_Set CHANGE_SET
ORDER BY CHANGE_SET.change_set_id DESC
;
/*
SELECT *
FROM tcg.public.TCG_MTG_Game
;
;
*/
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Temp
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage_Temp
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON TCG_ROUND.game_id = GAME.game_id
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
LEFT JOIN tcg.public.TCG_MTG_Game_Round TCG_ROUND ON PLAYER_DAMAGE.round_id = TCG_ROUND.round_id
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON TCG_ROUND.game_id = GAME.game_id
;
/*
INSERT INTO tcg.public.TCG_MTG_Game_Round_Temp (
guid
, round_id
@@ -927,52 +1134,8 @@ BEGIN
, TRUE -- active
)
;
CALL tcg.public.USP_TCG_MTG_Game_Round_Damage_Save (
a_comment := v_comment -- a_comment
, a_guid := v_guid -- a_guid
, a_user_id := v_user_id -- a_user_id
, o_success := v_success -- o_success
);
RAISE NOTICE 'Success: %', CASE WHEN v_success THEN 'TRUE' ELSE 'FALSE' END;
END;
$$;
SELECT *
-- DELETE
FROM tcg.public.Error ERROR
LEFT JOIN tcg.public.Error_Type ERROR_TYPE ON ERROR.error_type_id = ERROR_TYPE.error_type_id
;
SELECT *
FROM tcg.public.Error_Type ERROR_TYPE
;
SELECT *
FROM tcg.public.TCG_Change_Set CHANGE_SET
ORDER BY CHANGE_SET.change_set_id DESC
;
/*
SELECT *
FROM tcg.public.TCG_MTG_Game
;
*/
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Temp
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage_Temp
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round ROUND
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON ROUND.game_id = GAME.game_id
;
SELECT *
-- DELETE
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND ON PLAYER_DAMAGE.round_id = ROUND.round_id
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON ROUND.game_id = GAME.game_id
;
*/