From ad758185666bf4ac52965f16d1c0e1e052887ac2 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 24 Jul 2025 15:16:50 +0200 Subject: [PATCH] fix: resolve multiple feedback management issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hide "Manage Feedback" button when feedback is disabled for an event - Fix 500 error on feedback API endpoint by adding null-safe operators - Fix TypeError on analytics page by calculating average_rating in backend - Fix password validation for event creation by properly awaiting async validation - Add proper null checks and fallbacks for feedback statistics These fixes ensure: - Date passwords like "19.07.2025" work with simple password complexity settings - Feedback management page loads without errors - Analytics display correctly even with no feedback data 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- backend/src/routes/adminEvents-enhanced.js | 2 +- backend/src/routes/adminEvents.js | 2 +- backend/src/routes/adminFeedback.js | 34 +++++++++++++++++-- frontend/src/pages/admin/EventDetailsPage.tsx | 18 +++++----- .../src/pages/admin/EventFeedbackPage.tsx | 2 +- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/backend/src/routes/adminEvents-enhanced.js b/backend/src/routes/adminEvents-enhanced.js index 740dd16..0134ded 100644 --- a/backend/src/routes/adminEvents-enhanced.js +++ b/backend/src/routes/adminEvents-enhanced.js @@ -42,7 +42,7 @@ router.post('/', adminAuth, [ } = req.body; // Validate password strength for gallery - const passwordValidation = validatePasswordInContext(password, 'gallery', { + const passwordValidation = await validatePasswordInContext(password, 'gallery', { eventName: event_name }); diff --git a/backend/src/routes/adminEvents.js b/backend/src/routes/adminEvents.js index 4894c60..9a287a3 100644 --- a/backend/src/routes/adminEvents.js +++ b/backend/src/routes/adminEvents.js @@ -53,7 +53,7 @@ router.post('/', adminAuth, [ } = req.body; // Validate password strength - const passwordValidation = validatePasswordInContext(password, 'gallery', { + const passwordValidation = await validatePasswordInContext(password, 'gallery', { eventName: event_name }); diff --git a/backend/src/routes/adminFeedback.js b/backend/src/routes/adminFeedback.js index 951b4f2..2be68fe 100644 --- a/backend/src/routes/adminFeedback.js +++ b/backend/src/routes/adminFeedback.js @@ -123,8 +123,8 @@ router.get('/events/:eventId/feedback', pagination: { page: parseInt(page), limit: parseInt(limit), - total: totalCount.count || 0, - pages: Math.ceil((totalCount.count || 0) / limit) + total: totalCount?.count || 0, + pages: Math.ceil((totalCount?.count || 0) / limit) } }); } catch (error) { @@ -182,7 +182,35 @@ router.get('/events/:eventId/feedback-analytics', const { eventId } = req.params; // Get summary statistics - const summary = await feedbackService.getEventFeedbackSummary(eventId); + const summaryData = await feedbackService.getEventFeedbackSummary(eventId); + + // Calculate average rating and other summary stats + const avgRatingResult = await db('photo_feedback') + .where('event_id', eventId) + .where('feedback_type', 'rating') + .avg('rating as average_rating') + .first(); + + const pendingModeration = await db('photo_feedback') + .where('event_id', eventId) + .where('feedback_type', 'comment') + .where('is_approved', false) + .where('is_hidden', false) + .count('* as count') + .first(); + + const summary = { + average_rating: parseFloat(avgRatingResult?.average_rating || 0), + total_ratings: summaryData.stats?.total_ratings || 0, + total_likes: summaryData.stats?.total_likes || 0, + total_comments: summaryData.stats?.total_comments || 0, + total_favorites: summaryData.stats?.total_favorites || 0, + pending_moderation: pendingModeration?.count || 0, + total_feedback: (summaryData.stats?.total_ratings || 0) + + (summaryData.stats?.total_likes || 0) + + (summaryData.stats?.total_comments || 0) + + (summaryData.stats?.total_favorites || 0) + }; // Get top-rated photos const topRated = await db('photos') diff --git a/frontend/src/pages/admin/EventDetailsPage.tsx b/frontend/src/pages/admin/EventDetailsPage.tsx index a58ab3e..8d07719 100644 --- a/frontend/src/pages/admin/EventDetailsPage.tsx +++ b/frontend/src/pages/admin/EventDetailsPage.tsx @@ -349,14 +349,16 @@ export const EventDetailsPage: React.FC = () => { {t('common.edit')} )} - + {feedbackSettings?.feedback_enabled && ( + + )} )} {event.share_link && ( diff --git a/frontend/src/pages/admin/EventFeedbackPage.tsx b/frontend/src/pages/admin/EventFeedbackPage.tsx index 2ded196..cd824e5 100644 --- a/frontend/src/pages/admin/EventFeedbackPage.tsx +++ b/frontend/src/pages/admin/EventFeedbackPage.tsx @@ -392,7 +392,7 @@ export const EventFeedbackPage: React.FC = () => {
-

{analytics.summary.average_rating.toFixed(1)}

+

{(analytics.summary.average_rating || 0).toFixed(1)}

{t('feedback.avgRating', 'Average Rating')}