feat(media): add admin media CRUD preview and storage cleanup

This commit is contained in:
2026-02-12 19:15:26 +01:00
parent 3e4f0b6c75
commit 7d9bc9dca9
11 changed files with 699 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"
import { DeleteObjectCommand, PutObjectCommand, S3Client } from "@aws-sdk/client-s3"
import { buildMediaStorageKey } from "@/lib/media/storage-key"
@@ -27,7 +27,7 @@ function parseBoolean(value: string | undefined): boolean {
return value?.toLowerCase() === "true"
}
function resolveS3Config(): S3Config {
export function resolveS3Config(): S3Config {
const bucket = process.env.CMS_MEDIA_S3_BUCKET?.trim()
const region = process.env.CMS_MEDIA_S3_REGION?.trim()
const accessKeyId = process.env.CMS_MEDIA_S3_ACCESS_KEY_ID?.trim()
@@ -50,7 +50,7 @@ function resolveS3Config(): S3Config {
}
}
function createS3Client(config: S3Config): S3Client {
export function createS3Client(config: S3Config): S3Client {
return new S3Client({
region: config.region,
endpoint: config.endpoint,
@@ -87,3 +87,17 @@ export async function storeUploadToS3(params: StoreS3UploadParams): Promise<Stor
return { storageKey }
}
export async function deleteS3Object(storageKey: string): Promise<boolean> {
const config = resolveS3Config()
const client = createS3Client(config)
await client.send(
new DeleteObjectCommand({
Bucket: config.bucket,
Key: storageKey,
}),
)
return true
}