diff --git a/main/create.sql b/main/create.sql index 9ac08fb..4fb6252 100644 --- a/main/create.sql +++ b/main/create.sql @@ -1,26 +1,77 @@ CREATE TABLE messages ( id INT AUTO_INCREMENT PRIMARY KEY, - username VARCHAR(50) NOT NULL, + user_id INT NOT NULL, message TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - signature TEXT, - is_encrypted BOOLEAN DEFAULT FALSE, + is_deleted BOOLEAN DEFAULT FALSE, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_created_at (created_at) -); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, - username VARCHAR(50) NOT NULL UNIQUE, + username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, - pgp_key TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - is_moderator TINYINT(1) NOT NULL DEFAULT 0, - login_attempts INT NOT NULL DEFAULT 0, + last_login TIMESTAMP NULL, + login_attempts INT DEFAULT 0, last_attempt TIMESTAMP NULL, - is_blocked TINYINT(1) NOT NULL DEFAULT 0, - block_reason TEXT, + is_blocked BOOLEAN DEFAULT FALSE, INDEX idx_username (username) -); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE user_blocks ( + id INT AUTO_INCREMENT PRIMARY KEY, + blocker_id INT NOT NULL, + blocked_id INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (blocker_id) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY (blocked_id) REFERENCES users(id) ON DELETE CASCADE, + UNIQUE KEY unique_block (blocker_id, blocked_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE activity_log ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT, + action VARCHAR(50) NOT NULL, + ip_address VARCHAR(45), + user_agent TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL, + INDEX idx_created_at (created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE sessions ( + id VARCHAR(128) PRIMARY KEY, + user_id INT NOT NULL, + ip_address VARCHAR(45), + user_agent TEXT, + last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + INDEX idx_last_activity (last_activity) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE rate_limits ( + id INT AUTO_INCREMENT PRIMARY KEY, + ip_address VARCHAR(45) NOT NULL, + action VARCHAR(50) NOT NULL, + attempts INT DEFAULT 1, + last_attempt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY unique_ip_action (ip_address, action), + INDEX idx_last_attempt (last_attempt) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE csrf_tokens ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + token VARCHAR(64) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + expires_at TIMESTAMP NOT NULL, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + UNIQUE KEY unique_token (token), + INDEX idx_expires_at (expires_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE registrations ( id INT AUTO_INCREMENT PRIMARY KEY, diff --git a/main/migrate.sql b/main/migrate.sql index e0e8ab4..bd50738 100644 --- a/main/migrate.sql +++ b/main/migrate.sql @@ -12,4 +12,79 @@ END // DELIMITER ; CALL migrate_if_needed(); -DROP PROCEDURE IF EXISTS migrate_if_needed; \ No newline at end of file +DROP PROCEDURE IF EXISTS migrate_if_needed; + +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) UNIQUE NOT NULL, + password VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + last_login TIMESTAMP NULL, + login_attempts INT DEFAULT 0, + last_attempt TIMESTAMP NULL, + is_blocked BOOLEAN DEFAULT FALSE, + INDEX idx_username (username) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS messages ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + message TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + is_deleted BOOLEAN DEFAULT FALSE, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + INDEX idx_created_at (created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS user_blocks ( + id INT AUTO_INCREMENT PRIMARY KEY, + blocker_id INT NOT NULL, + blocked_id INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (blocker_id) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY (blocked_id) REFERENCES users(id) ON DELETE CASCADE, + UNIQUE KEY unique_block (blocker_id, blocked_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS activity_log ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT, + action VARCHAR(50) NOT NULL, + ip_address VARCHAR(45), + user_agent TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL, + INDEX idx_created_at (created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS sessions ( + id VARCHAR(128) PRIMARY KEY, + user_id INT NOT NULL, + ip_address VARCHAR(45), + user_agent TEXT, + last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + INDEX idx_last_activity (last_activity) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS rate_limits ( + id INT AUTO_INCREMENT PRIMARY KEY, + ip_address VARCHAR(45) NOT NULL, + action VARCHAR(50) NOT NULL, + attempts INT DEFAULT 1, + last_attempt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY unique_ip_action (ip_address, action), + INDEX idx_last_attempt (last_attempt) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS csrf_tokens ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + token VARCHAR(64) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + expires_at TIMESTAMP NOT NULL, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + UNIQUE KEY unique_token (token), + INDEX idx_expires_at (expires_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file