View file api/rooms.php

File size: 8.24Kb
<?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()]);
    }
}