CREATE DATABASE IF NOT EXISTS `skydashnet_db`;
USE `skydashnet_db`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`display_name` varchar(100) NOT NULL,
`password_hash` varchar(255) NULL,
`profile_picture_url` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL UNIQUE,
`google_id` varchar(255) DEFAULT NULL UNIQUE,
`whatsapp_number` varchar(25) DEFAULT NULL,
`workspace_id` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `workspaces` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`owner_id` int(11) NOT NULL,
`active_device_id` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`whatsapp_bot_enabled` BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (`id`),
KEY `owner_id` (`owner_id`),
CONSTRAINT `workspaces_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `users`
ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`workspace_id`) REFERENCES `workspaces` (`id`) ON DELETE SET NULL;
CREATE TABLE `mikrotik_devices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`workspace_id` int(11) NOT NULL,
`host` varchar(255) NOT NULL,
`user` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
`name` varchar(100) NOT NULL,
`port` int(11) DEFAULT 8728,
`wan_interface` VARCHAR(100) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `workspace_id` (`workspace_id`),
CONSTRAINT `mikrotik_devices_ibfk_1` FOREIGN KEY (`workspace_id`) REFERENCES `workspaces` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `network_assets` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`workspace_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`type` enum('ODC','ODP','JoinBox','Server') NOT NULL,
`latitude` varchar(50) NOT NULL,
`longitude` varchar(50) NOT NULL,
`description` text DEFAULT NULL,
`splitter_count` int(11) DEFAULT NULL,
`parent_asset_id` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
KEY `workspace_id` (`workspace_id`),
KEY `parent_asset_id` (`parent_asset_id`),
CONSTRAINT `network_assets_ibfk_1` FOREIGN KEY (`workspace_id`) REFERENCES `workspaces` (`id`) ON DELETE CASCADE,
CONSTRAINT `network_assets_ibfk_2` FOREIGN KEY (`parent_asset_id`) REFERENCES `network_assets` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `odp_user_connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`workspace_id` int(11) NOT NULL,
`asset_id` int(11) NOT NULL,
`pppoe_secret_name` varchar(255) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `workspace_secret_unique` (`workspace_id`,`pppoe_secret_name`),
KEY `asset_id` (`asset_id`),
CONSTRAINT `odp_user_connections_ibfk_1` FOREIGN KEY (`workspace_id`) REFERENCES `workspaces` (`id`) ON DELETE CASCADE,
CONSTRAINT `odp_user_connections_ibfk_2` FOREIGN KEY (`asset_id`) REFERENCES `network_assets` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `user_sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`token_id` varchar(255) NOT NULL,
`user_agent` text DEFAULT NULL,
`ip_address` varchar(45) DEFAULT NULL,
`last_seen` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `token_id` (`token_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `user_sessions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `workspace_invites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`workspace_id` int(11) NOT NULL,
`code` varchar(10) NOT NULL,
`expires_at` timestamp NOT NULL,
`created_by` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`),
KEY `workspace_id` (`workspace_id`),
KEY `created_by` (`created_by`),
CONSTRAINT `workspace_invites_ibfk_1` FOREIGN KEY (`workspace_id`) REFERENCES `workspaces` (`id`) ON DELETE CASCADE,
CONSTRAINT `workspace_invites_ibfk_2` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `pending_registrations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`whatsapp_number` varchar(25) NOT NULL,
`username` varchar(50) NOT NULL,
`display_name` varchar(100) NOT NULL,
`password_hash` varchar(255) NOT NULL,
`otp_code` varchar(10) NOT NULL,
`expires_at` timestamp NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `whatsapp_number_unique` (`whatsapp_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `login_otps` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`otp_code` varchar(10) NOT NULL,
`expires_at` timestamp NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `login_otps_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `whatsapp_updates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`new_whatsapp_number` varchar(25) NOT NULL,
`otp_code` varchar(10) NOT NULL,
`expires_at` timestamp NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`),
CONSTRAINT `whatsapp_updates_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE ip_pools (
id INT AUTO_INCREMENT PRIMARY KEY,
workspace_id INT NOT NULL,
profile_name VARCHAR(255) NOT NULL,
ip_start VARCHAR(45) NOT NULL,
ip_end VARCHAR(45) NOT NULL,
gateway VARCHAR(45) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `workspace_profile_unique` (`workspace_id`, `profile_name`),
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE alarms (
id INT AUTO_INCREMENT PRIMARY KEY,
workspace_id INT NOT NULL,
type VARCHAR(50) NOT NULL, -- e.g., 'PPPOE_TRAFFIC'
threshold_mbps INT NOT NULL,
status VARCHAR(20) DEFAULT 'ACTIVE', -- 'ACTIVE' or 'MUTED'
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE `historical_stats` (
`id` INT NOT NULL AUTO_INCREMENT,
`workspace_id` INT NOT NULL,
`device_id` INT NOT NULL,
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`active_pppoe_count` INT DEFAULT 0,
`active_hotspot_count` INT DEFAULT 0,
`total_rx_bytes` BIGINT DEFAULT 0,
`total_tx_bytes` BIGINT DEFAULT 0,
`peak_rx_bps` BIGINT DEFAULT 0,
`peak_tx_bps` BIGINT DEFAULT 0,
PRIMARY KEY (`id`),
KEY `workspace_id_idx` (`workspace_id`),
KEY `timestamp_idx` (`timestamp`),
FOREIGN KEY (`workspace_id`) REFERENCES `workspaces`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `downtime_events` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`workspace_id` INT NOT NULL,
`pppoe_user` VARCHAR(255) NOT NULL,
`start_time` DATETIME NOT NULL,
`end_time` DATETIME,
`duration_seconds` INT,
INDEX `idx_workspace_user_start` (`workspace_id`, `pppoe_user`, `start_time`)
);
ALTER TABLE alarms
MODIFY COLUMN type ENUM('PPPOE_TRAFFIC', 'CPU_LOAD', 'DEVICE_OFFLINE') NOT NULL;
);