Vercel/src/services/storage/aws-s3.ts
2024-01-20 22:13:05 -06:00

65 lines
1.9 KiB
TypeScript

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)) ?? []);