unboundedpress/portfolio/server/api/admin/files.js

53 lines
1.4 KiB
JavaScript
Raw Normal View History

import { readdirSync, statSync, unlinkSync, writeFileSync, existsSync } from 'node:fs'
import { join, extname } from 'node:path'
const publicDir = './public'
const allowedFolders = ['scores', 'pubs', 'album_art', 'images', 'hdp_images']
function getFolderPath(folder) {
return join(publicDir, folder)
}
export default defineEventHandler(async (event) => {
const method = event.method
const query = getQuery(event)
const folder = query.folder
if (!folder || !allowedFolders.includes(folder)) {
throw createError({ statusCode: 400, message: 'Invalid folder' })
}
const folderPath = getFolderPath(folder)
if (!existsSync(folderPath)) {
throw createError({ statusCode: 404, message: 'Folder not found' })
}
if (method === 'GET') {
const files = readdirSync(folderPath)
.filter(f => statSync(join(folderPath, f)).isFile())
.map(f => ({
name: f,
size: statSync(join(folderPath, f)).size,
url: `/${folder}/${f}`
}))
return files
}
if (method === 'DELETE') {
const filename = query.file
if (!filename) {
throw createError({ statusCode: 400, message: 'Filename required' })
}
const filePath = join(folderPath, filename)
if (existsSync(filePath)) {
unlinkSync(filePath)
return { success: true }
}
throw createError({ statusCode: 404, message: 'File not found' })
}
throw createError({ statusCode: 405, message: 'Method not allowed' })
})