Files
waooplus/src/lib/assets/services/project-location-backed-selection.ts

76 lines
2.1 KiB
TypeScript

import { ApiError } from '@/lib/api-errors'
import { prisma } from '@/lib/prisma'
import { deleteObject } from '@/lib/storage'
import { resolveStorageKeyFromMediaValue } from '@/lib/media/service'
export async function confirmProjectLocationBackedSelection(assetId: string): Promise<{ success: true }> {
const location = await prisma.novelPromotionLocation.findUnique({
where: { id: assetId },
include: { images: { orderBy: { imageIndex: 'asc' } } },
})
if (!location) {
throw new ApiError('NOT_FOUND')
}
const selectedImage = location.selectedImageId
? location.images.find((image) => image.id === location.selectedImageId)
: location.images.find((image) => image.isSelected)
if (location.images.length <= 1) {
const onlyImage = location.images[0] ?? null
if (onlyImage) {
await prisma.$transaction(async (tx) => {
await tx.locationImage.update({
where: { id: onlyImage.id },
data: {
imageIndex: 0,
isSelected: true,
},
})
await tx.novelPromotionLocation.update({
where: { id: assetId },
data: { selectedImageId: onlyImage.id },
})
})
}
return { success: true }
}
if (!selectedImage || !selectedImage.imageUrl) {
throw new ApiError('INVALID_PARAMS')
}
const imagesToDelete = location.images.filter((image) => image.id !== selectedImage.id)
for (const image of imagesToDelete) {
if (!image.imageUrl) continue
const storageKey = await resolveStorageKeyFromMediaValue(image.imageUrl)
if (!storageKey) continue
try {
await deleteObject(storageKey)
} catch {
}
}
await prisma.$transaction(async (tx) => {
await tx.locationImage.deleteMany({
where: {
locationId: assetId,
id: { not: selectedImage.id },
},
})
await tx.locationImage.update({
where: { id: selectedImage.id },
data: {
imageIndex: 0,
isSelected: true,
},
})
await tx.novelPromotionLocation.update({
where: { id: assetId },
data: { selectedImageId: selectedImage.id },
})
})
return { success: true }
}