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')}