import { S3Client, CopyObjectCommand, DeleteObjectCommand, ListObjectsCommand, PutObjectCommand, } from '@aws-sdk/client-s3'; import { generateBlobId } from '.'; const AWS_S3_BUCKET = process.env.NEXT_PUBLIC_AWS_S3_BUCKET ?? ''; const AWS_S3_REGION = process.env.NEXT_PUBLIC_AWS_S3_REGION ?? ''; const AWS_S3_ACCESS_KEY = process.env.AWS_S3_ACCESS_KEY ?? ''; const AWS_S3_SECRET_ACCESS_KEY = process.env.AWS_S3_SECRET_ACCESS_KEY ?? ''; export const AWS_S3_BASE_URL = `https://${AWS_S3_BUCKET}.s3.${AWS_S3_REGION}.amazonaws.com`; export const awsS3Client = () => new S3Client({ region: AWS_S3_REGION, credentials: { accessKeyId: AWS_S3_ACCESS_KEY, secretAccessKey: AWS_S3_SECRET_ACCESS_KEY, }, }); export const isUrlFromAwsS3 = (url: string) => url.startsWith(AWS_S3_BASE_URL); const urlForKey = (key?: string) => `${AWS_S3_BASE_URL}/${key}`; export const awsS3PutObjectCommandForKey = (Key: string) => new PutObjectCommand({ Bucket: AWS_S3_BUCKET, Key, ACL: 'public-read' }); export const awsS3Copy = async ( fileNameSource: string, fileNameDestination: string, addRandomSuffix?: boolean, ) => { const name = fileNameSource.split('.')[0]; const extension = fileNameSource.split('.')[1]; const Key = addRandomSuffix ? `${name}-${generateBlobId()}.${extension}` : fileNameDestination; return awsS3Client().send(new CopyObjectCommand({ Bucket: AWS_S3_BUCKET, CopySource: fileNameSource, Key, ACL: 'public-read', })) .then(() => urlForKey(fileNameDestination)); }; export const awsS3Delete = async (Key: string) => { awsS3Client().send(new DeleteObjectCommand({ Bucket: AWS_S3_BUCKET, Key, })); }; export const awsS3List = async (Prefix: string) => awsS3Client().send(new ListObjectsCommand({ Bucket: AWS_S3_BUCKET, Prefix, })) .then((data) => data.Contents?.map(({ Key }) => urlForKey(Key)) ?? []);