Files
crm.clientright.ru/crm_extensions/file_storage/sync_db_with_s3.php
Fedor 9245768987 🚀 CRM Files Migration & Real-time Features
 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!
2025-10-24 19:59:28 +03:00

99 lines
3.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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";
}
?>