braindrops.nicwands.com/cms/src/libs/vite-plugin-meta-api.js
2026-07-17 11:24:36 -04:00

97 lines
3.4 KiB
JavaScript

import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
export function metaApiPlugin() {
let dropName = null
return {
name: 'meta-api-plugin',
configureServer(server) {
// Get the drop name from environment variable
dropName = process.env.DROP_NAME
if (!dropName) {
console.warn('⚠️ DROP_NAME not set. CMS will not be able to load meta.json')
} else {
console.log(`📝 CMS connected to drop: ${dropName}`)
}
server.middlewares.use('/api/meta', async (req, res, next) => {
if (!dropName) {
res.statusCode = 400
res.end(JSON.stringify({ error: 'No drop specified' }))
return
}
const metaPath = path.join(
__dirname,
'../../../drops',
dropName,
'public/meta.json'
)
// GET - Read meta.json
if (req.method === 'GET') {
try {
if (!fs.existsSync(metaPath)) {
res.statusCode = 404
res.end(JSON.stringify({ error: 'meta.json not found' }))
return
}
const metaContent = fs.readFileSync(metaPath, 'utf-8')
res.setHeader('Content-Type', 'application/json')
res.end(metaContent)
} catch (err) {
res.statusCode = 500
res.end(JSON.stringify({ error: err.message }))
}
return
}
// POST - Write meta.json
if (req.method === 'POST') {
let body = ''
req.on('data', (chunk) => {
body += chunk.toString()
})
req.on('end', () => {
try {
// Validate JSON
const metaData = JSON.parse(body)
// Write to file with pretty formatting
fs.writeFileSync(
metaPath,
JSON.stringify(metaData, null, 2),
'utf-8'
)
console.log(`✅ Updated meta.json for ${dropName}`)
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify({ success: true }))
} catch (err) {
res.statusCode = 500
res.end(JSON.stringify({ error: err.message }))
}
})
return
}
// Method not allowed
res.statusCode = 405
res.end(JSON.stringify({ error: 'Method not allowed' }))
})
// Endpoint to get the current drop name
server.middlewares.use('/api/drop-info', (req, res) => {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify({ dropName }))
})
},
}
}