39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
export default defineEventHandler(async (event) => {
|
|
const form = await readMultipartFormData(event)
|
|
if (!form?.length) {
|
|
throw createError({ statusCode: 400, statusMessage: 'Expected an image upload' })
|
|
}
|
|
const fields: Record<string, string> = {}
|
|
let image: { filename: string; data: Buffer; type?: string } | null = null
|
|
for (const part of form) {
|
|
if (part.name === 'image' && part.filename && part.data?.length) {
|
|
image = { filename: part.filename, data: part.data, type: part.type }
|
|
} else if (part.name && part.data) {
|
|
fields[part.name] = part.data.toString('utf8')
|
|
}
|
|
}
|
|
if (!image) {
|
|
throw createError({ statusCode: 400, statusMessage: 'An image is required' })
|
|
}
|
|
const { owner } = assertLibraryOwner(event)
|
|
const library = publicLibrary(event)
|
|
const folderId = library.folders.some(folder => folder.id === fields.folderId)
|
|
? fields.folderId
|
|
: library.folders[0]?.id
|
|
if (!folderId) {
|
|
throw createError({ statusCode: 400, statusMessage: 'Create a library folder first' })
|
|
}
|
|
assertFolderExists(event, folderId)
|
|
const still = await saveStill({
|
|
ownerKey: owner,
|
|
folderId,
|
|
filename: image.filename,
|
|
data: image.data,
|
|
width: Number(fields.width || 0),
|
|
height: Number(fields.height || 0),
|
|
hideInput: fields.hideInput === 'true',
|
|
role: 'input'
|
|
})
|
|
return { still: still || undefined, ...publicLibrary(event) }
|
|
})
|