diff --git a/static/MySQL/00000_combined.sql b/static/MySQL/00000_combined.sql index a51b763..5ac1675 100644 --- a/static/MySQL/00000_combined.sql +++ b/static/MySQL/00000_combined.sql @@ -1,31 +1,40 @@ USE demo; -DROP PROCEDURE IF EXISTS demo.p_dog_get_many_dog; +DROP PROCEDURE IF EXISTS demo.p_dog_calc_dog; DELIMITER // -CREATE PROCEDURE demo.p_dog_get_many_dog ( - IN a_id_user INT +CREATE PROCEDURE demo.p_dog_calc_dog ( + IN a_guid BINARY(36) + , IN a_id_user INT , IN a_get_all_dog BIT , IN a_get_inactive_dog BIT , IN a_ids_dog TEXT , IN a_names_dog TEXT + , IN a_get_all_user BIT + , IN a_get_inactive_user BIT + , IN a_ids_user TEXT + , IN a_names_user TEXT + , IN a_emails_user TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT , IN a_require_any_non_id_search_filters_met BIT + , IN a_show_errors BIT , IN a_debug BIT ) BEGIN DECLARE v_can_view BIT; DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); - DECLARE v_guid BINARY(36); + DECLARE v_has_filter_dog_id BIT; + DECLARE v_has_filter_dog_name BIT; DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; + DECLARE v_is_super_user BIT; DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION @@ -38,14 +47,14 @@ BEGIN ROLLBACK; - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Dog ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT , code VARCHAR(250) NOT NULL , msg TEXT NOT NULL ); - INSERT INTO tmp_Msg_Error ( + INSERT INTO tmp_Msg_Error_Calc_Dog ( id_type , code , msg @@ -68,15 +77,14 @@ BEGIN , ERROR_TYPE.background_colour , ERROR_TYPE.text_colour , t_ERROR.msg - FROM tmp_Msg_Error t_ERROR + FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; - DROP TABLE IF EXISTS tmp_Msg_Error; + DROP TABLE IF EXISTS tmp_Msg_Error_Calc_Dog; END; SET v_time_start := CURRENT_TIMESTAMP(6); - SET v_guid := UUID(); SET v_code_type_error_bad_data := 'BAD_DATA'; SET v_code_type_error_no_permission := 'NO_PERMISSION'; SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); @@ -84,68 +92,107 @@ BEGIN SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM demo.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1); SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM demo.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); + CALL demo.p_core_validate_guid ( a_guid ); + SET a_id_user := IFNULL(a_id_user, 0); - /* SET a_get_all_dog := IFNULL(a_get_all_dog, 0); SET a_get_inactive_dog := IFNULL(a_get_inactive_dog, 0); SET a_ids_dog := TRIM(IFNULL(a_ids_dog, '')); SET a_names_dog := TRIM(IFNULL(a_names_dog, '')); + -- USER filters handled by p_dog_calc_user_access SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); - */ + SET a_show_errors := IFNULL(a_show_errors, 0); SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN SELECT - a_id_user + a_guid + , a_id_user , a_get_all_dog , a_get_inactive_dog , a_ids_dog , a_names_dog + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met , a_require_any_non_id_search_filters_met + , a_show_errors , a_debug ; SELECT v_id_type_error_bad_data , v_id_type_error_no_permission - , v_guid , v_id_permission_dog_view , v_time_start ; END IF; - DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Dog; - CREATE TEMPORARY TABLE tmp_Dog ( - id_dog INT NOT NULL - , name VARCHAR(250) - , appearance VARCHAR(1000) - , mass_kg DECIMAL(7, 3) - , notes TEXT - , active BIT + CREATE TEMPORARY TABLE tmp_Calc_User_Access_Calc_Dog ( + id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL + , id_user INT + , id_role INT + , id_permission_required INT NOT NULL + , priority_access_level_required INT NOT NULL + , is_super_user BIT + , priority_access_level_user INT + , has_access BIT + , can_view BIT + , can_edit BIT + , can_admin BIT , does_meet_id_filters BIT , does_meet_non_id_filters BIT + ); + + CREATE TEMPORARY TABLE tmp_Dog_Calc_Dog ( + id_dog INT NOT NULL + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Dog ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT , code VARCHAR(250) NOT NULL , msg TEXT NOT NULL - ); + ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Dog ( + substring VARCHAR(4000) NOT NULL + , as_int INT + ); + DELETE FROM tmp_Split_Id_Calc_Dog; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name_Calc_Dog ( + substring VARCHAR(4000) NOT NULL + , as_int INT + ); + DELETE FROM tmp_Split_Name_Calc_Dog; + + SET v_has_filter_dog_id = CASE WHEN a_ids_dog <> '' THEN 1 ELSE 0 END; + SET v_has_filter_dog_name = CASE WHEN a_names_dog <> '' THEN 1 ELSE 0 END; + + + -- Permissions IF a_debug = 1 THEN SELECT - v_guid -- guid + a_guid -- a_guid , 0 -- get_all_user , 0 -- get_inactive_user , a_id_user -- ids_user @@ -159,12 +206,12 @@ BEGIN , v_id_permission_dog_view -- ids_permission , v_id_access_level_view -- ids_access_level , 0 -- a_show_errors - , a_debug -- a_debug + , 0 -- a_debug ; END IF; CALL demo.p_dog_calc_user_access( - v_guid-- guid + a_guid -- a_guid , 0 -- get_all_user , 0 -- get_inactive_user , a_id_user -- ids_user @@ -178,30 +225,33 @@ BEGIN , v_id_permission_dog_view -- ids_permission , v_id_access_level_view -- ids_access_level , 0 -- a_show_errors - , a_debug -- a_debug + , 0 -- a_debug ); - + SELECT IFNULL(CALC_USER_T.has_access, 0) + , IFNULL(CALC_USER_T.is_super_user, 0) INTO v_can_view + , v_is_super_user FROM demo.DOG_Calc_User_Access_Temp CALC_USER_T - WHERE CALC_USER_T.GUID = v_guid + WHERE CALC_USER_T.guid = a_guid LIMIT 1 ; IF a_debug = 1 THEN - SELECT v_can_view; - SELECT COUNT(*) AS Count_Errors FROM tmp_Msg_Error t_ERROR; - SELECT * FROM tmp_Msg_Error t_ERROR; + SELECT + v_can_view + , v_is_super_user + ; END IF; IF (v_can_view = 0) THEN DELETE t_ME - FROM tmp_Msg_Error t_ME + FROM tmp_Msg_Error_Calc_Dog t_ME WHERE t_ME.id_type <> v_id_type_error_no_permission ; - INSERT INTO tmp_Msg_Error ( + INSERT INTO tmp_Msg_Error_Calc_Dog ( id_type , code , msg @@ -209,131 +259,406 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - , 'You do not have permission to view Commands.' + , 'You do not have permission to view Dog.' ) ; END IF; CALL demo.p_dog_clear_calc_user_access( - v_guid + a_guid , 0 -- a_debug ); + -- Users + IF a_debug = 1 THEN + SELECT + a_guid -- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ; + END IF; - -- Call Dog Calc - IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + CALL demo.p_dog_calc_user_access( + a_guid-- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ); + + INSERT INTO tmp_Calc_User_Access_Calc_Dog ( + id_user + , id_role + , id_permission_required + , priority_access_level_required + , is_super_user + , priority_access_level_user + , has_access + , can_view + , can_edit + , can_admin + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + CALC_USER_T.id_user + , CALC_USER_T.id_role + , CALC_USER_T.id_permission_required + , CALC_USER_T.priority_access_level_required + , CALC_USER_T.is_super_user + , CALC_USER_T.priority_access_level_user + , CALC_USER_T.has_access + , CALC_USER_T.can_view + , CALC_USER_T.can_edit + , CALC_USER_T.can_admin + , CALC_USER_T.does_meet_id_filters + , CALC_USER_T.does_meet_non_id_filters + FROM demo.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = a_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT 'After get many user'; + SELECT * FROM tmp_Calc_User_Access_Calc_Dog; + SELECT COUNT(*) AS Count_Errors FROM tmp_Msg_Error_Calc_Dog t_ERROR; + SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR; + END IF; + + CALL demo.p_dog_clear_calc_user_access( + a_guid + , 0 -- a_debug + ); + + + -- Dogs + IF v_has_filter_dog_id = 1 THEN + CALL demo.p_core_split(a_guid, a_ids_dog, ',', a_debug); + + SET sql_mode = ''; + IF a_debug = 1 THEN - SELECT - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_dog -- a_get_all_dog - , a_get_inactive_dog -- a_get_inactive_dog - , a_ids_dog -- a_ids_dog - , a_names_dog -- a_names_dog - , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met - , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met - , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met - , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met - , 0 -- a_show_errors - , 0 -- a_debug + SELECT * + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + SELECT COUNT(*) AS count_split_ids + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' ; END IF; - - CALL demo.p_dog_calc_dog( - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_dog -- a_get_all_dog - , a_get_inactive_dog -- a_get_inactive_dog - , a_ids_dog -- a_ids_dog - , a_names_dog -- a_names_dog - , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met - , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met - , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met - , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met - , 0 -- a_show_errors - , 0 -- a_debug - ); - - INSERT INTO tmp_Dog ( - id_dog - , name - , appearance - , mass_kg - , notes - , active + + INSERT INTO tmp_Split_Id_Calc_Dog ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + + CALL demo.p_core_clear_split( a_guid ); + END IF; - , does_meet_id_filters - , does_meet_non_id_filters - ) - SELECT - DOG_T.id_dog - , DOG_T.name - , DOG_T.appearance - , DOG_T.mass_kg - , DOG_T.notes - , DOG_T.active + IF v_has_filter_dog_name = 1 THEN + CALL demo.p_core_split(a_guid, a_names_dog, ',', a_debug); + + SET sql_mode = ''; - , DOG_T.does_meet_id_filters - , DOG_T.does_meet_non_id_filters - FROM demo.DOG_Dog_Temp DOG_T - WHERE DOG_T.GUID = v_guid - ; - IF a_debug = 1 THEN - SELECT * FROM tmp_Dog; + SELECT * + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + SELECT COUNT(*) AS count_split_names + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; END IF; + + INSERT INTO tmp_Split_Name_Calc_Dog ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int + FROM demo.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + + CALL demo.p_core_clear_split( a_guid ); + END IF; + + IF a_debug = 1 THEN + SELECT * + FROM tmp_Split_Id_Calc_Dog + ; + SELECT * + FROM tmp_Split_Name_Calc_Dog + ; END IF; - -- Filter outputs - IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN - IF a_debug = 1 THEN - SELECT * FROM tmp_Dog; - END IF; + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split_Id_Calc_Dog t_SPLIT_ID + LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog + WHERE + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(DOG.id_dog) + OR ( + DOG.active = 0 + AND a_get_inactive_dog = 0 + ) + ) THEN + INSERT INTO tmp_Msg_Error_Calc_Dog ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Id_Calc_Dog t_SPLIT_ID + LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog + WHERE + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(DOG.id_dog) + OR ( + DOG.active = 0 + AND a_get_inactive_dog = 0 + ) + ; + /* Don't error on names not found + ELSEIF EXISTS () + */ + ELSE + INSERT INTO tmp_Dog_Calc_Dog ( + id_dog + , does_meet_id_filters + , does_meet_non_id_filters + ) + WITH + Dog_Id_Filter AS ( + SELECT DOG.id_dog + FROM tmp_Split_Id_Calc_Dog t_SPLIT_ID + INNER JOIN demo.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog + ) + , Dog_Name_Filter AS ( + SELECT DOG.id_dog + FROM tmp_Split_Name_Calc_Dog t_SPLIT_NAME + INNER JOIN demo.DOG_Dog DOG ON DOG.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + WHERE IFNULL(t_SPLIT_NAME.substring, '') <> '' + ) + , Dog_Filters AS ( + SELECT + DOG_COMBINED.id_dog + , MAX(DOG_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(DOG_COMBINED.does_meet_name_filter) AS does_meet_name_filter + FROM ( + SELECT + DOG_ID_FILTER.id_dog + , 1 AS does_meet_id_filter + , 0 AS does_meet_name_filter + FROM Dog_Id_Filter DOG_ID_FILTER + UNION + SELECT + DOG_NAME_FILTER.id_dog + , 0 AS does_meet_id_filter + , 1 AS does_meet_name_filter + FROM Dog_Name_Filter DOG_NAME_FILTER + ) DOG_COMBINED + GROUP BY DOG_COMBINED.id_dog + ) + SELECT + DOG.id_dog + , CASE WHEN + v_has_filter_dog_id = 0 + OR IFNULL(DOG_FILTERS.does_meet_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_dog_name = 0 + ) + OR IFNULL(DOG_FILTERS.does_meet_name_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + FROM demo.DOG_Dog DOG + LEFT JOIN Dog_Filters DOG_FILTERS ON DOG.id_dog = DOG_FILTERS.id_dog + LEFT JOIN demo.DOG_Dog_User_Link DOG_USER_LINK ON DOG.id_dog = DOG_USER_LINK.id_dog + LEFT JOIN tmp_Calc_User_Access_Calc_Dog t_USER ON DOG_USER_LINK.id_user = t_USER.id_user + WHERE + ( + a_get_all_dog = 1 + OR ( + v_has_filter_dog_id = 1 + AND DOG_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_dog_name = 1 + AND DOG_FILTERS.does_meet_name_filter = 1 + ) + ) + AND ( + v_is_super_user = 1 + OR t_USER.id_user IS NOT NULL + ) + AND ( + a_get_inactive_dog = 1 + OR DOG.active = 1 + ) + ; + END IF; + END IF; + + DELETE FROM tmp_Split_Id_Calc_Dog; + DELETE FROM tmp_Split_Name_Calc_Dog; - DELETE FROM tmp_Dog; + IF a_debug = 1 THEN + SELECT 'After get all dogs'; + SELECT * FROM tmp_Dog_Calc_Dog; + END IF; + + -- Filter records + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + DELETE t_DOG + FROM tmp_Dog_Calc_Dog t_DOG + LEFT JOIN demo.DOG_Dog_User_Link DOG_USER_LINK ON t_DOG.id_dog = DOG_USER_LINK.id_dog + LEFT JOIN tmp_Calc_User_Access_Calc_Dog t_USER ON DOG_USER_LINK.id_user = t_USER.id_user + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND ( + t_DOG.does_meet_id_filters = 0 + OR IFNULL(t_USER.does_meet_id_filters, 0) = 0 + ) + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND ( + t_DOG.does_meet_non_id_filters = 0 + OR IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 + ) + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND t_DOG.does_meet_id_filters = 0 + AND IFNULL(t_USER.does_meet_id_filters, 0) = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND t_DOG.does_meet_non_id_filters = 0 + AND IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 + ) + ; END IF; + IF a_debug = 1 THEN + SELECT 'After filter dogs'; + SELECT * FROM tmp_Dog_Calc_Dog; + END IF; + + + IF EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT * FROM tmp_Dog_Calc_Dog; + END IF; + + DELETE FROM tmp_Dog_Calc_Dog; + END IF; -- Outputs + -- Dogs + INSERT INTO demo.DOG_Dog_Temp ( + guid + , id_dog + , name + , appearance + , mass_kg + , notes + , active + + , does_meet_id_filters + , does_meet_non_id_filters + ) SELECT - t_DOG.id_dog - , t_DOG.name - , t_DOG.appearance - , t_DOG.mass_kg - , t_DOG.notes - , t_DOG.active + a_guid + , t_DOG.id_dog + , DOG.name + , DOG.appearance + , DOG.mass_kg + , DOG.notes + , DOG.active , t_DOG.does_meet_id_filters , t_DOG.does_meet_non_id_filters - FROM tmp_Dog t_DOG - ; - - -- Errors - SELECT - t_ERROR.id_error - , t_ERROR.id_type - , t_ERROR.code - , ERROR_TYPE.name - , ERROR_TYPE.description - , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_colour - , ERROR_TYPE.text_colour - , t_ERROR.msg - FROM tmp_Msg_Error t_ERROR - INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + FROM demo.DOG_Dog DOG + INNER JOIN tmp_Dog_Calc_Dog t_DOG ON DOG.id_dog = t_DOG.id_dog ; - IF a_debug = 1 AND v_can_view = 1 THEN - SELECT * FROM tmp_Dog; + -- Errors + IF a_show_errors = 1 THEN + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error_Calc_Dog t_ERROR + INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; END IF; - - CALL demo.p_dog_clear_calc_dog( - v_guid -- a_guid - , 0 -- a_debug - ); - DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + IF a_debug = 1 AND v_can_view = 1 THEN + SELECT * FROM tmp_Dog_Calc_Dog; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Dog; IF a_debug = 1 THEN CALL demo.p_core_debug_timing_reporting ( v_time_start ); @@ -342,32 +667,34 @@ END // DELIMITER ; -/* - -CALL demo.p_dog_get_many_dog ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user +CALL demo.p_dog_calc_dog ( + 'slips ' -- a_guid + , 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user , 1 -- a_get_all_dog , 0 -- a_get_inactive_dog , '' -- a_ids_dog , '' -- a_names_dog + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , '' -- a_names_user + , '' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_show_errors , 1 -- a_debug ); -CALL demo.p_dog_get_many_dog ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_dog - , 0 -- a_get_inactive_dog - , '' -- a_ids_dog - , 'pat' -- a_names_dog - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 1 -- a_require_any_non_id_search_filters_met - , 1 -- a_debug + + +SELECT * +FROM demo.DOG_Dog_Temp +; + +CALL demo.p_dog_clear_calc_dog ( + 'slips ' -- a_guid + , 1 -- debug ); -*/ \ No newline at end of file diff --git a/static/MySQL/31004_tri_DOG_Dog_User_Link.sql b/static/MySQL/31004_tri_DOG_Dog_User_Link.sql index b7c1009..ee03536 100644 --- a/static/MySQL/31004_tri_DOG_Dog_User_Link.sql +++ b/static/MySQL/31004_tri_DOG_Dog_User_Link.sql @@ -48,3 +48,4 @@ BEGIN ; END // DELIMITER ; + diff --git a/static/MySQL/71001_p_dog_calc_dog.sql b/static/MySQL/71001_p_dog_calc_dog.sql index b3ebad8..3d215e3 100644 --- a/static/MySQL/71001_p_dog_calc_dog.sql +++ b/static/MySQL/71001_p_dog_calc_dog.sql @@ -34,6 +34,7 @@ BEGIN DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; + DECLARE v_is_super_user BIT; DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION @@ -139,7 +140,25 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Dog; DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Dog; + CREATE TEMPORARY TABLE tmp_Calc_User_Access_Calc_Dog ( + id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL + , id_user INT + , id_role INT + , id_permission_required INT NOT NULL + , priority_access_level_required INT NOT NULL + , is_super_user BIT + , priority_access_level_user INT + , has_access BIT + , can_view BIT + , can_edit BIT + , can_admin BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT + ); + CREATE TEMPORARY TABLE tmp_Dog_Calc_Dog ( id_dog INT NOT NULL , does_meet_id_filters BIT NOT NULL @@ -168,6 +187,172 @@ BEGIN SET v_has_filter_dog_id = CASE WHEN a_ids_dog <> '' THEN 1 ELSE 0 END; SET v_has_filter_dog_name = CASE WHEN a_names_dog <> '' THEN 1 ELSE 0 END; + + + -- Permissions + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + SELECT + IFNULL(CALC_USER_T.has_access, 0) + , IFNULL(CALC_USER_T.is_super_user, 0) + INTO + v_can_view + , v_is_super_user + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.guid = a_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT + v_can_view + , v_is_super_user + ; + END IF; + + IF (v_can_view = 0) THEN + DELETE t_ME + FROM tmp_Msg_Error_Calc_Dog t_ME + WHERE t_ME.id_type <> v_id_type_error_no_permission + ; + INSERT INTO tmp_Msg_Error_Calc_Dog ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , 'You do not have permission to view Dog.' + ) + ; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access( + a_guid + , 0 -- a_debug + ); + + -- Users + IF a_debug = 1 THEN + SELECT + a_guid -- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid-- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ); + + INSERT INTO tmp_Calc_User_Access_Calc_Dog ( + id_user + , id_role + , id_permission_required + , priority_access_level_required + , is_super_user + , priority_access_level_user + , has_access + , can_view + , can_edit + , can_admin + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + CALC_USER_T.id_user + , CALC_USER_T.id_role + , CALC_USER_T.id_permission_required + , CALC_USER_T.priority_access_level_required + , CALC_USER_T.is_super_user + , CALC_USER_T.priority_access_level_user + , CALC_USER_T.has_access + , CALC_USER_T.can_view + , CALC_USER_T.can_edit + , CALC_USER_T.can_admin + , CALC_USER_T.does_meet_id_filters + , CALC_USER_T.does_meet_non_id_filters + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = a_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT 'After get many user'; + SELECT * FROM tmp_Calc_User_Access_Calc_Dog; + SELECT COUNT(*) AS Count_Errors FROM tmp_Msg_Error_Calc_Dog t_ERROR; + SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access( + a_guid + , 0 -- a_debug + ); + + -- Dogs IF v_has_filter_dog_id = 1 THEN CALL fetchmetrics.p_core_split(a_guid, a_ids_dog, ',', a_debug); @@ -337,6 +522,8 @@ BEGIN THEN 1 ELSE 0 END AS does_meet_non_id_filters FROM fetchmetrics.DOG_Dog DOG LEFT JOIN Dog_Filters DOG_FILTERS ON DOG.id_dog = DOG_FILTERS.id_dog + LEFT JOIN demo.DOG_Dog_User_Link DOG_USER_LINK ON DOG.id_dog = DOG_USER_LINK.id_dog + LEFT JOIN tmp_Calc_User_Access_Calc_Dog t_USER ON DOG_USER_LINK.id_user = t_USER.id_user WHERE ( a_get_all_dog = 1 @@ -349,6 +536,10 @@ BEGIN AND DOG_FILTERS.does_meet_name_filter = 1 ) ) + AND ( + v_is_super_user = 1 + OR t_USER.id_user IS NOT NULL + ) AND ( a_get_inactive_dog = 1 OR DOG.active = 1 @@ -369,22 +560,32 @@ BEGIN IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN DELETE t_DOG FROM tmp_Dog_Calc_Dog t_DOG + LEFT JOIN demo.DOG_Dog_User_Link DOG_USER_LINK ON t_DOG.id_dog = DOG_USER_LINK.id_dog + LEFT JOIN tmp_Calc_User_Access_Calc_Dog t_USER ON DOG_USER_LINK.id_user = t_USER.id_user WHERE ( a_require_all_id_search_filters_met = 1 - AND t_DOG.does_meet_id_filters = 0 + AND ( + t_DOG.does_meet_id_filters = 0 + OR IFNULL(t_USER.does_meet_id_filters, 0) = 0 + ) ) OR ( a_require_all_non_id_search_filters_met = 1 - AND t_DOG.does_meet_non_id_filters = 0 + AND ( + t_DOG.does_meet_non_id_filters = 0 + OR IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 + ) ) OR ( a_require_any_id_search_filters_met = 1 AND t_DOG.does_meet_id_filters = 0 + AND IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) OR ( a_require_any_non_id_search_filters_met = 1 AND t_DOG.does_meet_non_id_filters = 0 + AND IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ; END IF; @@ -394,80 +595,6 @@ BEGIN SELECT * FROM tmp_Dog_Calc_Dog; END IF; - -- Permissions - IF a_debug = 1 THEN - SELECT - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ; - END IF; - - CALL fetchmetrics.p_dog_calc_user_access( - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ); - - SELECT - IFNULL(CALC_USER_T.has_access, 0) - INTO - v_can_view - FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T - WHERE CALC_USER_T.guid = a_guid - LIMIT 1 - ; - - IF a_debug = 1 THEN - SELECT v_can_view; - END IF; - - IF (v_can_view = 0) THEN - DELETE t_ME - FROM tmp_Msg_Error_Calc_Dog t_ME - WHERE t_ME.id_type <> v_id_type_error_no_permission - ; - INSERT INTO tmp_Msg_Error_Calc_Dog ( - id_type - , code - , msg - ) - VALUES ( - v_id_type_error_no_permission - , v_code_type_error_no_permission - , 'You do not have permission to view Dog.' - ) - ; - END IF; - - CALL fetchmetrics.p_dog_clear_calc_user_access( - a_guid - , 0 -- a_debug - ); IF EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Dog t_ERROR INNER JOIN fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN @@ -531,6 +658,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Dog; DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Calc_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Dog; IF a_debug = 1 THEN CALL fetchmetrics.p_core_debug_timing_reporting ( v_time_start ); @@ -549,6 +677,11 @@ CALL fetchmetrics.p_dog_calc_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , '' -- a_names_dog + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , '' -- a_names_user + , '' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met @@ -565,6 +698,11 @@ CALL fetchmetrics.p_dog_calc_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , 'pat' -- a_names_dog + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , 'pat' -- a_names_user + , 'pat' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met diff --git a/static/MySQL/71001_p_dog_get_many_dog.sql b/static/MySQL/71001_p_dog_get_many_dog.sql index 26c1fae..0994df0 100644 --- a/static/MySQL/71001_p_dog_get_many_dog.sql +++ b/static/MySQL/71001_p_dog_get_many_dog.sql @@ -10,6 +10,11 @@ CREATE PROCEDURE fetchmetrics.p_dog_get_many_dog ( , IN a_get_inactive_dog BIT , IN a_ids_dog TEXT , IN a_names_dog TEXT + , IN a_get_all_user BIT + , IN a_get_inactive_user BIT + , IN a_ids_user TEXT + , IN a_names_user TEXT + , IN a_emails_user TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -104,6 +109,11 @@ BEGIN , a_get_inactive_dog , a_ids_dog , a_names_dog + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -230,6 +240,11 @@ BEGIN , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -246,6 +261,11 @@ BEGIN , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -350,6 +370,11 @@ CALL fetchmetrics.p_dog_get_many_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , '' -- a_names_dog + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , '' -- a_names_user + , '' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met @@ -363,6 +388,11 @@ CALL demo.p_dog_get_many_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , 'pat' -- a_names_dog + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , 'pat' -- a_names_user + , 'pat' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met diff --git a/static/MySQL/71104_p_dog_calc_command.sql b/static/MySQL/71104_p_dog_calc_command.sql index 7c03fb7..81df099 100644 --- a/static/MySQL/71104_p_dog_calc_command.sql +++ b/static/MySQL/71104_p_dog_calc_command.sql @@ -17,6 +17,11 @@ CREATE PROCEDURE fetchmetrics.p_dog_calc_command ( , IN a_names_command TEXT , IN a_hand_signal_default_descriptions_command TEXT , IN a_notes_command TEXT + , IN a_get_all_user BIT + , IN a_get_inactive_user BIT + , IN a_ids_user TEXT + , IN a_names_user TEXT + , IN a_emails_user TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -36,9 +41,10 @@ BEGIN DECLARE v_has_filter_command_notes BIT; DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; - DECLARE v_id_permission_dog_view INT; + DECLARE v_id_permission_command_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; + DECLARE v_is_super_user BIT; DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION @@ -93,7 +99,7 @@ BEGIN SET v_code_type_error_no_permission := 'NO_PERMISSION'; SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); SET v_id_type_error_no_permission := (SELECT ERROR_TYPE.id_type FROM fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1); - SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM fetchmetrics.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1); + SET v_id_permission_command_view := (SELECT PERMISSION.id_permission FROM fetchmetrics.DOG_Permission PERMISSION WHERE PERMISSION.code = 'COMMAND_VIEW' LIMIT 1); SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); @@ -131,6 +137,11 @@ BEGIN , a_names_command , a_hand_signal_default_descriptions_command , a_notes_command + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -154,6 +165,24 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Command; + + CREATE TEMPORARY TABLE tmp_Calc_User_Access_Calc_Command ( + id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL + , id_user INT + , id_role INT + , id_permission_required INT NOT NULL + , priority_access_level_required INT NOT NULL + , is_super_user BIT + , priority_access_level_user INT + , has_access BIT + , can_view BIT + , can_edit BIT + , can_admin BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT + ); CREATE TEMPORARY TABLE tmp_Command_Category_Calc_Command ( id_command_category INT NOT NULL @@ -207,6 +236,169 @@ BEGIN SET v_has_filter_command_hand_signal_default_description = CASE WHEN a_hand_signal_default_descriptions_command <> '' THEN 1 ELSE 0 END; SET v_has_filter_command_notes = CASE WHEN a_notes_command <> '' THEN 1 ELSE 0 END; + + -- Permissions + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + SELECT + IFNULL(CALC_USER_T.has_access, 0) + , IFNULL(CALC_USER_T.is_super_user, 0) + INTO + v_can_view + , v_is_super_user + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = a_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT + v_can_view + , v_is_super_user + ; + END IF; + + IF (v_can_view = 0) THEN + DELETE t_ME + FROM tmp_Msg_Error_Calc_Command t_ME + WHERE t_ME.id_type <> v_id_type_error_no_permission + ; + INSERT INTO tmp_Msg_Error_Calc_Command ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , 'You do not have permission to view Dogs and Commands.' + ) + ; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access( + a_guid + , 0 -- a_debug + ); + + + -- Users + IF a_debug = 1 THEN + SELECT + a_guid -- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ); + + INSERT INTO tmp_Calc_User_Access_Calc_Command ( + id_user + , id_role + , id_permission_required + , priority_access_level_required + , is_super_user + , priority_access_level_user + , has_access + , can_view + , can_edit + , can_admin + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + CALC_USER_T.id_user + , CALC_USER_T.id_role + , CALC_USER_T.id_permission_required + , CALC_USER_T.priority_access_level_required + , CALC_USER_T.is_super_user + , CALC_USER_T.priority_access_level_user + , CALC_USER_T.has_access + , CALC_USER_T.can_view + , CALC_USER_T.can_edit + , CALC_USER_T.can_admin + , CALC_USER_T.does_meet_id_filters + , CALC_USER_T.does_meet_non_id_filters + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = v_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Calc_User_Access_Calc_Command; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access ( + a_guid + , 0 -- a_debug + ); + + -- Command Categories IF v_has_filter_command_category_id = 1 THEN CALL fetchmetrics.p_core_split(a_guid, a_ids_command_category, ',', a_debug); @@ -339,6 +531,8 @@ BEGIN THEN 1 ELSE 0 END AS does_meet_non_id_filters FROM fetchmetrics.DOG_Command_Category COMMAND_CATEGORY LEFT JOIN Command_Category_Filters COMMAND_CATEGORY_FILTERS ON COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_FILTERS.id_command_category + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON COMMAND_CATEGORY_USER_LINK.id_user = t_USER.id_user WHERE ( a_get_all_command_category = 1 @@ -351,6 +545,10 @@ BEGIN AND COMMAND_CATEGORY_FILTERS.does_meet_name_filter = 1 ) ) + AND ( + v_is_super_user = 1 + OR t_USER.id_user IS NOT NULL + ) AND ( a_get_inactive_command_category = 1 OR COMMAND_CATEGORY.active = 1 @@ -578,6 +776,8 @@ BEGIN FROM fetchmetrics.DOG_Command COMMAND INNER JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category LEFT JOIN Command_Filters COMMAND_FILTERS ON COMMAND.id_command = COMMAND_FILTERS.id_command + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON t_COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON COMMAND_CATEGORY_USER_LINK.id_user = t_USER.id_user WHERE ( a_get_all_command = 1 @@ -598,6 +798,10 @@ BEGIN AND COMMAND_FILTERS.does_meet_notes_filter = 1 ) ) + AND ( + v_is_super_user = 1 + OR t_USER.id_user IS NOT NULL + ) AND ( a_get_inactive_command = 1 OR COMMAND.active = 1 @@ -704,6 +908,8 @@ BEGIN FROM fetchmetrics.DOG_Command COMMAND INNER JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category LEFT JOIN Command_Filters COMMAND_FILTERS ON COMMAND.id_command = COMMAND_FILTERS.id_command + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON t_COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON COMMAND_CATEGORY_USER_LINK.id_user = t_USER.id_user WHERE ( a_get_all_command = 1 @@ -724,6 +930,10 @@ BEGIN AND COMMAND_FILTERS.does_meet_notes_filter = 1 ) ) + AND ( + v_is_super_user = 1 + OR t_USER.id_user IS NOT NULL + ) AND ( a_get_inactive_command = 1 OR COMMAND.active = 1 @@ -772,12 +982,15 @@ BEGIN DELETE t_COMMAND FROM tmp_Command_Calc_Command t_COMMAND LEFT JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON t_COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON DOG_USER_LINK.id_user = t_USER.id_user WHERE ( a_require_all_id_search_filters_met = 1 AND ( t_COMMAND.does_meet_id_filters = 0 OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + OR IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) ) OR ( @@ -785,17 +998,20 @@ BEGIN AND ( t_COMMAND.does_meet_non_id_filters = 0 OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + OR IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ) OR ( a_require_any_id_search_filters_met = 1 AND t_COMMAND.does_meet_id_filters = 0 AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + AND IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) OR ( a_require_any_non_id_search_filters_met = 1 AND t_COMMAND.does_meet_non_id_filters = 0 AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + AND IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ; @@ -812,30 +1028,36 @@ BEGIN SELECT * FROM tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY LEFT JOIN Category_And_Best_Command CATEGORY_BEST ON t_COMMAND_CATEGORY.id_command_category = CATEGORY_BEST.id_command_category + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON t_COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON DOG_USER_LINK.id_user = t_USER.id_user WHERE ( a_require_all_id_search_filters_met = 1 AND ( - CATEGORY_BEST.does_meet_id_filters = 0 + IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + OR IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) ) OR ( a_require_all_non_id_search_filters_met = 1 AND ( - CATEGORY_BEST.does_meet_non_id_filters = 0 + IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + OR IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ) OR ( a_require_any_id_search_filters_met = 1 - AND CATEGORY_BEST.does_meet_id_filters = 0 + AND IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + AND IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) OR ( a_require_any_non_id_search_filters_met = 1 - AND CATEGORY_BEST.does_meet_non_id_filters = 0 + AND IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + AND IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ; END IF; @@ -852,12 +1074,15 @@ BEGIN DELETE t_COMMAND_CATEGORY FROM tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY LEFT JOIN Category_And_Best_Command CATEGORY_BEST ON t_COMMAND_CATEGORY.id_command_category = CATEGORY_BEST.id_command_category + LEFT JOIN demo.DOG_Command_Category_User_Link COMMAND_CATEGORY_USER_LINK ON t_COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_USER_LINK.id_command_category + LEFT JOIN tmp_Calc_User_Access_Calc_Command t_USER ON DOG_USER_LINK.id_user = t_USER.id_user WHERE ( a_require_all_id_search_filters_met = 1 AND ( IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + OR IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) ) OR ( @@ -865,103 +1090,30 @@ BEGIN AND ( IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + OR IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ) OR ( a_require_any_id_search_filters_met = 1 AND IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + AND IFNULL(t_USER.does_meet_id_filters, 0) = 0 ) OR ( a_require_any_non_id_search_filters_met = 1 AND IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + AND IFNULL(t_USER.does_meet_non_id_filters, 0) = 0 ) ; END IF; IF a_debug = 1 THEN SELECT 'After filter Commands and Categories'; - SELECT * FROM tmp_Command_Category_Calc_Command; - SELECT * FROM tmp_Command_Calc_Command; + -- SELECT * FROM tmp_Command_Category_Calc_Command; + -- SELECT * FROM tmp_Command_Calc_Command; END IF; - - -- Permissions - IF a_debug = 1 THEN - SELECT - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ; - END IF; - - CALL fetchmetrics.p_dog_calc_user_access( - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ); - - SELECT - IFNULL(CALC_USER_T.has_access, 0) - INTO - v_can_view - FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T - WHERE CALC_USER_T.GUID = a_guid - LIMIT 1 - ; - - IF a_debug = 1 THEN - SELECT v_can_view; - END IF; - - IF (v_can_view = 0) THEN - DELETE t_ME - FROM tmp_Msg_Error_Calc_Command t_ME - WHERE t_ME.id_type <> v_id_type_error_no_permission - ; - INSERT INTO tmp_Msg_Error_Calc_Command ( - id_type - , code - , msg - ) - VALUES ( - v_id_type_error_no_permission - , v_code_type_error_no_permission - , 'You do not have permission to view Dogs and Commands.' - ) - ; - END IF; - - CALL fetchmetrics.p_dog_clear_calc_user_access( - a_guid - , 0 -- a_debug - ); - IF a_debug = 1 THEN SELECT 'Before non-permitted data deletion'; SELECT * FROM tmp_Command_Category_Calc_Command; @@ -1069,6 +1221,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Command; IF a_debug = 1 THEN CALL fetchmetrics.p_core_debug_timing_reporting ( v_time_start ); diff --git a/static/MySQL/71104_p_dog_get_many_command.sql b/static/MySQL/71104_p_dog_get_many_command.sql index 41dbde6..6f0072f 100644 --- a/static/MySQL/71104_p_dog_get_many_command.sql +++ b/static/MySQL/71104_p_dog_get_many_command.sql @@ -16,6 +16,11 @@ CREATE PROCEDURE fetchmetrics.p_dog_get_many_command ( , IN a_names_command TEXT , IN a_hand_signal_default_descriptions_command TEXT , IN a_notes_command TEXT + , IN a_get_all_user BIT + , IN a_get_inactive_user BIT + , IN a_ids_user TEXT + , IN a_names_user TEXT + , IN a_emails_user TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -126,6 +131,11 @@ BEGIN , a_names_command , a_hand_signal_default_descriptions_command , a_notes_command + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -272,6 +282,11 @@ BEGIN , a_names_command -- a_names_command , a_hand_signal_default_descriptions_command -- a_hand_signal_default_descriptions_command , a_notes_command -- a_notes_command + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -294,6 +309,11 @@ BEGIN , a_names_command -- a_names_command , a_hand_signal_default_descriptions_command -- a_hand_signal_default_descriptions_command , a_notes_command -- a_notes_command + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -463,6 +483,11 @@ CALL fetchmetrics.p_dog_get_many_command ( , '' -- a_names_command , '' -- a_hand_signal_default_descriptions_command , '' -- a_notes_command + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , '' -- a_names_user + , '' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met @@ -485,6 +510,11 @@ CALL demo.p_dog_get_many_command ( , 'pat,point' -- a_names_command , 'pat,point' -- a_hand_signal_default_descriptions_command , 'pat,point' -- a_notes_command + , 1 -- a_get_all_user + , 0 -- a_get_inactive_user + , '' -- a_ids_user + , 'pat,point' -- a_names_user + , 'pat,point' -- a_emails_user , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met diff --git a/static/MySQL/71200_p_dog_calc_location.sql b/static/MySQL/71200_p_dog_calc_location.sql index 75a3a89..9108cf4 100644 --- a/static/MySQL/71200_p_dog_calc_location.sql +++ b/static/MySQL/71200_p_dog_calc_location.sql @@ -11,6 +11,11 @@ CREATE PROCEDURE fetchmetrics.p_dog_calc_location ( , IN a_get_inactive_location BIT , IN a_ids_location TEXT , IN a_names_location TEXT + , IN a_get_all_user BIT + , IN a_get_inactive_user BIT + , IN a_ids_user TEXT + , IN a_names_user TEXT + , IN a_emails_user TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -26,9 +31,10 @@ BEGIN DECLARE v_has_filter_location_name BIT; DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; - DECLARE v_id_permission_dog_view INT; + DECLARE v_id_permission_command_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; + DECLARE v_is_super_user BIT; DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION @@ -83,7 +89,7 @@ BEGIN SET v_code_type_error_no_permission := 'NO_PERMISSION'; SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); SET v_id_type_error_no_permission := (SELECT ERROR_TYPE.id_type FROM fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1); - SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM fetchmetrics.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1); + SET v_id_permission_command_view := (SELECT PERMISSION.id_permission FROM fetchmetrics.DOG_Permission PERMISSION WHERE PERMISSION.code = 'COMMAND_VIEW' LIMIT 1); SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); @@ -109,6 +115,11 @@ BEGIN , a_get_inactive_location , a_ids_location , a_names_location + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_names_user + , a_emails_user , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -120,7 +131,7 @@ BEGIN SELECT v_id_type_error_bad_data , v_id_type_error_no_permission - , v_id_permission_dog_view + , v_id_permission_command_view , v_time_start ; END IF; @@ -130,6 +141,24 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Location; -- DROP TEMPORARY TABLE IF EXISTS tmp_Location_Link_Calc_Location; DROP TEMPORARY TABLE IF EXISTS tmp_Location_Calc_Location; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Location; + + CREATE TEMPORARY TABLE tmp_Calc_User_Access_Calc_Location ( + id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL + , id_user INT + , id_role INT + , id_permission_required INT NOT NULL + , priority_access_level_required INT NOT NULL + , is_super_user BIT + , priority_access_level_user INT + , has_access BIT + , can_view BIT + , can_edit BIT + , can_admin BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT + ); CREATE TEMPORARY TABLE tmp_Location_Calc_Location ( id_location INT NOT NULL @@ -171,6 +200,163 @@ BEGIN SET v_has_filter_location_id = CASE WHEN a_ids_location <> '' THEN 1 ELSE 0 END; SET v_has_filter_location_name = CASE WHEN a_names_location <> '' THEN 1 ELSE 0 END; + + -- Permissions + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + SELECT + IFNULL(CALC_USER_T.has_access, 0) + INTO + v_can_view + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = a_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT v_can_view; + END IF; + + IF (v_can_view = 0) THEN + DELETE t_ME + FROM tmp_Msg_Error_Calc_Location t_ME + WHERE t_ME.id_type <> v_id_type_error_no_permission + ; + INSERT INTO tmp_Msg_Error_Calc_Location ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , 'You do not have permission to view Dogs and Locations.' + ) + ; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access( + a_guid + , 0 -- a_debug + ); + + + -- Users + IF a_debug = 1 THEN + SELECT + a_guid -- guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ; + END IF; + + CALL fetchmetrics.p_dog_calc_user_access( + a_guid -- a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_ids_user -- ids_user + , '' -- a_auth0_ids_user + , a_names_user -- a_names_user + , a_emails_user -- a_emails_user + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug + ); + + INSERT INTO tmp_Calc_User_Access_Calc_Command ( + id_user + , id_role + , id_permission_required + , priority_access_level_required + , is_super_user + , priority_access_level_user + , has_access + , can_view + , can_edit + , can_admin + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + CALC_USER_T.id_user + , CALC_USER_T.id_role + , CALC_USER_T.id_permission_required + , CALC_USER_T.priority_access_level_required + , CALC_USER_T.is_super_user + , CALC_USER_T.priority_access_level_user + , CALC_USER_T.has_access + , CALC_USER_T.can_view + , CALC_USER_T.can_edit + , CALC_USER_T.can_admin + , CALC_USER_T.does_meet_id_filters + , CALC_USER_T.does_meet_non_id_filters + FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = v_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Calc_User_Access_Calc_Command; + END IF; + + CALL fetchmetrics.p_dog_clear_calc_user_access ( + a_guid + , 0 -- a_debug + ); + -- Locations IF v_has_filter_location_id = 1 THEN CALL fetchmetrics.p_core_split(a_guid, a_ids_location, ',', a_debug); @@ -459,81 +645,6 @@ BEGIN */ - -- Permissions - IF a_debug = 1 THEN - SELECT - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ; - END IF; - - CALL fetchmetrics.p_dog_calc_user_access( - a_guid -- a_guid - , 0 -- get_all_user - , 0 -- get_inactive_user - , a_id_user -- ids_user - , '' -- a_auth0_ids_user - , '' -- a_names_user - , '' -- a_emails_user - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 0 -- a_require_any_non_id_search_filters_met - , v_id_permission_dog_view -- ids_permission - , v_id_access_level_view -- ids_access_level - , 0 -- a_show_errors - , 0 -- a_debug - ); - - SELECT - IFNULL(CALC_USER_T.has_access, 0) - INTO - v_can_view - FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T - WHERE CALC_USER_T.GUID = a_guid - LIMIT 1 - ; - - IF a_debug = 1 THEN - SELECT v_can_view; - END IF; - - IF (v_can_view = 0) THEN - DELETE t_ME - FROM tmp_Msg_Error_Calc_Location t_ME - WHERE t_ME.id_type <> v_id_type_error_no_permission - ; - INSERT INTO tmp_Msg_Error_Calc_Location ( - id_type - , code - , msg - ) - VALUES ( - v_id_type_error_no_permission - , v_code_type_error_no_permission - , 'You do not have permission to view Dogs and Locations.' - ) - ; - END IF; - - CALL fetchmetrics.p_dog_clear_calc_user_access( - a_guid - , 0 -- a_debug - ); - IF a_debug = 1 THEN SELECT 'Before non-permitted data deletion'; SELECT * FROM tmp_Location_Calc_Location; @@ -612,6 +723,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Location; -- DROP TEMPORARY TABLE IF EXISTS tmp_Location_Link_Calc_Location; DROP TEMPORARY TABLE IF EXISTS tmp_Location_Calc_Location; + DROP TEMPORARY TABLE IF EXISTS tmp_Calc_User_Access_Calc_Location; IF a_debug = 1 THEN CALL fetchmetrics.p_core_debug_timing_reporting ( v_time_start ); diff --git a/static/MySQL/90000_populate.sql b/static/MySQL/90000_populate.sql index 6cc8465..e9d4835 100644 --- a/static/MySQL/90000_populate.sql +++ b/static/MySQL/90000_populate.sql @@ -856,6 +856,24 @@ VALUES ) ; +-- Dog User Link +INSERT INTO fetchmetrics.DOG_Dog_User_Link ( + id_dog + , id_user + , id_access_level + , active +) +SELECT + DOG.id_dog + , USERS.id_user + , ROLE_PERMISSION_LINK.id_access_level + , 1 +FROM fetchmetrics.DOG_User USERS +INNER JOIN fetchmetrics.DOG_User_Role_Link USER_ROLE_LINK ON USERS.id_user = USER_ROLE_LINK.id_user +INNER JOIN fetchmetrics.DOG_Role_Permission_Link ROLE_PERMISSION_LINK ON USER_ROLE_LINK.id_role = ROLE_PERMISSION_LINK.id_role +CROSS JOIN fetchmetrics.DOG_Dog DOG +; + INSERT INTO fetchmetrics.DOG_Breed ( code , name diff --git a/static/docs/fetch-metrics-social-media-post-template.xcf b/static/docs/fetch-metrics-social-media-post-template.xcf new file mode 100644 index 0000000..008542e Binary files /dev/null and b/static/docs/fetch-metrics-social-media-post-template.xcf differ diff --git a/static/images/stick-man-walking-up-stairs.png b/static/images/stick-man-walking-up-stairs.png new file mode 100644 index 0000000..e72890c Binary files /dev/null and b/static/images/stick-man-walking-up-stairs.png differ diff --git a/templates/pages/blog/_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.html b/templates/pages/blog/_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.html index 9b3498d..671b438 100644 --- a/templates/pages/blog/_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.html +++ b/templates/pages/blog/_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.html @@ -171,7 +171,7 @@

Real-World Implementation Success

-

James Patterson, a certified canine behaviourist in Birmingham, implemented Fetch Metrics six months ago:

+

James, a certified canine behaviourist in Warwickshire, implemented Fetch Metrics six months ago:

"Before Fetch Metrics, I was spending 2-3 hours per week just answering client questions about techniques. The command dictionary has eliminated 90% of those calls. More importantly, my dogs are achieving their training goals 3 weeks faster on average because owners can practice correctly at home." diff --git a/todo.txt b/todo.txt index 2bd532c..20681bc 100644 --- a/todo.txt +++ b/todo.txt @@ -6,6 +6,7 @@ Fix: - Dogs missing from Assessments table? - DB field id_user_created_by must not be null - User section - either separate or merge into dog section +- Blog - article tags, categories Features: