74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
import { websiteConfig } from '@/config/website';
|
|
import { storageConfig } from './config/storage-config';
|
|
import { S3Provider } from './provider/s3';
|
|
import type { StorageConfig, StorageProvider, UploadFileResult } from './types';
|
|
|
|
/**
|
|
* Default storage configuration
|
|
*/
|
|
export const defaultStorageConfig: StorageConfig = storageConfig;
|
|
|
|
/**
|
|
* Global storage provider instance
|
|
*/
|
|
let storageProvider: StorageProvider | null = null;
|
|
|
|
/**
|
|
* Get the storage provider
|
|
* @returns current storage provider instance
|
|
* @throws Error if provider is not initialized
|
|
*/
|
|
export const getStorageProvider = (): StorageProvider => {
|
|
if (!storageProvider) {
|
|
return initializeStorageProvider();
|
|
}
|
|
return storageProvider;
|
|
};
|
|
|
|
/**
|
|
* Initialize the storage provider
|
|
* @returns initialized storage provider
|
|
*/
|
|
export const initializeStorageProvider = (): StorageProvider => {
|
|
if (!storageProvider) {
|
|
if (websiteConfig.storage.provider === 's3') {
|
|
storageProvider = new S3Provider();
|
|
} else {
|
|
throw new Error(
|
|
`Unsupported storage provider: ${websiteConfig.storage.provider}`
|
|
);
|
|
}
|
|
}
|
|
return storageProvider;
|
|
};
|
|
|
|
/**
|
|
* Uploads a file to the configured storage provider
|
|
*
|
|
* @param file - The file to upload (Buffer or Blob)
|
|
* @param filename - Original filename with extension
|
|
* @param contentType - MIME type of the file
|
|
* @param folder - Optional folder path to store the file in
|
|
* @returns Promise with the URL of the uploaded file and its storage key
|
|
*/
|
|
export const uploadFile = async (
|
|
file: Buffer | Blob,
|
|
filename: string,
|
|
contentType: string,
|
|
folder?: string
|
|
): Promise<UploadFileResult> => {
|
|
const provider = getStorageProvider();
|
|
return provider.uploadFile({ file, filename, contentType, folder });
|
|
};
|
|
|
|
/**
|
|
* Deletes a file from the storage provider
|
|
*
|
|
* @param key - The storage key of the file to delete
|
|
* @returns Promise that resolves when the file is deleted
|
|
*/
|
|
export const deleteFile = async (key: string): Promise<void> => {
|
|
const provider = getStorageProvider();
|
|
return provider.deleteFile(key);
|
|
};
|