186 lines
4.6 KiB
JavaScript
186 lines
4.6 KiB
JavaScript
/**
|
|
* Script to upload test documents to MinIO
|
|
*/
|
|
|
|
const { S3Client, PutObjectCommand, CreateBucketCommand } = require('@aws-sdk/client-s3');
|
|
const { Client: PgClient } = require('pg');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
require('dotenv').config();
|
|
|
|
const MINIO_ENDPOINT = process.env.AWS_S3_ENDPOINT || 'http://localhost:9000';
|
|
const BUCKET_NAME = 'xpeditis-documents';
|
|
|
|
// Initialize MinIO client
|
|
const s3Client = new S3Client({
|
|
region: 'us-east-1',
|
|
endpoint: MINIO_ENDPOINT,
|
|
credentials: {
|
|
accessKeyId: process.env.AWS_ACCESS_KEY_ID || 'minioadmin',
|
|
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'minioadmin',
|
|
},
|
|
forcePathStyle: true,
|
|
});
|
|
|
|
// Create a simple PDF buffer (minimal valid PDF)
|
|
function createTestPDF(title) {
|
|
return Buffer.from(
|
|
`%PDF-1.4
|
|
1 0 obj
|
|
<<
|
|
/Type /Catalog
|
|
/Pages 2 0 R
|
|
>>
|
|
endobj
|
|
2 0 obj
|
|
<<
|
|
/Type /Pages
|
|
/Kids [3 0 R]
|
|
/Count 1
|
|
>>
|
|
endobj
|
|
3 0 obj
|
|
<<
|
|
/Type /Page
|
|
/Parent 2 0 R
|
|
/MediaBox [0 0 612 792]
|
|
/Contents 4 0 R
|
|
/Resources <<
|
|
/Font <<
|
|
/F1 <<
|
|
/Type /Font
|
|
/Subtype /Type1
|
|
/BaseFont /Helvetica
|
|
>>
|
|
>>
|
|
>>
|
|
>>
|
|
endobj
|
|
4 0 obj
|
|
<<
|
|
/Length 100
|
|
>>
|
|
stream
|
|
BT
|
|
/F1 24 Tf
|
|
100 700 Td
|
|
(${title}) Tj
|
|
ET
|
|
endstream
|
|
endobj
|
|
xref
|
|
0 5
|
|
0000000000 65535 f
|
|
0000000009 00000 n
|
|
0000000058 00000 n
|
|
0000000115 00000 n
|
|
0000000300 00000 n
|
|
trailer
|
|
<<
|
|
/Size 5
|
|
/Root 1 0 R
|
|
>>
|
|
startxref
|
|
450
|
|
%%EOF`,
|
|
'utf-8'
|
|
);
|
|
}
|
|
|
|
async function uploadTestDocuments() {
|
|
const pgClient = new PgClient({
|
|
host: process.env.DATABASE_HOST || 'localhost',
|
|
port: process.env.DATABASE_PORT || 5432,
|
|
user: process.env.DATABASE_USER || 'xpeditis',
|
|
password: process.env.DATABASE_PASSWORD || 'xpeditis_dev_password',
|
|
database: process.env.DATABASE_NAME || 'xpeditis_dev',
|
|
});
|
|
|
|
try {
|
|
// Connect to database
|
|
await pgClient.connect();
|
|
console.log('✅ Connected to database');
|
|
|
|
// Create bucket if it doesn't exist
|
|
try {
|
|
await s3Client.send(new CreateBucketCommand({ Bucket: BUCKET_NAME }));
|
|
console.log(`✅ Created bucket: ${BUCKET_NAME}`);
|
|
} catch (error) {
|
|
if (error.name === 'BucketAlreadyOwnedByYou' || error.Code === 'BucketAlreadyOwnedByYou') {
|
|
console.log(`✅ Bucket already exists: ${BUCKET_NAME}`);
|
|
} else {
|
|
console.log(`⚠️ Could not create bucket (might already exist): ${error.message}`);
|
|
}
|
|
}
|
|
|
|
// Get all CSV bookings with documents
|
|
const result = await pgClient.query(
|
|
`SELECT id, documents FROM csv_bookings WHERE documents IS NOT NULL`
|
|
);
|
|
|
|
console.log(`\n📄 Found ${result.rows.length} bookings with documents\n`);
|
|
|
|
let uploadedCount = 0;
|
|
|
|
for (const row of result.rows) {
|
|
const bookingId = row.id;
|
|
const documents = row.documents;
|
|
|
|
console.log(`\n📦 Processing booking: ${bookingId}`);
|
|
|
|
for (const doc of documents) {
|
|
if (!doc.filePath || !doc.filePath.includes(MINIO_ENDPOINT)) {
|
|
console.log(` ⏭️ Skipping document (not a MinIO URL): ${doc.fileName}`);
|
|
continue;
|
|
}
|
|
|
|
// Extract the S3 key from the URL
|
|
const url = new URL(doc.filePath);
|
|
const key = url.pathname.substring(1).replace(`${BUCKET_NAME}/`, '');
|
|
|
|
// Create test PDF content
|
|
const pdfContent = createTestPDF(doc.fileName || 'Test Document');
|
|
|
|
try {
|
|
// Upload to MinIO
|
|
await s3Client.send(
|
|
new PutObjectCommand({
|
|
Bucket: BUCKET_NAME,
|
|
Key: key,
|
|
Body: pdfContent,
|
|
ContentType: doc.mimeType || 'application/pdf',
|
|
})
|
|
);
|
|
|
|
console.log(` ✅ Uploaded: ${doc.fileName}`);
|
|
console.log(` Path: ${key}`);
|
|
uploadedCount++;
|
|
} catch (error) {
|
|
console.error(` ❌ Failed to upload ${doc.fileName}:`, error.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(`\n🎉 Successfully uploaded ${uploadedCount} test documents to MinIO`);
|
|
console.log(`\n📍 MinIO Console: http://localhost:9001`);
|
|
console.log(` Username: minioadmin`);
|
|
console.log(` Password: minioadmin`);
|
|
} catch (error) {
|
|
console.error('❌ Error:', error);
|
|
throw error;
|
|
} finally {
|
|
await pgClient.end();
|
|
console.log('\n👋 Disconnected from database');
|
|
}
|
|
}
|
|
|
|
uploadTestDocuments()
|
|
.then(() => {
|
|
console.log('\n✅ Script completed successfully');
|
|
process.exit(0);
|
|
})
|
|
.catch((error) => {
|
|
console.error('\n❌ Script failed:', error);
|
|
process.exit(1);
|
|
});
|