USE fetchmetrics; -- Clear previous proc DROP PROCEDURE IF EXISTS fetchmetrics.p_dog_get_many_user; DELIMITER // CREATE PROCEDURE fetchmetrics.p_dog_get_many_user ( IN a_id_user INT , IN a_auth0_id_user VARCHAR(200) , IN a_get_all_user BIT , IN a_get_inactive_user BIT , IN a_ids_user TEXT , IN a_auth0_ids_user TEXT , IN a_names_user TEXT , IN a_emails_user TEXT , IN a_get_all_company BIT , IN a_get_inactive_company BIT , IN a_ids_company 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_debug BIT ) BEGIN DECLARE v_code_type_error_bad_data VARCHAR(50); DECLARE v_guid BINARY(36); DECLARE v_has_filter_user_auth0_id BIT; DECLARE v_has_filter_user_id BIT; DECLARE v_has_filter_user_name BIT; DECLARE v_id_access_level_admin INT; DECLARE v_id_access_level_view INT; DECLARE v_id_permission_dog_admin INT; DECLARE v_id_permission_user INT; DECLARE v_id_permission_user_admin INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_ids_user TEXT; DECLARE v_is_new BIT; DECLARE v_is_super_user BIT; DECLARE v_priority_access_level_edit INT; DECLARE v_priority_access_level_none INT; DECLARE v_priority_access_level_user_view_user INT; DECLARE v_rank_max INT; DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE , @errno = MYSQL_ERRNO , @text = MESSAGE_TEXT ; ROLLBACK; CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( 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 ( id_type , code , msg ) SELECT MET.id_type , @errno , @text FROM fetchmetrics.CORE_Msg_Error_Type MET WHERE MET.code = 'MYSQL_ERROR' ; 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 fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; DROP TABLE IF EXISTS tmp_Msg_Error; END; SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); SET v_id_access_level_admin := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE code = 'ADMIN' LIMIT 1); SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE code = 'VIEW' LIMIT 1); SET v_priority_access_level_edit := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE code = 'EDIT' LIMIT 1); SET v_priority_access_level_none := (SELECT ACCESS_LEVEL.id_access_level FROM fetchmetrics.DOG_Access_Level ACCESS_LEVEL WHERE code = 'NONE' LIMIT 1); SET v_id_permission_dog_admin := (SELECT id_permission FROM fetchmetrics.DOG_Permission WHERE code = 'DOG_ADMIN' LIMIT 1); SET v_id_permission_user := (SELECT id_permission FROM fetchmetrics.DOG_Permission WHERE code = 'USER_VIEW' LIMIT 1); SET v_id_permission_user_admin := (SELECT id_permission FROM fetchmetrics.DOG_Permission WHERE code = 'USER_ADMIN' LIMIT 1); SET v_code_type_error_bad_data := 'BAD_DATA'; SET v_id_type_error_bad_data := (SELECT id_type FROM fetchmetrics.CORE_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); SET v_is_new := FALSE; SET a_get_all_user := IFNULL(a_get_all_user, 1); SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0); SET a_ids_user := TRIM(IFNULL(a_ids_user, '')); SET a_auth0_ids_user := TRIM(IFNULL(a_auth0_ids_user, '')); SET a_names_user := TRIM(IFNULL(a_names_user, '')); SET a_emails_user := TRIM(IFNULL(a_emails_user, '')); 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_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN SELECT a_id_user , a_auth0_id_user , a_get_all_user , a_get_inactive_user , a_ids_user , a_auth0_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_debug ; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_User_Access; DROP TEMPORARY TABLE IF EXISTS tmp_User; DROP TEMPORARY TABLE IF EXISTS tmp_Company; CREATE TEMPORARY TABLE tmp_Company ( id_company INT NOT NULL , name VARCHAR(250) NOT NULL , website VARCHAR(1000) , active BIT NOT NULL , does_meet_id_filters BIT NOT NULL , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE tmp_User ( id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL , id_user INT , id_company 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 , can_admin_dog BIT , can_admin_user BIT ); CREATE TEMPORARY TABLE tmp_User_Access ( id_temp INT PRIMARY KEY AUTO_INCREMENT NOT NULL , id_user 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 ); CREATE TEMPORARY TABLE tmp_Msg_Error ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NOT NULL , code VARCHAR(250) NOT NULL , msg TEXT NOT NULL ); -- Permissions -- Can View IF NOT EXISTS (SELECT * FROM tmp_Msg_Error 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 SELECT v_guid -- guid , 0 -- get_all_user , 0 -- get_inactive_user , a_id_user -- ids_user , a_auth0_id_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_user -- ids_permission , v_id_access_level_view -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ; SELECT * FROM fetchmetrics.DOG_Calc_User_Access_Temp CUA_T WHERE CUA_T.GUID = v_guid; END IF; CALL fetchmetrics.p_dog_calc_user_access( v_guid -- guid , 0 -- get_all_user , 0 -- get_inactive_user , a_id_user -- ids_user , a_auth0_id_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_user -- ids_permission , v_id_access_level_view -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ); INSERT INTO tmp_User_Access ( id_user , id_permission_required , priority_access_level_required , is_super_user , priority_access_level_user , has_access , can_view , can_edit , can_admin ) SELECT CALC_USER_T.id_user , 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 FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T WHERE CALC_USER_T.guid = v_guid ; IF a_debug = 1 THEN SELECT * FROM tmp_User_Access; END IF; IF NOT EXISTS (SELECT * FROM tmp_User_Access t_USER_ACCESS WHERE t_USER_ACCESS.has_access = 1) THEN INSERT INTO tmp_Msg_Error ( id_type , code , msg ) VALUES ( v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT( 'You do not have view permissions for ' , (SELECT PERMISSION.name FROM fetchmetrics.DOG_Permission PERMISSION WHERE PERMISSION.id_permission = v_id_permission_user LIMIT 1) ) ) ; END IF; CALL fetchmetrics.p_dog_clear_calc_user_access( v_guid, FALSE ); END IF; SELECT IFNULL(t_USER_ACCESS.is_super_user, 0) AS v_is_super_user , IFNULL(t_USER_ACCESS.id_user, a_id_user) AS a_id_user , IFNULL(t_USER_ACCESS.priority_access_level_user, v_priority_access_level_none) AS v_priority_access_level_user_view_user INTO v_is_super_user , a_id_user , v_priority_access_level_user_view_user FROM tmp_User_Access t_USER_ACCESS LIMIT 1 ; IF a_debug = 1 THEN SELECT v_is_super_user AS v_is_super_user , a_id_user AS a_id_user , v_priority_access_level_user_view_user AS v_priority_access_level_user_view_user ; END IF; -- Companies IF NOT EXISTS(SELECT * FROM tmp_Msg_Error 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 SELECT v_guid -- v_guid , a_id_user -- a_id_user , a_get_all_company -- a_get_all_company , a_get_inactive_company -- a_get_inactive_company , a_ids_company -- a_ids_company , NULL -- a_names_company , NULL -- a_websites_company , 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 , 0 -- a_show_errors , 0 -- a_debug ; END IF; CALL fetchmetrics.p_dog_calc_company ( v_guid -- v_guid , a_id_user -- a_id_user , a_get_all_company -- a_get_all_company , a_get_inactive_company -- a_get_inactive_company , a_ids_company -- a_ids_company , NULL -- a_names_company , NULL -- a_websites_company , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , 0 -- a_require_any_id_search_filters_met -- 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 -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ); INSERT INTO tmp_Company ( id_company , name , website , active , does_meet_id_filters , does_meet_non_id_filters ) SELECT COMPANY_T.id_company , COMPANY_T.name , COMPANY_T.website , COMPANY_T.active , COMPANY_T.does_meet_id_filters , COMPANY_T.does_meet_non_id_filters FROM fetchmetrics.DOG_Company_Temp COMPANY_T WHERE COMPANY_T.GUID = v_guid ; IF a_debug = 1 THEN SELECT 'After get permissions user companies'; SELECT * FROM tmp_Company; END IF; END IF; -- Calculated fields -- Can admin dog IF NOT EXISTS (SELECT * FROM tmp_Msg_Error 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 SELECT v_guid -- guid , a_get_all_user -- get_all_user , a_get_inactive_user -- get_inactive_user , a_ids_user -- ids_user , a_auth0_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 , 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 , v_id_permission_dog_admin -- ids_permission , v_id_access_level_admin -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ; SELECT * FROM fetchmetrics.DOG_Calc_User_Access_Temp; END IF; CALL fetchmetrics.p_dog_calc_user_access( v_guid -- guid , a_get_all_user -- get_all_user , a_get_inactive_user -- get_inactive_user , a_ids_user -- ids_user , a_auth0_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 , 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 , v_id_permission_dog_admin -- ids_permission , v_id_access_level_admin -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ); INSERT INTO tmp_User ( id_user , id_role , id_company , id_permission_required , priority_access_level_required , is_super_user , priority_access_level_user , has_access , can_view , can_edit , can_admin , can_admin_dog ) WITH Can_Access_User AS ( SELECT USER.id_user , t_COMPANY.id_company , ROW_NUMBER() OVER (PARTITION BY USER.id_user ORDER BY CASE WHEN t_COMPANY.id_company IS NOT NULL THEN 1 ELSE 0 END DESC) AS index_user_company_link_in_user FROM fetchmetrics.DOG_User USER LEFT JOIN fetchmetrics.DOG_User_Company_Link USER_COMPANY_LINK ON USER.id_user = USER_COMPANY_LINK.id_user AND ( ( a_get_inactive_company = 1 AND a_get_inactive_user = 1 ) OR USER_COMPANY_LINK.active = 1 ) LEFT JOIN tmp_Company t_COMPANY ON USER_COMPANY_LINK.id_company = t_COMPANY.id_company AND ( a_get_inactive_company = 1 OR USER_COMPANY_LINK.active = 1 ) ) SELECT CALC_USER_T.id_user , CALC_USER_T.id_role , CAN_ACCESS_USER.id_company , 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.can_admin AS can_admin_dog FROM fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T /* LEFT JOIN fetchmetrics.DOG_User_Company_Link USER_COMPANY_LINK ON CALC_USER_T.id_user = USER_COMPANY_LINK.id_user LEFT JOIN tmp_Company t_COMPANY ON USER_COMPANY_LINK.id_company = t_COMPANY.id_company */ INNER JOIN Can_Access_User CAN_ACCESS_USER ON CALC_USER_T.id_user = CAN_ACCESS_USER.id_user WHERE CALC_USER_T.guid = v_guid AND ( v_is_super_user = 1 OR ( v_priority_access_level_user_view_user <= v_priority_access_level_edit AND CAN_ACCESS_USER.id_company IS NOT NULL AND CAN_ACCESS_USER.index_user_company_link_in_user = 1 ) OR CALC_USER_T.id_user = a_id_user ) ; IF a_debug = 1 THEN SELECT 'After get many user'; SELECT * FROM tmp_User; END IF; CALL fetchmetrics.p_dog_clear_calc_user_access( v_guid, FALSE ); END IF; -- Can admin user IF NOT EXISTS (SELECT * FROM tmp_Msg_Error 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 SELECT v_guid -- guid , a_get_all_user -- get_all_user , a_get_inactive_user -- get_inactive_user , a_ids_user -- ids_user , a_auth0_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 , 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 , v_id_permission_user_admin -- ids_permission , v_id_access_level_admin -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ; SELECT * FROM fetchmetrics.DOG_Calc_User_Access_Temp; END IF; CALL fetchmetrics.p_dog_calc_user_access( v_guid -- guid , a_get_all_user -- get_all_user , a_get_inactive_user -- get_inactive_user , a_ids_user -- ids_user , a_auth0_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 , 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 , v_id_permission_user_admin -- ids_permission , v_id_access_level_admin -- ids_access_level , 0 -- a_show_errors , 0 -- a_debug ); UPDATE tmp_User t_USER INNER JOIN fetchmetrics.DOG_Calc_User_Access_Temp CALC_USER_T ON CALC_USER_T.id_user = t_USER.id_user AND CALC_USER_T.guid = v_guid LEFT JOIN tmp_Company t_COMPANY ON t_USER.id_company = t_COMPANY.id_company SET t_USER.can_admin_user = CALC_USER_T.can_admin WHERE v_is_super_user = 1 OR t_COMPANY.id_company IS NOT NULL ; IF a_debug = 1 THEN SELECT * FROM tmp_User; END IF; CALL fetchmetrics.p_dog_clear_calc_user_access( v_guid, FALSE ); END IF; IF EXISTS(SELECT * FROM tmp_Msg_Error 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 SELECT * FROM tmp_User; END IF; DELETE FROM tmp_User; END IF; -- Returns SELECT USERS.id_user , USERS.id_user_auth0 , USERS.firstname , USERS.surname , USERS.email , USERS.is_email_verified , t_USER.id_role , ROLES.name AS name_role , t_USER.id_company , t_COMPANY.name AS name_company , t_COMPANY.website AS website_company , t_USER.is_super_user , t_USER.priority_access_level_user AS priority_access_level , t_USER.can_admin_dog , t_USER.can_admin_user FROM tmp_User t_USER -- INNER JOIN tmp_User_Access t_USER_ACCESS INNER JOIN fetchmetrics.DOG_User USERS ON t_USER.id_user = USERS.id_user LEFT JOIN fetchmetrics.DOG_Role ROLES ON t_USER.id_role = ROLES.id_role LEFT JOIN tmp_Company t_COMPANY ON t_USER.id_company = t_COMPANY.id_company ; # 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 fetchmetrics.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; IF a_debug = 1 THEN SELECT 'End'; SELECT * FROM tmp_User; SELECT * FROM tmp_User_Access; END IF; -- Clean up DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_User_Access; DROP TEMPORARY TABLE IF EXISTS tmp_User; DROP TEMPORARY TABLE IF EXISTS tmp_Company; IF a_debug = 1 THEN CALL fetchmetrics.p_debug_timing_reporting ( v_time_start ); END IF; END // DELIMITER ; /* select * FROM fetchmetrics.DOG_Calc_User_Access_Temp; delete FROM fetchmetrics.DOG_Calc_User_Access_Temp; SELECT * FROM fetchmetrics.DOG_USER; CALL fetchmetrics.p_dog_get_many_user( NULL -- :a_id_user, , 'auth0|6582b95c895d09a70ba10fef' -- :a_auth0_id_user, , 1 -- :a_get_all_user, , 0 -- :a_get_inactive_user, -- , 0 -- :a_get_first_user_only, , NULL -- :a_ids_user, , 'auth0|6582b95c895d09a70ba10fef' -- :a_auth0_ids_user , '' -- a_names_user , '' -- a_emails_user , '' -- a_ids_company , 0 -- a_get_all_company , 0 -- a_get_inactive_company , 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, , 0 -- a_debug ); */