Refactor Galerie component to use image IDs for keys and update image loading logic; add new scripts for generating previews and migrating public gallery to metadata with authentication checks.
This commit is contained in:
96
scripts/migrate-public-galerie-to-metadata.js
Normal file
96
scripts/migrate-public-galerie-to-metadata.js
Normal file
@@ -0,0 +1,96 @@
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
import { randomUUID } from 'crypto'
|
||||
|
||||
const allowed = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'])
|
||||
|
||||
const getDataPath = (filename) => {
|
||||
const cwd = process.cwd()
|
||||
if (cwd.endsWith('.output')) return path.join(cwd, '../server/data', filename)
|
||||
return path.join(cwd, 'server/data', filename)
|
||||
}
|
||||
|
||||
const GALERIE_DIR = getDataPath('galerie')
|
||||
const GALERIE_METADATA = getDataPath('galerie-metadata.json')
|
||||
const PUBLIC_GALERIE_DIR = path.join(process.cwd(), 'public', 'galerie')
|
||||
|
||||
function titleFromFilename(filename) {
|
||||
const nameWithoutExt = path.parse(filename).name
|
||||
return nameWithoutExt.replace(/[-_]/g, ' ').replace(/\b\w/g, l => l.toUpperCase())
|
||||
}
|
||||
|
||||
async function readJsonArray(file) {
|
||||
try {
|
||||
const data = await fs.readFile(file, 'utf-8')
|
||||
const parsed = JSON.parse(data)
|
||||
return Array.isArray(parsed) ? parsed : []
|
||||
} catch (e) {
|
||||
if (e.code === 'ENOENT') return []
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
async function ensureDirs() {
|
||||
await fs.mkdir(path.join(GALERIE_DIR, 'originals'), { recursive: true })
|
||||
await fs.mkdir(path.join(GALERIE_DIR, 'previews'), { recursive: true })
|
||||
}
|
||||
|
||||
async function main() {
|
||||
await ensureDirs()
|
||||
|
||||
const entries = await readJsonArray(GALERIE_METADATA)
|
||||
const existingByName = new Map(entries.map(e => [e.filename, e]))
|
||||
|
||||
let files = []
|
||||
try {
|
||||
files = await fs.readdir(PUBLIC_GALERIE_DIR)
|
||||
} catch (e) {
|
||||
console.error('public/galerie nicht gefunden:', PUBLIC_GALERIE_DIR)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const candidates = files.filter(f => allowed.has(path.extname(f).toLowerCase()))
|
||||
let migrated = 0
|
||||
let skipped = 0
|
||||
|
||||
for (const filename of candidates) {
|
||||
if (existingByName.has(filename)) {
|
||||
skipped++
|
||||
continue
|
||||
}
|
||||
|
||||
const id = randomUUID()
|
||||
const title = titleFromFilename(filename)
|
||||
|
||||
const src = path.join(PUBLIC_GALERIE_DIR, filename)
|
||||
const dest = path.join(GALERIE_DIR, 'originals', filename)
|
||||
|
||||
await fs.rename(src, dest)
|
||||
|
||||
const meta = {
|
||||
id,
|
||||
filename,
|
||||
previewFilename: `preview_${filename}`,
|
||||
title,
|
||||
description: '',
|
||||
isPublic: true,
|
||||
uploadedBy: 'migration',
|
||||
uploadedAt: new Date().toISOString(),
|
||||
originalName: filename
|
||||
}
|
||||
|
||||
entries.push(meta)
|
||||
existingByName.set(filename, meta)
|
||||
migrated++
|
||||
}
|
||||
|
||||
await fs.writeFile(GALERIE_METADATA, JSON.stringify(entries, null, 2), 'utf-8')
|
||||
|
||||
console.log(`Fertig. Migriert: ${migrated}, übersprungen: ${skipped}`)
|
||||
console.log('Hinweis: previews werden nicht automatisch erzeugt. Für echte previews bitte neu hochladen oder ein separates preview-generator script verwenden.')
|
||||
}
|
||||
|
||||
main().catch(e => {
|
||||
console.error(e)
|
||||
process.exit(1)
|
||||
})
|
||||
Reference in New Issue
Block a user