feat(media): complete mvp1 media foundation workflows

This commit is contained in:
2026-02-11 22:56:01 +01:00
parent d727ab8b5b
commit ad351ed73a
9 changed files with 1028 additions and 8 deletions

View File

@@ -1,3 +1,11 @@
import {
attachArtworkRenditionInputSchema,
createArtworkInputSchema,
createGroupingInputSchema,
createMediaAssetInputSchema,
linkArtworkGroupingInputSchema,
} from "@cms/content"
import { db } from "./client"
export async function listMediaAssets(limit = 24) {
@@ -67,6 +75,169 @@ export async function listArtworks(limit = 24) {
})
}
export async function listMediaFoundationGroups() {
const [galleries, albums, categories, tags] = await Promise.all([
db.gallery.findMany({
orderBy: [{ sortOrder: "asc" }, { name: "asc" }],
}),
db.album.findMany({
orderBy: [{ sortOrder: "asc" }, { name: "asc" }],
}),
db.category.findMany({
orderBy: [{ sortOrder: "asc" }, { name: "asc" }],
}),
db.tag.findMany({
orderBy: { name: "asc" },
}),
])
return {
galleries,
albums,
categories,
tags,
}
}
export async function createMediaAsset(input: unknown) {
const payload = createMediaAssetInputSchema.parse(input)
return db.mediaAsset.create({
data: payload,
})
}
export async function createArtwork(input: unknown) {
const payload = createArtworkInputSchema.parse(input)
return db.artwork.create({
data: payload,
})
}
export async function createGallery(input: unknown) {
const payload = createGroupingInputSchema.parse(input)
return db.gallery.create({
data: payload,
})
}
export async function createAlbum(input: unknown) {
const payload = createGroupingInputSchema.parse(input)
return db.album.create({
data: payload,
})
}
export async function createCategory(input: unknown) {
const payload = createGroupingInputSchema.parse(input)
return db.category.create({
data: payload,
})
}
export async function createTag(input: unknown) {
const payload = createGroupingInputSchema
.pick({
name: true,
slug: true,
})
.parse(input)
return db.tag.create({
data: payload,
})
}
export async function linkArtworkToGrouping(input: unknown) {
const payload = linkArtworkGroupingInputSchema.parse(input)
if (payload.groupType === "gallery") {
return db.artworkGallery.upsert({
where: {
artworkId_galleryId: {
artworkId: payload.artworkId,
galleryId: payload.groupId,
},
},
create: {
artworkId: payload.artworkId,
galleryId: payload.groupId,
},
update: {},
})
}
if (payload.groupType === "album") {
return db.artworkAlbum.upsert({
where: {
artworkId_albumId: {
artworkId: payload.artworkId,
albumId: payload.groupId,
},
},
create: {
artworkId: payload.artworkId,
albumId: payload.groupId,
},
update: {},
})
}
if (payload.groupType === "category") {
return db.artworkCategory.upsert({
where: {
artworkId_categoryId: {
artworkId: payload.artworkId,
categoryId: payload.groupId,
},
},
create: {
artworkId: payload.artworkId,
categoryId: payload.groupId,
},
update: {},
})
}
return db.artworkTag.upsert({
where: {
artworkId_tagId: {
artworkId: payload.artworkId,
tagId: payload.groupId,
},
},
create: {
artworkId: payload.artworkId,
tagId: payload.groupId,
},
update: {},
})
}
export async function attachArtworkRendition(input: unknown) {
const payload = attachArtworkRenditionInputSchema.parse(input)
return db.artworkRendition.upsert({
where: {
artworkId_slot: {
artworkId: payload.artworkId,
slot: payload.slot,
},
},
create: payload,
update: {
mediaAssetId: payload.mediaAssetId,
width: payload.width,
height: payload.height,
isPrimary: payload.isPrimary,
},
})
}
export async function getMediaFoundationSummary() {
const [mediaAssets, artworks, galleries, albums, categories, tags] = await Promise.all([
db.mediaAsset.count(),