53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
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' })
|
|
})
|