feat: Add comprehensive documentation suite and reorganize project structure

- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
This commit is contained in:
SamiAhmed7777
2025-10-21 00:39:45 -07:00
commit 0b7e2d0a5b
6080 changed files with 1332936 additions and 0 deletions

View File

@@ -0,0 +1,305 @@
-- ============================================================================
-- EasyStream - All New Features Installation
-- ============================================================================
-- This SQL file installs ALL new features in one go:
-- 1. Subtitle/Caption System
-- 2. Upload Progress Tracking
-- 3. Live Chat System
-- 4. Community Posts
-- 5. Polls
-- 6. Content Moderation/Reports
--
-- Installation:
-- docker exec -i easystream-db mysql -u easystream -peasystream easystream < __install/add_all_new_features.sql
-- ============================================================================
-- ============================================================================
-- 1. SUBTITLE/CAPTION SYSTEM
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_subtitles` (
`sub_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`file_id` int(10) unsigned NOT NULL COMMENT 'Foreign key to video/audio/live file',
`file_type` varchar(10) NOT NULL DEFAULT 'video' COMMENT 'video, audio, live, short',
`usr_id` int(10) unsigned NOT NULL COMMENT 'Owner user ID',
`sub_language` varchar(10) NOT NULL DEFAULT 'en' COMMENT 'Language code (en, es, fr, etc.)',
`sub_label` varchar(100) NOT NULL DEFAULT 'English' COMMENT 'Display label (English, Spanish, etc.)',
`sub_filename` varchar(255) NOT NULL COMMENT 'Filename on disk',
`sub_format` varchar(10) NOT NULL DEFAULT 'vtt' COMMENT 'vtt or srt',
`sub_kind` varchar(20) NOT NULL DEFAULT 'subtitles' COMMENT 'subtitles, captions, descriptions',
`sub_default` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Is this the default track?',
`sub_auto_generated` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Auto-generated via speech-to-text',
`sub_filesize` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'File size in bytes',
`upload_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`active` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`sub_id`),
KEY `idx_file_type` (`file_id`, `file_type`),
KEY `idx_usr_id` (`usr_id`),
KEY `idx_language` (`sub_language`),
KEY `idx_active` (`active`),
KEY `idx_subtitles_lookup` (`file_id`, `file_type`, `active`, `sub_default`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Subtitle/caption tracks for videos';
ALTER TABLE `db_videofiles`
ADD COLUMN IF NOT EXISTS `captions_enabled` tinyint(1) DEFAULT 1 COMMENT 'Enable captions for this video',
ADD COLUMN IF NOT EXISTS `subtitle_count` int(10) unsigned DEFAULT 0 COMMENT 'Number of subtitle tracks';
ALTER TABLE `db_shortfiles`
ADD COLUMN IF NOT EXISTS `captions_enabled` tinyint(1) DEFAULT 1 COMMENT 'Enable captions for this short',
ADD COLUMN IF NOT EXISTS `subtitle_count` int(10) unsigned DEFAULT 0 COMMENT 'Number of subtitle tracks';
ALTER TABLE `db_livefiles`
ADD COLUMN IF NOT EXISTS `captions_enabled` tinyint(1) DEFAULT 1 COMMENT 'Enable captions for this stream',
ADD COLUMN IF NOT EXISTS `subtitle_count` int(10) unsigned DEFAULT 0 COMMENT 'Number of subtitle tracks';
ALTER TABLE `db_audiofiles`
ADD COLUMN IF NOT EXISTS `captions_enabled` tinyint(1) DEFAULT 1 COMMENT 'Enable captions for this audio',
ADD COLUMN IF NOT EXISTS `subtitle_count` int(10) unsigned DEFAULT 0 COMMENT 'Number of subtitle tracks';
-- ============================================================================
-- 2. UPLOAD PROGRESS TRACKING
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_upload_progress` (
`db_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`upload_id` varchar(64) NOT NULL COMMENT 'Unique upload identifier',
`usr_id` int(10) unsigned NOT NULL COMMENT 'User ID',
`filename` varchar(255) NOT NULL COMMENT 'Original filename',
`file_type` varchar(20) NOT NULL COMMENT 'video, audio, image, document, etc.',
`file_size` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 'Total file size in bytes',
`uploaded_bytes` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 'Bytes uploaded so far',
`upload_percent` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT 'Upload percentage (0-100)',
`status` varchar(20) NOT NULL DEFAULT 'uploading' COMMENT 'uploading, processing, encoding, completed, failed, cancelled',
`processing_step` varchar(100) DEFAULT NULL COMMENT 'Current processing step description',
`error_message` text DEFAULT NULL COMMENT 'Error message if failed',
`file_key` varchar(32) DEFAULT NULL COMMENT 'File key after successful upload',
`started_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`completed_at` datetime DEFAULT NULL,
PRIMARY KEY (`db_id`),
UNIQUE KEY `idx_upload_id` (`upload_id`),
KEY `idx_usr_status` (`usr_id`, `status`),
KEY `idx_started_at` (`started_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Upload progress tracking';
-- ============================================================================
-- 3. LIVE CHAT SYSTEM
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_live_chat_messages` (
`msg_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`stream_key` varchar(32) NOT NULL COMMENT 'Live stream file key',
`usr_id` int(10) unsigned NOT NULL COMMENT 'User who sent message',
`message` text NOT NULL COMMENT 'Chat message content',
`message_type` varchar(20) NOT NULL DEFAULT 'chat' COMMENT 'chat, super_chat, system',
`super_chat_amount` decimal(10,2) DEFAULT NULL COMMENT 'Amount if super chat',
`timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`deleted` tinyint(1) NOT NULL DEFAULT 0,
`deleted_by` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`msg_id`),
KEY `idx_stream_timestamp` (`stream_key`, `timestamp`),
KEY `idx_usr_id` (`usr_id`),
KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Live chat messages';
CREATE TABLE IF NOT EXISTS `db_live_chat_moderation` (
`mod_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`stream_key` varchar(32) NOT NULL COMMENT 'Live stream file key',
`usr_id` int(10) unsigned NOT NULL COMMENT 'User being moderated',
`action` varchar(20) NOT NULL COMMENT 'timeout, ban, unban',
`duration` int(10) unsigned DEFAULT NULL COMMENT 'Duration in seconds for timeout',
`reason` varchar(255) DEFAULT NULL,
`moderator_id` int(10) unsigned NOT NULL COMMENT 'User who performed action',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`expires_at` datetime DEFAULT NULL,
PRIMARY KEY (`mod_id`),
KEY `idx_stream_user` (`stream_key`, `usr_id`),
KEY `idx_expires` (`expires_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Chat moderation actions';
CREATE TABLE IF NOT EXISTS `db_live_chat_moderators` (
`mod_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`stream_key` varchar(32) NOT NULL COMMENT 'Live stream file key',
`usr_id` int(10) unsigned NOT NULL COMMENT 'User who is a moderator',
`assigned_by` int(10) unsigned NOT NULL COMMENT 'User who assigned moderator',
`assigned_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`mod_id`),
UNIQUE KEY `idx_stream_user` (`stream_key`, `usr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Chat moderators per stream';
CREATE TABLE IF NOT EXISTS `db_live_chat_settings` (
`setting_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`stream_key` varchar(32) NOT NULL COMMENT 'Live stream file key',
`chat_enabled` tinyint(1) NOT NULL DEFAULT 1,
`slow_mode` int(10) unsigned DEFAULT NULL COMMENT 'Seconds between messages',
`subscriber_only` tinyint(1) NOT NULL DEFAULT 0,
`follower_only` tinyint(1) NOT NULL DEFAULT 0,
`emotes_enabled` tinyint(1) NOT NULL DEFAULT 1,
`links_allowed` tinyint(1) NOT NULL DEFAULT 0,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`setting_id`),
UNIQUE KEY `idx_stream_key` (`stream_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Chat settings per stream';
-- ============================================================================
-- 4. COMMUNITY POSTS
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_community_posts` (
`post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`usr_id` int(10) unsigned NOT NULL COMMENT 'Creator user ID',
`post_type` varchar(20) NOT NULL DEFAULT 'text' COMMENT 'text, image, video, poll',
`content` text NOT NULL COMMENT 'Post content',
`media_file_key` varchar(32) DEFAULT NULL COMMENT 'File key if image/video post',
`poll_id` int(10) unsigned DEFAULT NULL COMMENT 'Poll ID if poll post',
`likes` int(10) unsigned NOT NULL DEFAULT 0,
`comments` int(10) unsigned NOT NULL DEFAULT 0,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`post_id`),
KEY `idx_usr_id` (`usr_id`),
KEY `idx_created_at` (`created_at`),
KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Community posts from creators';
CREATE TABLE IF NOT EXISTS `db_community_post_likes` (
`like_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(10) unsigned NOT NULL,
`usr_id` int(10) unsigned NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`like_id`),
UNIQUE KEY `idx_post_user` (`post_id`, `usr_id`),
KEY `idx_usr_id` (`usr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Likes on community posts';
CREATE TABLE IF NOT EXISTS `db_community_post_comments` (
`comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(10) unsigned NOT NULL,
`usr_id` int(10) unsigned NOT NULL,
`comment` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`deleted` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`comment_id`),
KEY `idx_post_id` (`post_id`),
KEY `idx_usr_id` (`usr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Comments on community posts';
-- ============================================================================
-- 5. POLLS
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_polls` (
`poll_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`usr_id` int(10) unsigned NOT NULL COMMENT 'Creator user ID',
`question` varchar(255) NOT NULL,
`total_votes` int(10) unsigned NOT NULL DEFAULT 0,
`expires_at` datetime DEFAULT NULL COMMENT 'Poll expiration time',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`closed` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`poll_id`),
KEY `idx_usr_id` (`usr_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Polls created by users';
CREATE TABLE IF NOT EXISTS `db_poll_options` (
`option_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`poll_id` int(10) unsigned NOT NULL,
`option_text` varchar(255) NOT NULL,
`votes` int(10) unsigned NOT NULL DEFAULT 0,
`display_order` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`option_id`),
KEY `idx_poll_id` (`poll_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Poll answer options';
CREATE TABLE IF NOT EXISTS `db_poll_votes` (
`vote_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`poll_id` int(10) unsigned NOT NULL,
`option_id` int(10) unsigned NOT NULL,
`usr_id` int(10) unsigned NOT NULL,
`voted_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`vote_id`),
UNIQUE KEY `idx_poll_user` (`poll_id`, `usr_id`),
KEY `idx_option_id` (`option_id`),
KEY `idx_usr_id` (`usr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User poll votes';
-- ============================================================================
-- 6. CONTENT MODERATION / REPORTS
-- ============================================================================
CREATE TABLE IF NOT EXISTS `db_reports` (
`report_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`reporter_id` int(10) unsigned NOT NULL COMMENT 'User who reported',
`reported_type` varchar(20) NOT NULL COMMENT 'video, user, comment, post',
`reported_id` varchar(32) NOT NULL COMMENT 'ID/key of reported item',
`report_reason` varchar(50) NOT NULL COMMENT 'spam, harassment, copyright, etc.',
`report_details` text DEFAULT NULL,
`status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT 'pending, reviewing, resolved, dismissed',
`reviewed_by` int(10) unsigned DEFAULT NULL,
`resolution` text DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`resolved_at` datetime DEFAULT NULL,
PRIMARY KEY (`report_id`),
KEY `idx_reporter` (`reporter_id`),
KEY `idx_reported` (`reported_type`, `reported_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User reports for moderation';
-- ============================================================================
-- SETTINGS
-- ============================================================================
INSERT INTO `db_settings` (`setting_name`, `setting_value`, `setting_type`, `setting_category`, `setting_description`, `setting_default`) VALUES
-- Subtitles
('subtitles_enabled', '1', 'boolean', 'video', 'Enable subtitle/caption uploads for videos', '1'),
('subtitles_max_size', '1048576', 'number', 'video', 'Maximum subtitle file size in bytes (default 1MB)', '1048576'),
('subtitles_allowed_formats', 'vtt,srt', 'text', 'video', 'Allowed subtitle formats (comma-separated)', 'vtt,srt'),
('subtitles_auto_convert', '1', 'boolean', 'video', 'Auto-convert SRT to VTT format', '1'),
('subtitles_max_per_video', '10', 'number', 'video', 'Maximum subtitle tracks per video', '10'),
('subtitles_require_approval', '0', 'boolean', 'video', 'Require admin approval for user-uploaded subtitles', '0'),
-- Live Chat
('live_chat_enabled', '1', 'boolean', 'live', 'Enable live chat for streams', '1'),
('live_chat_max_length', '500', 'number', 'live', 'Maximum chat message length', '500'),
('live_chat_rate_limit', '2', 'number', 'live', 'Minimum seconds between messages', '2'),
('live_chat_super_chat_enabled', '1', 'boolean', 'live', 'Enable Super Chat donations', '1'),
('live_chat_super_chat_min', '1.00', 'text', 'live', 'Minimum Super Chat amount', '1.00'),
('live_chat_replay_enabled', '1', 'boolean', 'live', 'Enable chat replay for VOD', '1'),
-- Community Posts
('community_posts_enabled', '1', 'boolean', 'community', 'Enable community posts feature', '1'),
('community_posts_subscriber_count', '1000', 'number', 'community', 'Minimum subscribers to post', '1000'),
('community_posts_max_length', '5000', 'number', 'community', 'Maximum post character length', '5000'),
-- Polls
('polls_enabled', '1', 'boolean', 'community', 'Enable polls feature', '1'),
('polls_max_options', '10', 'number', 'community', 'Maximum poll options', '10'),
('polls_max_duration', '7', 'number', 'community', 'Maximum poll duration in days', '7'),
-- Content Moderation
('reporting_enabled', '1', 'boolean', 'moderation', 'Enable content reporting', '1'),
('reporting_reasons', 'spam,harassment,copyright,inappropriate,misleading', 'text', 'moderation', 'Report reason options (comma-separated)', 'spam,harassment,copyright,inappropriate,misleading')
ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value);
-- ============================================================================
-- CLEANUP EVENTS
-- ============================================================================
CREATE EVENT IF NOT EXISTS cleanup_upload_progress
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM `db_upload_progress`
WHERE `status` IN ('completed', 'failed', 'cancelled')
AND `completed_at` < DATE_SUB(NOW(), INTERVAL 7 DAY);
CREATE EVENT IF NOT EXISTS cleanup_live_chat
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM `db_live_chat_messages`
WHERE `timestamp` < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- ============================================================================
-- END OF INSTALLATION
-- ============================================================================