feat: batch favorites endpoint + frontend dedup fixes

Backend:
- Add POST /api/favorites/batch endpoint (single multi-row INSERT)
- Add BatchFavoritesResult/BatchFavoritesStats DTOs
- Add batch methods to ports, service, PG repository
- Transaction-based insert with ON CONFLICT DO NOTHING, chunking at 5000

Frontend:
- Rewrite batchFavorites() to single API call (40 requests → 1)
- Add _replaceCacheFromResponse() to avoid extra GET round-trip
- Centralize formatFileSize, isTextViewable, formatDateTime, formatDateShort
- Remove duplicate icon mapping from app.js
- Fix inconsistent quota defaults (10GB everywhere)
This commit is contained in:
Dionisio
2026-02-16 09:17:54 +01:00
parent fb652c07e3
commit d6c4eb884d
17 changed files with 433 additions and 141 deletions
+4 -16
View File
@@ -319,10 +319,7 @@ class FileRenderer {
elem.dataset.folderName = item.name;
elem.dataset.parentId = item.parent_id || "";
// Format date
const modifiedDate = new Date(item.modified_at * 1000);
const formattedDate = modifiedDate.toLocaleDateString() + ' ' +
modifiedDate.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
const formattedDate = window.formatDateTime(item.modified_at);
elem.innerHTML = `
<div class="name-cell">
@@ -375,10 +372,7 @@ class FileRenderer {
// Format file size and date
const fileSize = item.size_formatted || this.formatFileSize(item.size);
// Format date
const modifiedDate = new Date(item.modified_at * 1000);
const formattedDate = modifiedDate.toLocaleDateString() + ' ' +
modifiedDate.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
const formattedDate = window.formatDateTime(item.modified_at);
elem.innerHTML = `
<div class="name-cell">
@@ -431,16 +425,10 @@ class FileRenderer {
}
/**
* Format file size in human-readable format
* Format file size — delegates to the single global definition in app.js
*/
formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
return window.formatFileSize ? window.formatFileSize(bytes) : `${bytes} Bytes`;
}
/**