| |
|
|
| const DB_NAME = 'AlphaChatFileStore'; |
| const STORE_NAME = 'files'; |
| |
| const DB_VERSION = 2; |
|
|
| let db; |
|
|
| |
| export function initDB() { |
| return new Promise((resolve, reject) => { |
| console.log(`در حال تلاش برای باز کردن دیتابیس ${DB_NAME} با نسخه ${DB_VERSION}...`); |
| const request = indexedDB.open(DB_NAME, DB_VERSION); |
|
|
| request.onerror = (event) => { |
| console.error("خطای حیاتی در باز کردن IndexedDB:", event.target.error); |
| reject("خطای دیتابیس. لطفا از فعال بودن کوکیها و فضای ذخیرهسازی مرورگر اطمینان حاصل کنید."); |
| }; |
|
|
| request.onsuccess = (event) => { |
| db = event.target.result; |
| console.log("IndexedDB با موفقیت باز و آماده استفاده است."); |
| resolve(db); |
| }; |
|
|
| |
| request.onupgradeneeded = (event) => { |
| console.log("رویداد onupgradeneeded فعال شد. در حال ارتقا ساختار دیتابیس..."); |
| const db = event.target.result; |
| |
| |
| |
| if (db.objectStoreNames.contains(STORE_NAME)) { |
| |
| db.deleteObjectStore(STORE_NAME); |
| console.log("Object store قدیمی 'files' پیدا و برای ارتقا حذف شد."); |
| } |
| |
| |
| |
| |
| const store = db.createObjectStore(STORE_NAME, { autoIncrement: true }); |
| |
| |
| store.createIndex('timestamp', 'timestamp', { unique: false }); |
| console.log("Object store جدید و صحیح 'files' با موفقیت ساخته شد."); |
| }; |
| }); |
| } |
|
|
| |
| export function storeFile(file) { |
| return new Promise((resolve, reject) => { |
| if (!db) { |
| |
| reject("دیتابیس هنوز مقداردهی اولیه نشده است."); |
| return; |
| } |
| const transaction = db.transaction([STORE_NAME], 'readwrite'); |
| const store = transaction.objectStore(STORE_NAME); |
| const fileRecord = { |
| file: file, |
| name: file.name, |
| type: file.type, |
| timestamp: Date.now() |
| }; |
| |
| const request = store.add(fileRecord); |
|
|
| request.onsuccess = (event) => { |
| |
| resolve(event.target.result); |
| }; |
|
|
| request.onerror = (event) => { |
| console.error("خطا در ذخیره فایل در IndexedDB:", event.target.error); |
| reject("ذخیره فایل در دیتابیس محلی ناموفق بود."); |
| }; |
| }); |
| } |
|
|
| |
| export function getFile(id) { |
| return new Promise((resolve, reject) => { |
| if (!db) { |
| reject("دیتابیس مقداردهی اولیه نشده است."); |
| return; |
| } |
| |
| |
| |
| const numericId = typeof id === 'string' ? parseInt(id, 10) : id; |
| if (isNaN(numericId)) { |
| reject("ID فایل برای بازیابی نامعتبر است."); |
| return; |
| } |
| |
| const transaction = db.transaction([STORE_NAME], 'readonly'); |
| const store = transaction.objectStore(STORE_NAME); |
| const request = store.get(numericId); |
|
|
| request.onsuccess = (event) => { |
| if (event.target.result) { |
| |
| resolve(event.target.result.file); |
| } else { |
| reject("فایلی با این ID در دیتابیس محلی یافت نشد."); |
| } |
| }; |
|
|
| request.onerror = (event) => { |
| console.error("خطا در بازیابی فایل:", event.target.error); |
| reject("بازیابی فایل ناموفق بود."); |
| }; |
| }); |
| } |
|
|
| |
| export function cleanupOldFiles() { |
| return new Promise((resolve, reject) => { |
| if (!db) { |
| reject("دیتابیس مقداردهی اولیه نشده است."); |
| return; |
| } |
| const transaction = db.transaction([STORE_NAME], 'readwrite'); |
| const store = transaction.objectStore(STORE_NAME); |
| const index = store.index('timestamp'); |
| |
| const oneWeekAgo = Date.now() - (7 * 24 * 60 * 60 * 1000); |
| const range = IDBKeyRange.upperBound(oneWeekAgo); |
| |
| const request = index.openCursor(range); |
| let deletedCount = 0; |
|
|
| request.onsuccess = (event) => { |
| const cursor = event.target.result; |
| if (cursor) { |
| cursor.delete(); |
| deletedCount++; |
| cursor.continue(); |
| } else { |
| if(deletedCount > 0) console.log(`${deletedCount} فایل قدیمی و منقضی شده از IndexedDB پاک شد.`); |
| resolve(); |
| } |
| }; |
|
|
| request.onerror = (event) => { |
| console.error("خطا در پاکسازی فایلهای قدیمی:", event.target.error); |
| reject("پاکسازی فایلهای قدیمی ناموفق بود."); |
| }; |
| }); |
| } |