import { ContainerClient, BlobServiceClient } from '@azure/storage-blob'; import * as fs from 'fs'; import { Readable } from 'stream'; import * as path from 'path'; const AZURE_STORAGE_CONNECTION_STRING = process.env.AZURE_STORAGE_CONNECTION_STRING; const extToType: { [suffix: string]: string } = { '.jpeg': 'image/jpeg', '.jpg': 'image/jpeg', '.png': 'image/png', '.svg': 'image/svg+xml', '.webp': 'image/webp', '.gif': 'image/gif', }; export class AzureManager { private _containerClient: ContainerClient; private _blobServiceClient: BlobServiceClient; private static _instance: AzureManager | undefined; public static CONTAINER_NAME = 'dashmedia'; public static STORAGE_ACCOUNT_NAME = 'dashblobstore'; public static BASE_STRING = `https://${AzureManager.STORAGE_ACCOUNT_NAME}.blob.core.windows.net/${AzureManager.CONTAINER_NAME}`; constructor() { if (!AZURE_STORAGE_CONNECTION_STRING) { throw new Error('Azure Storage Connection String Not Found'); } this._blobServiceClient = BlobServiceClient.fromConnectionString(AZURE_STORAGE_CONNECTION_STRING); this._containerClient = this.BlobServiceClient.getContainerClient(AzureManager.CONTAINER_NAME); } public static get Instance() { this._instance = this._instance ?? new AzureManager(); return this._instance; } public get BlobServiceClient() { return this._blobServiceClient; } public get ContainerClient() { return this._containerClient; } public static UploadBlob(filename: string, filepath: string, filetype: string) { const blockBlobClient = this.Instance.ContainerClient.getBlockBlobClient(filename); const blobOptions = { blobHTTPHeaders: { blobContentType: filetype } }; const stream = fs.createReadStream(filepath); return blockBlobClient.uploadStream(stream, undefined, undefined, blobOptions); } public static UploadBase64ImageBlob(filename: string, data: string, filetype?: string) { const confirmedFiletype = filetype ? filetype : extToType[path.extname(filename)]; const buffer = Buffer.from(data, 'base64'); const blockBlobClient = this.Instance.ContainerClient.getBlockBlobClient(filename); const blobOptions = { blobHTTPHeaders: { blobContentType: confirmedFiletype } }; return blockBlobClient.upload(buffer, buffer.length, blobOptions); } public static UploadBlobStream(stream: Readable, filename: string, filetype: string) { const blockBlobClient = this.Instance.ContainerClient.getBlockBlobClient(filename); const blobOptions = { blobHTTPHeaders: { blobContentType: filetype } }; return blockBlobClient.uploadStream(stream, undefined, undefined, blobOptions); } public static DeleteBlob(filename: string) { const blockBlobClient = this.Instance.ContainerClient.getBlockBlobClient(filename); return blockBlobClient.deleteIfExists(); } public static async GetBlobs() { const foundBlobs = []; for await (const blob of this.Instance.ContainerClient.listBlobsFlat()) { console.log(`${blob.name}`); const blobItem = { url: `https://${AzureManager.STORAGE_ACCOUNT_NAME}.blob.core.windows.net/${AzureManager.CONTAINER_NAME}/${blob.name}`, name: blob.name, }; foundBlobs.push(blobItem); } return foundBlobs; } }