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

@@ -7,11 +7,14 @@ export {
createGallery,
createMediaAsset,
createTag,
deleteMediaAsset,
getMediaAssetById,
getMediaFoundationSummary,
linkArtworkToGrouping,
listArtworks,
listMediaAssets,
listMediaFoundationGroups,
updateMediaAsset,
} from "./media-foundation"
export {
createPost,

View File

@@ -7,7 +7,7 @@ const { mockDb } = vi.hoisted(() => ({
artworkCategory: { upsert: vi.fn() },
artworkTag: { upsert: vi.fn() },
artworkRendition: { upsert: vi.fn() },
mediaAsset: { create: vi.fn() },
mediaAsset: { create: vi.fn(), findUnique: vi.fn(), update: vi.fn(), delete: vi.fn() },
artwork: { create: vi.fn() },
gallery: { create: vi.fn() },
album: { create: vi.fn() },
@@ -24,7 +24,10 @@ import {
attachArtworkRendition,
createArtwork,
createMediaAsset,
deleteMediaAsset,
getMediaAssetById,
linkArtworkToGrouping,
updateMediaAsset,
} from "./media-foundation"
describe("media foundation service", () => {
@@ -36,6 +39,15 @@ describe("media foundation service", () => {
if ("create" in value) {
value.create.mockReset()
}
if ("findUnique" in value) {
value.findUnique.mockReset()
}
if ("update" in value) {
value.update.mockReset()
}
if ("delete" in value) {
value.delete.mockReset()
}
}
})
@@ -90,4 +102,22 @@ describe("media foundation service", () => {
expect(mockDb.mediaAsset.create).toHaveBeenCalledTimes(1)
expect(mockDb.artwork.create).toHaveBeenCalledTimes(1)
})
it("handles media asset read/update/delete operations", async () => {
mockDb.mediaAsset.findUnique.mockResolvedValue({ id: "asset-1" })
mockDb.mediaAsset.update.mockResolvedValue({ id: "asset-1", title: "Updated" })
mockDb.mediaAsset.delete.mockResolvedValue({ id: "asset-1" })
await getMediaAssetById("asset-1")
await updateMediaAsset({
id: "c58f3aca-f958-4079-b2df-c9edf3a5fb0a",
title: "Updated",
tags: ["a", "b"],
})
await deleteMediaAsset("asset-1")
expect(mockDb.mediaAsset.findUnique).toHaveBeenCalledTimes(1)
expect(mockDb.mediaAsset.update).toHaveBeenCalledTimes(1)
expect(mockDb.mediaAsset.delete).toHaveBeenCalledTimes(1)
})
})

View File

@@ -4,6 +4,7 @@ import {
createGroupingInputSchema,
createMediaAssetInputSchema,
linkArtworkGroupingInputSchema,
updateMediaAssetInputSchema,
} from "@cms/content"
import { db } from "./client"
@@ -107,6 +108,28 @@ export async function createMediaAsset(input: unknown) {
})
}
export async function getMediaAssetById(id: string) {
return db.mediaAsset.findUnique({
where: { id },
})
}
export async function updateMediaAsset(input: unknown) {
const payload = updateMediaAssetInputSchema.parse(input)
const { id, ...data } = payload
return db.mediaAsset.update({
where: { id },
data,
})
}
export async function deleteMediaAsset(id: string) {
return db.mediaAsset.delete({
where: { id },
})
}
export async function createArtwork(input: unknown) {
const payload = createArtworkInputSchema.parse(input)