74 lines
2.5 KiB
TypeScript
74 lines
2.5 KiB
TypeScript
// scripts/fill-file-sizes.ts
|
|
import 'dotenv/config';
|
|
import { db } from '../../db';
|
|
import { files } from '../../db/schema';
|
|
import { eq, isNull } from 'drizzle-orm';
|
|
import { HeadObjectCommand } from "@aws-sdk/client-s3";
|
|
import { s3, initS3 } from '../utils/s3';
|
|
import { loadSecrets, secrets } from '../utils/secrets';
|
|
|
|
async function migrate() {
|
|
console.log("🚀 Starte Migration der Dateigrößen...");
|
|
|
|
// 1. Setup
|
|
await loadSecrets();
|
|
await initS3();
|
|
|
|
// 2. Alle Dateien holen, die noch keine Größe haben (oder alle, um sicherzugehen)
|
|
// Wir nehmen erstmal ALLE, um sicherzustellen, dass alles stimmt.
|
|
const allFiles = await db.select().from(files);
|
|
|
|
console.log(`📦 ${allFiles.length} Dateien in der Datenbank gefunden.`);
|
|
|
|
let successCount = 0;
|
|
let errorCount = 0;
|
|
|
|
// 3. Loop durch alle Dateien
|
|
for (const file of allFiles) {
|
|
if (!file.path) {
|
|
console.log(`⏭️ Überspringe Datei ${file.id} (Kein Pfad)`);
|
|
continue;
|
|
}
|
|
|
|
try {
|
|
// S3 fragen (HeadObject lädt nur Metadaten, nicht die ganze Datei -> Schnell)
|
|
const command = new HeadObjectCommand({
|
|
Bucket: secrets.S3_BUCKET, // Oder secrets.S3_BUCKET_NAME je nach deiner Config
|
|
Key: file.path
|
|
});
|
|
|
|
const response = await s3.send(command);
|
|
const size = response.ContentLength || 0;
|
|
|
|
// In DB speichern
|
|
await db.update(files)
|
|
.set({ size: size })
|
|
.where(eq(files.id, file.id));
|
|
|
|
process.stdout.write("."); // Fortschrittsanzeige
|
|
successCount++;
|
|
|
|
} catch (error: any) {
|
|
process.stdout.write("X");
|
|
// console.error(`\n❌ Fehler bei ${file.path}: ${error.name}`);
|
|
|
|
// Optional: Wenn Datei in S3 fehlt, könnten wir sie markieren oder loggen
|
|
if (error.name === 'NotFound') {
|
|
// console.error(` -> Datei existiert nicht im Bucket!`);
|
|
}
|
|
errorCount++;
|
|
}
|
|
}
|
|
|
|
console.log("\n\n------------------------------------------------");
|
|
console.log(`✅ Fertig!`);
|
|
console.log(`Updated: ${successCount}`);
|
|
console.log(`Fehler: ${errorCount} (Meistens Dateien, die im Bucket fehlen)`);
|
|
console.log("------------------------------------------------");
|
|
process.exit(0);
|
|
}
|
|
|
|
migrate().catch(err => {
|
|
console.error("Fataler Fehler:", err);
|
|
process.exit(1);
|
|
}); |