import { Client } from 'minio'; // Инициализация MinIO клиента через переменные окружения // Добавьте в .env: // MINIO_ENDPOINT=localhost // MINIO_PORT=9000 // MINIO_USE_SSL=false // MINIO_ACCESS_KEY=your_access_key // MINIO_SECRET_KEY=your_secret_key // MINIO_BUCKET_PREFIX=ospab const { MINIO_ENDPOINT, MINIO_PORT, MINIO_USE_SSL, MINIO_ACCESS_KEY, MINIO_SECRET_KEY } = process.env; export const minioClient = new Client({ endPoint: MINIO_ENDPOINT || 'localhost', port: MINIO_PORT ? parseInt(MINIO_PORT, 10) : 9000, useSSL: (MINIO_USE_SSL || 'false') === 'true', accessKey: MINIO_ACCESS_KEY || 'minioadmin', secretKey: MINIO_SECRET_KEY || 'minioadmin' }); export function buildPhysicalBucketName(userId: number, logicalName: string): string { const prefix = process.env.MINIO_BUCKET_PREFIX || 'ospab'; return `${prefix}-${userId}-${logicalName}`.toLowerCase(); } export function isMinioAuthError(err: unknown): boolean { if (!err || typeof err !== 'object') return false; const message = (err instanceof Error ? err.message : String(err)).toLowerCase(); return message.includes('invalidaccesskeyid') || message.includes('accesskeyid') || message.includes('invalid access key') || message.includes('signaturedoesnotmatch') || message.includes('signature does not match'); } export function isMinioNoSuchBucketError(err: unknown): boolean { if (!err || typeof err !== 'object') return false; const message = (err instanceof Error ? err.message : String(err)).toLowerCase(); return message.includes('nosuchbucket') || message.includes('notfound') || message.includes('no such bucket'); } export async function ensureBucketExists(bucketName: string, region: string): Promise { try { const exists = await minioClient.bucketExists(bucketName); if (!exists) { await minioClient.makeBucket(bucketName, region); } } catch (err: unknown) { if (isMinioAuthError(err)) { // Provide a more actionable error message for auth issues const e = new Error(`MinIO authentication failed for endpoint ${MINIO_ENDPOINT}:${MINIO_PORT}. Check MINIO_ACCESS_KEY/MINIO_SECRET_KEY environment variables.`); (e as any).code = 'MINIO_AUTH_ERROR'; throw e; } if (isMinioNoSuchBucketError(err)) { const e = new Error(`MinIO bucket error: bucket ${bucketName} not found or inaccessible.`); (e as any).code = 'MINIO_BUCKET_NOT_FOUND'; throw e; } throw err; } }