|
CREATE DATABASE IF NOT EXISTS `candidb_main` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
|
|
USE `candidb_main`;
|
|
-- MySQL dump 10.13 Distrib 8.0.38, for Win64 (x86_64)
|
|
--
|
|
-- Host: localhost Database: candidb_main
|
|
-- ------------------------------------------------------
|
|
-- Server version 8.0.39
|
|
|
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
/*!50503 SET NAMES utf8 */;
|
|
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
|
|
--
|
|
-- Dumping events for database 'candidb_main'
|
|
--
|
|
|
|
--
|
|
-- Dumping routines for database 'candidb_main'
|
|
--
|
|
/*!50003 DROP FUNCTION IF EXISTS `can_create_job` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `can_create_job`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE current_jobs INT DEFAULT 0;
|
|
DECLARE max_jobs INT DEFAULT 100; -- Hard limit of 100 jobs
|
|
|
|
-- Get current job count
|
|
SELECT COALESCE(jobs_created, 0) INTO current_jobs
|
|
FROM user_usage
|
|
WHERE user_id = user_uuid;
|
|
|
|
-- Return TRUE if under limit
|
|
RETURN current_jobs < max_jobs;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP FUNCTION IF EXISTS `get_all_users` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `get_all_users`() RETURNS json
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE result JSON;
|
|
|
|
SELECT JSON_ARRAYAGG(
|
|
JSON_OBJECT(
|
|
'id', id,
|
|
'email', email,
|
|
'first_name', first_name,
|
|
'last_name', last_name,
|
|
'role', role,
|
|
'company_name', company_name,
|
|
'is_active', is_active,
|
|
'last_login_at', last_login_at,
|
|
'email_verified_at', email_verified_at,
|
|
'created_at', created_at
|
|
)
|
|
) INTO result
|
|
FROM users
|
|
WHERE deleted_at IS NULL
|
|
ORDER BY created_at DESC;
|
|
|
|
RETURN result;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP FUNCTION IF EXISTS `get_token_usage_summary` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `get_token_usage_summary`(user_uuid VARCHAR(36)) RETURNS json
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE total_purchased INT DEFAULT 0;
|
|
DECLARE total_used INT DEFAULT 0;
|
|
DECLARE total_available INT DEFAULT 0;
|
|
DECLARE result JSON;
|
|
|
|
-- Get total purchased tokens
|
|
SELECT COALESCE(SUM(quantity), 0) INTO total_purchased
|
|
FROM interview_tokens
|
|
WHERE user_id = user_uuid;
|
|
|
|
-- Get total used tokens
|
|
SELECT COALESCE(SUM(tokens_used), 0) INTO total_used
|
|
FROM interview_tokens
|
|
WHERE user_id = user_uuid;
|
|
|
|
-- Get total available tokens
|
|
SELECT COALESCE(SUM(tokens_remaining), 0) INTO total_available
|
|
FROM interview_tokens
|
|
WHERE user_id = user_uuid
|
|
AND status = 'active'
|
|
AND (expires_at IS NULL OR expires_at > NOW());
|
|
|
|
-- Build JSON result
|
|
SET result = JSON_OBJECT(
|
|
'total_purchased', total_purchased,
|
|
'total_used', total_used,
|
|
'total_available', total_available,
|
|
'utilization_percentage', CASE
|
|
WHEN total_purchased > 0 THEN ROUND((total_used / total_purchased) * 100, 2)
|
|
ELSE 0
|
|
END
|
|
);
|
|
|
|
RETURN result;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP FUNCTION IF EXISTS `get_user_statistics` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `get_user_statistics`(user_uuid VARCHAR(36)) RETURNS json
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE result JSON;
|
|
DECLARE user_usage_data JSON;
|
|
DECLARE token_summary JSON;
|
|
|
|
-- Get usage data
|
|
SELECT JSON_OBJECT(
|
|
'jobs_created', COALESCE(jobs_created, 0),
|
|
'interviews_completed', COALESCE(interviews_completed, 0),
|
|
'tokens_purchased', COALESCE(tokens_purchased, 0),
|
|
'tokens_used', COALESCE(tokens_used, 0)
|
|
) INTO user_usage_data
|
|
FROM user_usage
|
|
WHERE user_id = user_uuid;
|
|
|
|
-- Get token summary
|
|
SELECT get_token_usage_summary(user_uuid) INTO token_summary;
|
|
|
|
-- Build result
|
|
SET result = JSON_OBJECT(
|
|
'usage', user_usage_data,
|
|
'tokens', token_summary
|
|
);
|
|
|
|
RETURN result;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP FUNCTION IF EXISTS `has_available_tokens` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `has_available_tokens`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE available_tokens INT DEFAULT 0;
|
|
|
|
-- Get available tokens (active and not expired)
|
|
SELECT COALESCE(SUM(tokens_remaining), 0) INTO available_tokens
|
|
FROM interview_tokens
|
|
WHERE user_id = user_uuid
|
|
AND status = 'active'
|
|
AND (expires_at IS NULL OR expires_at > NOW());
|
|
|
|
-- Return TRUE if has available tokens
|
|
RETURN available_tokens > 0;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP FUNCTION IF EXISTS `is_admin` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` FUNCTION `is_admin`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
|
|
READS SQL DATA
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE user_role VARCHAR(20) DEFAULT NULL;
|
|
|
|
SELECT role INTO user_role
|
|
FROM users
|
|
WHERE id = user_uuid AND is_active = TRUE;
|
|
|
|
RETURN user_role = 'admin';
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `add_tokens_to_user` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `add_tokens_to_user`(
|
|
IN p_user_id VARCHAR(36),
|
|
IN p_quantity INT,
|
|
IN p_price_per_token DECIMAL(10,2),
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255)
|
|
)
|
|
BEGIN
|
|
DECLARE v_total_price DECIMAL(10,2);
|
|
DECLARE v_token_id VARCHAR(36);
|
|
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while adding tokens';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Check if user exists
|
|
IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'User not found';
|
|
ELSE
|
|
-- Calculate total price
|
|
SET v_total_price = p_quantity * p_price_per_token;
|
|
|
|
-- Create token record
|
|
SET v_token_id = UUID();
|
|
|
|
INSERT INTO interview_tokens (
|
|
id, user_id, token_type, quantity, price_per_token,
|
|
total_price, status, purchased_at
|
|
) VALUES (
|
|
v_token_id, p_user_id,
|
|
CASE WHEN p_quantity = 1 THEN 'single' ELSE 'bulk' END,
|
|
p_quantity, p_price_per_token, v_total_price,
|
|
'active', NOW()
|
|
);
|
|
|
|
-- Create payment record (admin-granted)
|
|
INSERT INTO payment_records (
|
|
user_id, interview_token_id, token_package_id,
|
|
amount, status, payment_method, payment_reference
|
|
) VALUES (
|
|
p_user_id, v_token_id, NULL, v_total_price,
|
|
'paid', 'admin_granted', CONCAT('ADMIN_', p_admin_id, '_', NOW())
|
|
);
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = CONCAT('Successfully added ', p_quantity, ' tokens to user');
|
|
END IF;
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `change_user_password` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `change_user_password`(
|
|
IN p_user_id VARCHAR(36),
|
|
IN p_new_password_hash VARCHAR(255),
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255)
|
|
)
|
|
BEGIN
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while changing password';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Check if user exists
|
|
IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'User not found';
|
|
ELSE
|
|
-- Update password
|
|
UPDATE users SET
|
|
password_hash = p_new_password_hash,
|
|
updated_at = NOW()
|
|
WHERE id = p_user_id;
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = 'Password changed successfully';
|
|
END IF;
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `create_user` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `create_user`(
|
|
IN p_email VARCHAR(255),
|
|
IN p_password_hash VARCHAR(255),
|
|
IN p_first_name VARCHAR(100),
|
|
IN p_last_name VARCHAR(100),
|
|
IN p_role ENUM('admin', 'recruiter'),
|
|
IN p_company_name VARCHAR(255),
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_user_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255)
|
|
)
|
|
BEGIN
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while creating user';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Check if email already exists
|
|
IF EXISTS (SELECT 1 FROM users WHERE email = p_email AND deleted_at IS NULL) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Email already exists';
|
|
ELSE
|
|
-- Create user
|
|
SET p_user_id = UUID();
|
|
|
|
INSERT INTO users (
|
|
id, email, password_hash, first_name, last_name,
|
|
role, company_name, is_active, email_verified_at
|
|
) VALUES (
|
|
p_user_id, p_email, p_password_hash, p_first_name, p_last_name,
|
|
p_role, p_company_name, TRUE, NOW()
|
|
);
|
|
|
|
-- Initialize usage tracking
|
|
INSERT INTO user_usage (user_id) VALUES (p_user_id);
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = 'User created successfully';
|
|
END IF;
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `deactivate_user` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `deactivate_user`(
|
|
IN p_user_id VARCHAR(36),
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255)
|
|
)
|
|
BEGIN
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while deactivating user';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Check if user exists
|
|
IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'User not found';
|
|
ELSE
|
|
-- Deactivate user
|
|
UPDATE users SET
|
|
is_active = FALSE,
|
|
updated_at = NOW()
|
|
WHERE id = p_user_id;
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = 'User deactivated successfully';
|
|
END IF;
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `get_system_statistics` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_system_statistics`(
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255),
|
|
OUT p_statistics JSON
|
|
)
|
|
BEGIN
|
|
DECLARE v_total_users INT DEFAULT 0;
|
|
DECLARE v_active_users INT DEFAULT 0;
|
|
DECLARE v_total_jobs INT DEFAULT 0;
|
|
DECLARE v_total_interviews INT DEFAULT 0;
|
|
DECLARE v_total_tokens_purchased INT DEFAULT 0;
|
|
DECLARE v_total_tokens_used INT DEFAULT 0;
|
|
DECLARE v_total_revenue DECIMAL(10,2) DEFAULT 0;
|
|
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while getting statistics';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Get statistics
|
|
SELECT COUNT(*) INTO v_total_users FROM users WHERE deleted_at IS NULL;
|
|
SELECT COUNT(*) INTO v_active_users FROM users WHERE is_active = TRUE AND deleted_at IS NULL;
|
|
SELECT COALESCE(SUM(jobs_created), 0) INTO v_total_jobs FROM user_usage;
|
|
SELECT COALESCE(SUM(interviews_completed), 0) INTO v_total_interviews FROM user_usage;
|
|
SELECT COALESCE(SUM(tokens_purchased), 0) INTO v_total_tokens_purchased FROM user_usage;
|
|
SELECT COALESCE(SUM(tokens_used), 0) INTO v_total_tokens_used FROM user_usage;
|
|
SELECT COALESCE(SUM(amount), 0) INTO v_total_revenue FROM payment_records WHERE status = 'paid';
|
|
|
|
-- Build statistics JSON
|
|
SET p_statistics = JSON_OBJECT(
|
|
'total_users', v_total_users,
|
|
'active_users', v_active_users,
|
|
'total_jobs', v_total_jobs,
|
|
'total_interviews', v_total_interviews,
|
|
'total_tokens_purchased', v_total_tokens_purchased,
|
|
'total_tokens_used', v_total_tokens_used,
|
|
'total_revenue', v_total_revenue,
|
|
'generated_at', NOW()
|
|
);
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = 'Statistics retrieved successfully';
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!50003 DROP PROCEDURE IF EXISTS `update_user` */;
|
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
|
/*!50003 SET character_set_client = utf8mb4 */ ;
|
|
/*!50003 SET character_set_results = utf8mb4 */ ;
|
|
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
|
|
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
|
/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
|
|
DELIMITER ;;
|
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_user`(
|
|
IN p_user_id VARCHAR(36),
|
|
IN p_email VARCHAR(255),
|
|
IN p_first_name VARCHAR(100),
|
|
IN p_last_name VARCHAR(100),
|
|
IN p_role ENUM('admin', 'recruiter'),
|
|
IN p_company_name VARCHAR(255),
|
|
IN p_is_active BOOLEAN,
|
|
IN p_admin_id VARCHAR(36),
|
|
OUT p_success BOOLEAN,
|
|
OUT p_message VARCHAR(255)
|
|
)
|
|
BEGIN
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
BEGIN
|
|
ROLLBACK;
|
|
SET p_success = FALSE;
|
|
SET p_message = 'An error occurred while updating user';
|
|
END;
|
|
|
|
-- Check if admin
|
|
IF NOT is_admin(p_admin_id) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'Access denied: Admin privileges required';
|
|
ELSE
|
|
-- Check if user exists
|
|
IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
|
|
SET p_success = FALSE;
|
|
SET p_message = 'User not found';
|
|
ELSE
|
|
-- Update user
|
|
UPDATE users SET
|
|
email = p_email,
|
|
first_name = p_first_name,
|
|
last_name = p_last_name,
|
|
role = p_role,
|
|
company_name = p_company_name,
|
|
is_active = p_is_active,
|
|
updated_at = NOW()
|
|
WHERE id = p_user_id;
|
|
|
|
SET p_success = TRUE;
|
|
SET p_message = 'User updated successfully';
|
|
END IF;
|
|
END IF;
|
|
END ;;
|
|
DELIMITER ;
|
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
|
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
|
|
-- Dump completed on 2025-09-16 20:22:32
|