import api from './api'; interface PresignedUrlResponse { uploadUrl: string; publicUrl: string; key: string; } class UploadService { private basePath = '/upload'; /** * Get a presigned upload URL for S3 */ async getPresignedUploadUrl(filename: string, contentType: string, folder: string): Promise { const response = await api.post<{ data: PresignedUrlResponse }>( `${this.basePath}/presigned-url`, { filename, contentType, folder } ); return response.data.data; } /** * Upload a file to S3 using a presigned URL */ async uploadFileToS3(uploadUrl: string, file: File): Promise { await fetch(uploadUrl, { method: 'PUT', body: file, headers: { 'Content-Type': file.type }, }); } /** * Get a presigned download URL for an S3 key */ async getPresignedDownloadUrl(key: string): Promise { const response = await api.get<{ data: { url: string } }>( `${this.basePath}/presigned-download-url`, { params: { key } } ); return response.data.data.url; } /** * Check if a URL is an S3 key (not a full URL or local path) */ isS3Key(url: string | null | undefined): boolean { if (!url) return false; // S3 keys don't start with http or / return !url.startsWith('http') && !url.startsWith('/'); } } export const uploadService = new UploadService();