<?php
session_start();
require '../db.php';
header('Content-Type: application/json');
if (!isset($_SESSION['user_id'])) {
echo json_encode(['status' => 'error', 'message' => 'Unauthorized']);
exit;
}
$userId = $_SESSION['user_id'];
$method = $_SERVER['REQUEST_METHOD'];
// GET: Получить все комнаты
if ($method === 'GET') {
try {
$stmt = $pdo->query("SELECT * FROM rooms ORDER BY created_at ASC");
$rooms = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Добавить флаг владельца
foreach ($rooms as &$room) {
$room['is_owner'] = ($room['created_by'] == $userId);
}
echo json_encode(['status' => 'success', 'rooms' => $rooms]);
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
}
// POST: Создать комнату или переключить бота
if ($method === 'POST') {
$action = $_POST['action'] ?? 'create';
if ($action === 'create') {
$name = trim($_POST['name'] ?? '');
// Проверка: Проверить, пустое ли имя
if (empty($name)) {
echo json_encode(['status' => 'error', 'message' => 'Название комнаты обязательно']);
exit;
}
// Проверка: Проверить длину имени (мин 3, макс 50 символов)
if (mb_strlen($name) < 3) {
echo json_encode(['status' => 'error', 'message' => 'Название должно быть минимум 3 символа']);
exit;
}
if (mb_strlen($name) > 50) {
echo json_encode(['status' => 'error', 'message' => 'Название не должно превышать 50 символов']);
exit;
}
try {
// Проверить, сколько комнат создал пользователь
$stmt = $pdo->prepare("SELECT COUNT(*) as count FROM rooms WHERE created_by = ?");
$stmt->execute([$userId]);
$result = $stmt->fetch();
// Лимит: Максимум 10 комнат на пользователя (администраторы могут создавать неограниченно)
$isAdmin = ($_SESSION['role'] ?? '') === 'admin' || $_SESSION['user_id'] == 1;
if (!$isAdmin && $result['count'] >= 10) {
echo json_encode(['status' => 'error', 'message' => 'Вы достигли лимита в 10 комнат']);
exit;
}
// Проверить, существует ли уже имя комнаты
$stmt = $pdo->prepare("SELECT id FROM rooms WHERE name = ?");
$stmt->execute([$name]);
if ($stmt->fetch()) {
echo json_encode(['status' => 'error', 'message' => 'Комната с таким названием уже существует']);
exit;
}
// Создать комнату
$stmt = $pdo->prepare("INSERT INTO rooms (name, created_by) VALUES (?, ?)");
$stmt->execute([$name, $userId]);
echo json_encode(['status' => 'success', 'id' => $pdo->lastInsertId()]);
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => 'Ошибка базы данных: ' . $e->getMessage()]);
}
} elseif ($action === 'toggle_bot') {
$roomId = intval($_POST['room_id'] ?? 0);
$active = intval($_POST['active'] ?? 0);
// Общую комнату (ID=1) никто не может редактировать
if ($roomId == 1) {
echo json_encode(['status' => 'error', 'message' => 'General room cannot be edited']);
exit;
}
try {
// Проверить, является ли администратором или владельцем
$stmt = $pdo->prepare("SELECT created_by FROM rooms WHERE id = ?");
$stmt->execute([$roomId]);
$room = $stmt->fetch();
if (!$room) {
echo json_encode(['status' => 'error', 'message' => 'Room not found']);
exit;
}
$isAdmin = ($_SESSION['role'] ?? '') === 'admin' || $_SESSION['user_id'] == 1;
$canEdit = $isAdmin || $room['created_by'] == $userId;
if ($canEdit) {
$stmt = $pdo->prepare("UPDATE rooms SET bot_active = ? WHERE id = ?");
$stmt->execute([$active, $roomId]);
echo json_encode(['status' => 'success', 'bot_active' => $active]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Unauthorized']);
}
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
}
}
// PUT: Переименовать комнату (тело JSON)
if ($method === 'PUT') {
$data = json_decode(file_get_contents('php://input'), true);
$roomId = $data['id'] ?? null;
$newName = trim($data['name'] ?? '');
if (!$roomId || empty($newName)) {
echo json_encode(['status' => 'error', 'message' => 'Invalid data']);
exit;
}
// Проверка: Проверить длину имени (мин 3, макс 10 символов)
if (mb_strlen($newName) < 3) {
echo json_encode(['status' => 'error', 'message' => 'Room name must be at least 3 characters']);
exit;
}
if (mb_strlen($newName) > 10) {
echo json_encode(['status' => 'error', 'message' => 'Room name must not exceed 10 characters']);
exit;
}
// General room (ID=1) cannot be edited by anyone
if ($roomId == 1) {
echo json_encode(['status' => 'error', 'message' => 'General room cannot be edited']);
exit;
}
try {
// Проверка прав
$stmt = $pdo->prepare("SELECT created_by FROM rooms WHERE id = ?");
$stmt->execute([$roomId]);
$room = $stmt->fetch();
if (!$room) {
echo json_encode(['status' => 'error', 'message' => 'Room not found']);
exit;
}
$isAdmin = ($_SESSION['role'] ?? '') === 'admin' || $_SESSION['user_id'] == 1;
$canEdit = $isAdmin || $room['created_by'] == $userId;
if ($canEdit) {
$stmt = $pdo->prepare("UPDATE rooms SET name = ? WHERE id = ?");
$stmt->execute([$newName, $roomId]);
echo json_encode(['status' => 'success']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Not authorized']);
}
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
}
// DELETE: Удалить комнату
if ($method === 'DELETE') {
$data = json_decode(file_get_contents('php://input'), true);
$roomId = $data['id'] ?? null;
if (!$roomId) {
echo json_encode(['status' => 'error', 'message' => 'ID required']);
exit;
}
if ($roomId == 1) { // Предотвратить удаление Общей комнаты
echo json_encode(['status' => 'error', 'message' => 'Cannot delete General room']);
exit;
}
try {
$isAdmin = ($_SESSION['role'] ?? '') === 'admin' || $_SESSION['user_id'] == 1;
if ($isAdmin) {
$stmt = $pdo->prepare("DELETE FROM rooms WHERE id = ?");
$stmt->execute([$roomId]);
} else {
$stmt = $pdo->prepare("DELETE FROM rooms WHERE id = ? AND created_by = ?");
$stmt->execute([$roomId, $userId]);
}
if ($stmt->rowCount() > 0) {
$pdo->prepare("DELETE FROM messages WHERE room_id = ?")->execute([$roomId]);
echo json_encode(['status' => 'success']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Not authorized or room not found']);
}
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
}