110 lines
3.5 KiB
SQL
110 lines
3.5 KiB
SQL
-- ============================================
|
|
-- Flash Call OTP System — Database Setup
|
|
-- Domain: otp.intaleqapp.com
|
|
-- ============================================
|
|
|
|
CREATE DATABASE IF NOT EXISTS otpDb
|
|
CHARACTER SET utf8mb4
|
|
COLLATE utf8mb4_unicode_ci;
|
|
|
|
USE otpDb;
|
|
|
|
-- OTP Requests Table
|
|
CREATE TABLE IF NOT EXISTS otp_requests (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
phone VARCHAR(20) NOT NULL,
|
|
otp_code VARCHAR(6) NOT NULL,
|
|
caller_id VARCHAR(20) NOT NULL DEFAULT '',
|
|
status ENUM('pending','pending_sms','calling','completed','failed','expired','verified') NOT NULL DEFAULT 'pending',
|
|
method ENUM('flash_call','sms') NOT NULL DEFAULT 'flash_call',
|
|
device_id VARCHAR(50) NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
|
|
expires_at TIMESTAMP NOT NULL,
|
|
verified_at TIMESTAMP NULL,
|
|
INDEX idx_phone (phone),
|
|
INDEX idx_status (status),
|
|
INDEX idx_method_status (method, status),
|
|
INDEX idx_device_id (device_id),
|
|
INDEX idx_expires (expires_at)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Caller Devices Table
|
|
CREATE TABLE IF NOT EXISTS caller_devices (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
device_id VARCHAR(50) UNIQUE NOT NULL,
|
|
phone_number VARCHAR(20) NOT NULL,
|
|
sim_slot TINYINT DEFAULT 0,
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
last_seen TIMESTAMP NULL,
|
|
calls_today INT DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_active (is_active),
|
|
INDEX idx_calls_today (calls_today)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- API Request Logs Table
|
|
CREATE TABLE IF NOT EXISTS api_logs (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
endpoint VARCHAR(50) NOT NULL,
|
|
method VARCHAR(10) NOT NULL,
|
|
ip_address VARCHAR(45) NOT NULL,
|
|
user_agent VARCHAR(500) NULL,
|
|
request_body TEXT NULL,
|
|
response_code SMALLINT NOT NULL DEFAULT 200,
|
|
error VARCHAR(500) NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_endpoint (endpoint),
|
|
INDEX idx_created (created_at),
|
|
INDEX idx_ip (ip_address)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ============================================
|
|
-- Scheduled Cleanup (add to MySQL Event Scheduler)
|
|
-- ============================================
|
|
|
|
-- Enable event scheduler
|
|
SET GLOBAL event_scheduler = ON;
|
|
|
|
-- Expire old pending requests every 30 seconds
|
|
DELIMITER //
|
|
CREATE EVENT IF NOT EXISTS expire_otp_requests
|
|
ON SCHEDULE EVERY 30 SECOND
|
|
DO
|
|
BEGIN
|
|
UPDATE otp_requests
|
|
SET status = 'expired', updated_at = NOW()
|
|
WHERE status IN ('pending', 'pending_sms', 'calling')
|
|
AND expires_at < NOW();
|
|
END //
|
|
DELIMITER ;
|
|
|
|
-- Reset calls_today counter daily at midnight (Asia/Amman = UTC+3)
|
|
DELIMITER //
|
|
CREATE EVENT IF NOT EXISTS reset_daily_calls
|
|
ON SCHEDULE EVERY 1 DAY
|
|
STARTS CONCAT(CURDATE() + INTERVAL 1 DAY, ' 00:00:00')
|
|
DO
|
|
BEGIN
|
|
UPDATE caller_devices SET calls_today = 0;
|
|
END //
|
|
DELIMITER ;
|
|
|
|
-- Clean up old API logs (older than 30 days)
|
|
DELIMITER //
|
|
CREATE EVENT IF NOT EXISTS cleanup_api_logs
|
|
ON SCHEDULE EVERY 1 DAY
|
|
STARTS CONCAT(CURDATE() + INTERVAL 1 DAY, ' 03:00:00')
|
|
DO
|
|
BEGIN
|
|
DELETE FROM api_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
|
|
END //
|
|
DELIMITER ;
|
|
|
|
-- ============================================
|
|
-- Grant permissions
|
|
-- ============================================
|
|
-- Run this separately with root access:
|
|
-- GRANT SELECT, INSERT, UPDATE, DELETE ON otpDb.* TO 'otpUser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD';
|
|
-- FLUSH PRIVILEGES;
|
|
sfvo055OJV7VqPW25VEQ |