From b2114fbcd29406deb8b3ed7548130e1ea4e36049 Mon Sep 17 00:00:00 2001 From: ivan-pelly Date: Sat, 21 Feb 2026 14:46:48 -0800 Subject: [PATCH] Database updates --- .../procedures/sp_RefreshToken_Replace.sql | 3 - db/Objects/procedures/sp_SeedData_1.sql | 87 +++++++------------ db/Objects/procedures/sp_User_GetByEmail.sql | 6 +- db/Objects/procedures/sp_User_GetById.sql | 6 +- db/Objects/tables/user.sql | 5 +- db/Objects/tables/user_program.sql | 5 +- 6 files changed, 40 insertions(+), 72 deletions(-) diff --git a/db/Objects/procedures/sp_RefreshToken_Replace.sql b/db/Objects/procedures/sp_RefreshToken_Replace.sql index 7104421..b087025 100644 --- a/db/Objects/procedures/sp_RefreshToken_Replace.sql +++ b/db/Objects/procedures/sp_RefreshToken_Replace.sql @@ -10,12 +10,10 @@ CREATE DEFINER=`root`@`%` PROCEDURE `sp_RefreshToken_Replace`( IN p_user_agent VARCHAR(512) ) BEGIN - -- Revoke the old token UPDATE refresh_token SET revoked_at = UTC_TIMESTAMP() WHERE id_refresh_token = p_old_token_id AND revoked_at IS NULL; - -- Create the new token INSERT INTO refresh_token ( id_refresh_token, @@ -36,7 +34,6 @@ BEGIN p_device_info, p_user_agent ); - -- Link old token to new one UPDATE refresh_token SET replaced_by_token_id = p_id_refresh_token WHERE id_refresh_token = p_old_token_id; diff --git a/db/Objects/procedures/sp_SeedData_1.sql b/db/Objects/procedures/sp_SeedData_1.sql index cb45b23..57d0c6f 100644 --- a/db/Objects/procedures/sp_SeedData_1.sql +++ b/db/Objects/procedures/sp_SeedData_1.sql @@ -1,59 +1,38 @@ DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `sp_SeedData_1`() BEGIN - -- ============================================================================= - -- Seed Data Script - create minimal set of working data - -- ============================================================================= - -- ============================================================================= - -- 1. SCHOOL DISTRICT - -- ============================================================================= - INSERT INTO school_district (id_school_district, name, contact_email, created_at) - VALUES ('a1b2c3d4-0001-4000-a000-000000000001', 'Parent District', 'contact@dummydistrict.edu', UTC_TIMESTAMP()); - -- ============================================================================= - -- 2. PROGRAM (child of the district above) - -- ============================================================================= - INSERT INTO program (id_program, id_school_district, name, description, created_at) - VALUES ('b2c3d4e5-0001-4000-a000-000000000001', 'a1b2c3d4-0001-4000-a000-000000000001', 'Test Program', 'A sample program for testing', UTC_TIMESTAMP()); - -- ============================================================================= - -- 3. ROLES - -- ============================================================================= - INSERT INTO role (id_role, name, internal_name, description, created_at) VALUES - ('c3d4e5f6-0001-4000-a000-000000000001', 'Super Admin', 'super_admin', 'Full system access', UTC_TIMESTAMP()), - ('c3d4e5f6-0002-4000-a000-000000000001', 'District Admin', 'district_admin', 'District-level administration', UTC_TIMESTAMP()), - ('c3d4e5f6-0003-4000-a000-000000000001', 'Program Admin', 'program_admin', 'Program-level administration', UTC_TIMESTAMP()), - ('c3d4e5f6-0004-4000-a000-000000000001', 'Teacher', 'teacher', 'Teacher role', UTC_TIMESTAMP()), - ('c3d4e5f6-0005-4000-a000-000000000001', 'Paraeducator', 'paraeducator', 'Paraeducator role', UTC_TIMESTAMP()), - ('c3d4e5f6-0006-4000-a000-000000000001', 'Student', 'student', 'Student role', UTC_TIMESTAMP()); - -- ============================================================================= - -- 4. USERS ? 2 Teachers + 1 Paraeducator - -- ============================================================================= - -- Teacher 1 - INSERT INTO user (id_user, id_role, email, name, password_hash, password_salt, created_at) - VALUES ('d4e5f6a7-0001-4000-a000-000000000001', 'c3d4e5f6-0004-4000-a000-000000000001', - 'teacher1@example.com', 'Teacher One', NULL, NULL, UTC_TIMESTAMP()); - -- Teacher 2 - INSERT INTO user (id_user, id_role, email, name, password_hash, password_salt, created_at) - VALUES ('d4e5f6a7-0002-4000-a000-000000000001', 'c3d4e5f6-0004-4000-a000-000000000001', - 'teacher2@example.com', 'Teacher Two', NULL, NULL, UTC_TIMESTAMP()); - -- Paraeducator 1 - INSERT INTO user (id_user, id_role, email, name, password_hash, password_salt, created_at) - VALUES ('d4e5f6a7-0003-4000-a000-000000000001', 'c3d4e5f6-0005-4000-a000-000000000001', - 'para1@example.com', 'Para One', NULL, NULL, UTC_TIMESTAMP()); - -- ============================================================================= - -- 5. USER_PROGRAM ? link all 3 users to the program - -- ============================================================================= - INSERT INTO user_program (id_user_program, id_user, id_program, is_primary, status, joined_at) VALUES - ('e5f6a7b8-0001-4000-a000-000000000001', 'd4e5f6a7-0001-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()), - ('e5f6a7b8-0002-4000-a000-000000000001', 'd4e5f6a7-0002-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()), - ('e5f6a7b8-0003-4000-a000-000000000001', 'd4e5f6a7-0003-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()); - -- ============================================================================= - -- 6. STUDENTS ? 5 students under the program - -- ============================================================================= - INSERT INTO student (id_student, id_program, identifier, program_year, enrollment_date, expected_grad, created_at) VALUES - ('f6a7b8c9-0001-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-001', 1, '2025-09-01', '2029-06-15', UTC_TIMESTAMP()), - ('f6a7b8c9-0002-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-002', 1, '2025-09-01', '2029-06-15', UTC_TIMESTAMP()), - ('f6a7b8c9-0003-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-003', 2, '2024-09-01', '2028-06-15', UTC_TIMESTAMP()), - ('f6a7b8c9-0004-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-004', 2, '2024-09-01', '2028-06-15', UTC_TIMESTAMP()), - ('f6a7b8c9-0005-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-005', 3, '2023-09-01', '2027-06-15', UTC_TIMESTAMP()); + -- 1. SCHOOL DISTRICT + INSERT INTO school_district (id_school_district, name, contact_email, created_at) + VALUES ('a1b2c3d4-0001-4000-a000-000000000001', 'Parent District', 'contact@dummydistrict.edu', UTC_TIMESTAMP()); + -- 2. PROGRAM + INSERT INTO program (id_program, id_school_district, name, description, created_at) + VALUES ('b2c3d4e5-0001-4000-a000-000000000001', 'a1b2c3d4-0001-4000-a000-000000000001', 'Test Program', 'A sample program for testing', UTC_TIMESTAMP()); + -- 3. ROLES + INSERT INTO role (id_role, name, internal_name, description, created_at) VALUES + ('c3d4e5f6-0001-4000-a000-000000000001', 'Super Admin', 'super_admin', 'Full system access', UTC_TIMESTAMP()), + ('c3d4e5f6-0002-4000-a000-000000000001', 'District Admin', 'district_admin', 'District-level administration', UTC_TIMESTAMP()), + ('c3d4e5f6-0003-4000-a000-000000000001', 'Program Admin', 'program_admin', 'Program-level administration', UTC_TIMESTAMP()), + ('c3d4e5f6-0004-4000-a000-000000000001', 'Teacher', 'teacher', 'Teacher role', UTC_TIMESTAMP()), + ('c3d4e5f6-0005-4000-a000-000000000001', 'Paraeducator', 'paraeducator', 'Paraeducator role', UTC_TIMESTAMP()), + ('c3d4e5f6-0006-4000-a000-000000000001', 'Student', 'student', 'Student role', UTC_TIMESTAMP()); + -- 4. USERS (no id_role) + INSERT INTO user (id_user, email, name, password_hash, password_salt, created_at) + VALUES ('d4e5f6a7-0001-4000-a000-000000000001', 'teacher1@example.com', 'Teacher One', NULL, NULL, UTC_TIMESTAMP()); + INSERT INTO user (id_user, email, name, password_hash, password_salt, created_at) + VALUES ('d4e5f6a7-0002-4000-a000-000000000001', 'teacher2@example.com', 'Teacher Two', NULL, NULL, UTC_TIMESTAMP()); + INSERT INTO user (id_user, email, name, password_hash, password_salt, created_at) + VALUES ('d4e5f6a7-0003-4000-a000-000000000001', 'para1@example.com', 'Para One', NULL, NULL, UTC_TIMESTAMP()); + -- 5. USER_PROGRAM (now includes id_role) + INSERT INTO user_program (id_user_program, id_user, id_program, id_role, is_primary, status, joined_at) VALUES + ('e5f6a7b8-0001-4000-a000-000000000001', 'd4e5f6a7-0001-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'c3d4e5f6-0004-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()), + ('e5f6a7b8-0002-4000-a000-000000000001', 'd4e5f6a7-0002-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'c3d4e5f6-0004-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()), + ('e5f6a7b8-0003-4000-a000-000000000001', 'd4e5f6a7-0003-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'c3d4e5f6-0005-4000-a000-000000000001', 1, 'active', UTC_TIMESTAMP()); + -- 6. STUDENTS + INSERT INTO student (id_student, id_program, identifier, program_year, enrollment_date, expected_grad, created_at) VALUES + ('f6a7b8c9-0001-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-001', 1, '2025-09-01', '2029-06-15', UTC_TIMESTAMP()), + ('f6a7b8c9-0002-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-002', 1, '2025-09-01', '2029-06-15', UTC_TIMESTAMP()), + ('f6a7b8c9-0003-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-003', 2, '2024-09-01', '2028-06-15', UTC_TIMESTAMP()), + ('f6a7b8c9-0004-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-004', 2, '2024-09-01', '2028-06-15', UTC_TIMESTAMP()), + ('f6a7b8c9-0005-4000-a000-000000000001', 'b2c3d4e5-0001-4000-a000-000000000001', 'STU-005', 3, '2023-09-01', '2027-06-15', UTC_TIMESTAMP()); END;; DELIMITER ; diff --git a/db/Objects/procedures/sp_User_GetByEmail.sql b/db/Objects/procedures/sp_User_GetByEmail.sql index c36f802..a294e10 100644 --- a/db/Objects/procedures/sp_User_GetByEmail.sql +++ b/db/Objects/procedures/sp_User_GetByEmail.sql @@ -3,18 +3,14 @@ CREATE DEFINER=`root`@`%` PROCEDURE `sp_User_GetByEmail`(IN p_email VARCHAR(255) BEGIN SELECT u.id_user, - u.id_role, u.email, u.name, u.password_hash, u.password_salt, u.failed_login_attempts, u.locked_until, - u.created_at, - r.internal_name AS role_internal_name, - r.name AS role_display_name + u.created_at FROM `user` u - LEFT JOIN role r ON u.id_role = r.id_role WHERE u.email = p_email LIMIT 1; END;; diff --git a/db/Objects/procedures/sp_User_GetById.sql b/db/Objects/procedures/sp_User_GetById.sql index e41d1b8..5bd7fbc 100644 --- a/db/Objects/procedures/sp_User_GetById.sql +++ b/db/Objects/procedures/sp_User_GetById.sql @@ -3,18 +3,14 @@ CREATE DEFINER=`root`@`%` PROCEDURE `sp_User_GetById`(IN p_id_user CHAR(36)) BEGIN SELECT u.id_user, - u.id_role, u.email, u.name, u.password_hash, u.password_salt, u.failed_login_attempts, u.locked_until, - u.created_at, - r.internal_name AS role_internal_name, - r.name AS role_display_name + u.created_at FROM `user` u - LEFT JOIN role r ON u.id_role = r.id_role WHERE u.id_user = p_id_user LIMIT 1; END;; diff --git a/db/Objects/tables/user.sql b/db/Objects/tables/user.sql index e5c789f..821ef59 100644 --- a/db/Objects/tables/user.sql +++ b/db/Objects/tables/user.sql @@ -1,6 +1,5 @@ CREATE TABLE `user` ( `id_user` char(36) NOT NULL, - `id_role` char(36) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `password_hash` varchar(255) DEFAULT NULL, @@ -9,7 +8,5 @@ CREATE TABLE `user` ( `failed_login_attempts` int DEFAULT '0', `locked_until` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id_user`), - KEY `user_ibfk_1` (`id_role`), - CONSTRAINT `user_ibfk_1` FOREIGN KEY (`id_role`) REFERENCES `role` (`id_role`) + PRIMARY KEY (`id_user`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; diff --git a/db/Objects/tables/user_program.sql b/db/Objects/tables/user_program.sql index 4333981..4ab363e 100644 --- a/db/Objects/tables/user_program.sql +++ b/db/Objects/tables/user_program.sql @@ -2,12 +2,15 @@ CREATE TABLE `user_program` ( `id_user_program` char(36) NOT NULL, `id_user` char(36) DEFAULT NULL, `id_program` char(36) DEFAULT NULL, + `id_role` char(36) DEFAULT NULL, `is_primary` tinyint(1) DEFAULT '0', `status` varchar(20) DEFAULT 'active', `joined_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id_user_program`), UNIQUE KEY `uq_user_program` (`id_user`,`id_program`), KEY `idx_id_program` (`id_program`), + KEY `idx_user_program_role` (`id_role`), CONSTRAINT `user_program_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`), - CONSTRAINT `user_program_ibfk_2` FOREIGN KEY (`id_program`) REFERENCES `program` (`id_program`) + CONSTRAINT `user_program_ibfk_2` FOREIGN KEY (`id_program`) REFERENCES `program` (`id_program`), + CONSTRAINT `user_program_ibfk_3` FOREIGN KEY (`id_role`) REFERENCES `role` (`id_role`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;