✨ Features: - Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.) - Added Nextcloud folder buttons to ALL modules - Fixed Nextcloud editor integration - WebSocket server for real-time updates - Redis Pub/Sub integration - File path manager for organized storage - Redis caching for performance (Functions.php) 📁 New Structure: Documents/Project/ProjectName_ID/file_docID.ext Documents/Contacts/FirstName_LastName_ID/file_docID.ext Documents/Accounts/AccountName_ID/file_docID.ext 🔧 Technical: - FilePathManager for standardized paths - S3StorageService integration - WebSocket server (Node.js + Docker) - Redis cache for getBasicModuleInfo() - Predis library for Redis connectivity 📝 Scripts: - Migration scripts for all modules - Test pages for WebSocket/SSE/Polling - Documentation (MIGRATION_*.md, REDIS_*.md) 🎯 Result: 15,000+ files migrated successfully!
99 lines
3.2 KiB
PHP
99 lines
3.2 KiB
PHP
<?php
|
||
/**
|
||
* Синхронизация БД с реальными S3 ключами
|
||
* Обновляет filename в vtiger_notes чтобы указывать на правильные S3 ключи
|
||
*/
|
||
|
||
// Прямое подключение к БД через PDO
|
||
$dbConfig = [
|
||
'host' => 'localhost',
|
||
'dbname' => 'ci20465_72new',
|
||
'user' => 'ci20465_72new',
|
||
'pass' => 'EcY979Rn'
|
||
];
|
||
|
||
try {
|
||
$pdo = new PDO(
|
||
"mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']};charset=utf8",
|
||
$dbConfig['user'],
|
||
$dbConfig['pass']
|
||
);
|
||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||
echo "✅ Подключено к БД\n\n";
|
||
} catch (PDOException $e) {
|
||
die("❌ Ошибка подключения к БД: " . $e->getMessage() . "\n");
|
||
}
|
||
|
||
echo "🔄 СИНХРОНИЗАЦИЯ БД С S3 КЛЮЧАМИ\n";
|
||
echo "==========================================\n\n";
|
||
|
||
// Получаем файлы с S3 ключами но старыми filename
|
||
$stmt = $pdo->prepare("
|
||
SELECT notesid, title, filename, s3_key, s3_bucket
|
||
FROM vtiger_notes
|
||
WHERE s3_bucket IS NOT NULL
|
||
AND s3_key IS NOT NULL
|
||
AND filename LIKE '%crm2/CRM_Active_Files/Documents/%'
|
||
LIMIT 10
|
||
");
|
||
|
||
$stmt->execute();
|
||
$files = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||
|
||
echo "📊 Найдено файлов для синхронизации: " . count($files) . "\n\n";
|
||
|
||
$stats = ['processed' => 0, 'updated' => 0, 'errors' => 0];
|
||
|
||
foreach ($files as $file) {
|
||
$stats['processed']++;
|
||
|
||
$notesId = $file['notesid'];
|
||
$title = $file['title'] ?: "Без названия";
|
||
$oldFilename = $file['filename'];
|
||
$s3Key = $file['s3_key'];
|
||
$s3Bucket = $file['s3_bucket'];
|
||
|
||
echo "[$stats[processed]] Документ: $title (ID: $notesId)\n";
|
||
echo " Старый filename: " . substr($oldFilename, 0, 80) . "...\n";
|
||
echo " S3 ключ: $s3Key\n";
|
||
|
||
// Формируем новый filename на основе S3 ключа
|
||
$newFilename = "https://s3.twcstorage.ru/$s3Bucket/" . rawurlencode($s3Key);
|
||
|
||
echo " Новый filename: " . substr($newFilename, 0, 80) . "...\n";
|
||
|
||
// Обновляем БД
|
||
try {
|
||
$updateStmt = $pdo->prepare("UPDATE vtiger_notes SET filename = ? WHERE notesid = ?");
|
||
$updateStmt->execute([$newFilename, $notesId]);
|
||
|
||
$stats['updated']++;
|
||
echo " ✅ Обновлено\n\n";
|
||
|
||
} catch (Exception $e) {
|
||
echo " ❌ ОШИБКА: " . $e->getMessage() . "\n\n";
|
||
$stats['errors']++;
|
||
}
|
||
}
|
||
|
||
// Итоги
|
||
echo "\n==========================================\n";
|
||
echo "📊 СТАТИСТИКА:\n";
|
||
echo "==========================================\n";
|
||
echo "Обработано: $stats[processed]\n";
|
||
echo "Обновлено: $stats[updated]\n";
|
||
echo "Ошибок: $stats[errors]\n";
|
||
echo "\n";
|
||
|
||
if ($stats['errors'] == 0) {
|
||
echo "✅ СИНХРОНИЗАЦИЯ ЗАВЕРШЕНА УСПЕШНО!\n";
|
||
echo "\n📁 Теперь БД указывает на правильные S3 ключи в структуре crm/crm2/\n";
|
||
} else {
|
||
echo "⚠️ Синхронизация завершена с ошибками.\n";
|
||
}
|
||
?>
|
||
|
||
|
||
|
||
|