File Manager V1.5

[SYSTEM@ROOT]: /var/www/html/
INJECT_FILE:
NEW_ENTRY:

FILE_CONTENT: get_chats.php

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS");
header("Access-Control-Allow-Headers: Authorization, Content-Type, Accept, X-Requested-With, User-Agent, Origin");
header("Access-Control-Max-Age: 86400");
header("Content-Type: application/json; charset=UTF-8");

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    http_response_code(405);
    echo json_encode(["success" => false, "message" => "Only GET method allowed"]);
    exit;
}

require 'vendor/autoload.php';
require 'db.php';
use Dotenv\Dotenv;

try {
    $dotenv = Dotenv::createImmutable(__DIR__);
    $dotenv->load();
} catch (Exception $e) {
    // Используем настройки из db.php, если .env недоступен
}

// Проверка авторизации
$token = getAuthToken();

if (!$token) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Authorization required']);
    exit;
}

$decoded = verifyToken($token);

if (!$decoded) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Invalid token']);
    exit;
}

$pdo = getPDO();
$userType = (int)$decoded['user_type']; // Явно преобразуем в int
// Администраторами считаются user_type >= 1 (все кроме обычных пользователей с типом 0)
$isAdmin = ($userType >= 1);

// Только администраторы могут видеть список чатов
if (!$isAdmin) {
    http_response_code(403);
    echo json_encode([
        'success' => false, 
        'message' => 'Access denied. Admin only.'
    ]);
    exit;
}

try {
    // Получаем список всех чатов с информацией о пользователе и последним сообщением
    $stmt = $pdo->prepare("
        SELECT 
            c.id,
            c.user_id,
            c.user_type,
            c.created_at,
            c.updated_at,
            (
                SELECT COUNT(*) 
                FROM messages m 
                WHERE m.chat_id = c.id AND m.sender_type = 0 AND m.is_read = 0
            ) as unread_count,
            (
                SELECT m.message 
                FROM messages m 
                WHERE m.chat_id = c.id 
                ORDER BY m.created_at DESC 
                LIMIT 1
            ) as last_message,
            (
                SELECT m.created_at 
                FROM messages m 
                WHERE m.chat_id = c.id 
                ORDER BY m.created_at DESC 
                LIMIT 1
            ) as last_message_time
        FROM chats c
        ORDER BY c.updated_at DESC
    ");
    $stmt->execute();
    $chats = $stmt->fetchAll();
    
    // Для каждого чата получаем информацию о пользователе
    foreach ($chats as &$chat) {
        $tableName = match((int)$chat['user_type']) {
            0 => 'individusers',
            1 => 'companyusers',
            2 => 'leasingmanagers',
        };
        
        $stmt = $pdo->prepare("SELECT id, number, first_name, last_name, company_name FROM $tableName WHERE id = ?");
        $stmt->execute([$chat['user_id']]);
        $user = $stmt->fetch();
        
        if ($user) {
            // Формируем имя пользователя
            if ($chat['user_type'] == 0) {
                // Индивидуальный пользователь
                $name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? ''));
                if (empty($name)) {
                    $name = $user['number'];
                }
            } elseif ($chat['user_type'] == 1) {
                // Компания
                $name = $user['company_name'] ?? $user['number'];
            } else {
                // Менеджер лизинга
                $name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? ''));
                if (empty($name)) {
                    $name = $user['company_name'] ?? $user['number'];
                }
            }
            
            $chat['user_name'] = $name;
            $chat['user_phone'] = $user['number'];
        } else {
            $chat['user_name'] = 'Unknown User';
            $chat['user_phone'] = '';
        }
        
        // Преобразуем unread_count в integer
        $chat['unread_count'] = (int)$chat['unread_count'];
    }
    unset($chat);
    
    echo json_encode([
        'success' => true,
        'data' => $chats
    ]);
    
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}

[ KEMBALI ]