Add sharp image processing library and update dependencies in package.json and package-lock.json; enhance Navigation component with new 'Galerie' link for improved user navigation.
This commit is contained in:
90
server/api/galerie/list.get.js
Normal file
90
server/api/galerie/list.get.js
Normal file
@@ -0,0 +1,90 @@
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
import { getUserFromToken, verifyToken } from '../../utils/auth.js'
|
||||
|
||||
// Handle both dev and production paths
|
||||
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_METADATA = getDataPath('galerie-metadata.json')
|
||||
|
||||
async function readGalerieMetadata() {
|
||||
try {
|
||||
const data = await fs.readFile(GALERIE_METADATA, 'utf-8')
|
||||
return JSON.parse(data)
|
||||
} catch (error) {
|
||||
if (error.code === 'ENOENT') {
|
||||
return []
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
// Prüfe ob Benutzer eingeloggt ist
|
||||
let isLoggedIn = false
|
||||
const token = getCookie(event, 'auth_token') || getHeader(event, 'authorization')?.replace('Bearer ', '')
|
||||
|
||||
if (token) {
|
||||
const decoded = verifyToken(token)
|
||||
if (decoded) {
|
||||
const user = await getUserFromToken(token)
|
||||
if (user && user.active) {
|
||||
isLoggedIn = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const metadata = await readGalerieMetadata()
|
||||
|
||||
// Filtere Bilder basierend auf Sichtbarkeit
|
||||
const visibleImages = metadata.filter(image => {
|
||||
// Öffentliche Bilder sind für alle sichtbar
|
||||
if (image.isPublic) return true
|
||||
// Private Bilder nur für eingeloggte Mitglieder
|
||||
return isLoggedIn
|
||||
})
|
||||
|
||||
// Sortiere nach Upload-Datum (neueste zuerst)
|
||||
visibleImages.sort((a, b) => new Date(b.uploadedAt) - new Date(a.uploadedAt))
|
||||
|
||||
// Pagination
|
||||
const page = parseInt(getQuery(event).page) || 1
|
||||
const perPage = 10
|
||||
const start = (page - 1) * perPage
|
||||
const end = start + perPage
|
||||
const paginatedImages = visibleImages.slice(start, end)
|
||||
|
||||
return {
|
||||
success: true,
|
||||
images: paginatedImages.map(img => ({
|
||||
id: img.id,
|
||||
title: img.title,
|
||||
description: img.description,
|
||||
isPublic: img.isPublic,
|
||||
uploadedAt: img.uploadedAt,
|
||||
previewFilename: img.previewFilename
|
||||
})),
|
||||
pagination: {
|
||||
page,
|
||||
perPage,
|
||||
total: visibleImages.length,
|
||||
totalPages: Math.ceil(visibleImages.length / perPage)
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Fehler beim Laden der Galerie:', error)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: 'Fehler beim Laden der Galerie'
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user