mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
4.3 KiB
4.3 KiB
Navigation Admin 500 Error Fix
Problem
Navigation admin editing was not working - both creating and updating navigation items resulted in a 500 Internal Server Error:
POST http://localhost:8080/api/v1/admin/navigation 500 (Internal Server Error)
Navigation items were not being saved or populated in either the frontend or admin page.
Root Cause
The issue was in the CreateNavigationItem function in internal/controllers/navigation_controller.go.
When calculating the display order for new navigation items (line 109-116), the original code only considered items with parent_id IS NULL:
if item.DisplayOrder == 0 {
var maxOrder int
nc.DB.Model(&models.NavigationItem{}).
Where("parent_id IS NULL"). // ← Only checks top-level items
Select("COALESCE(MAX(display_order), -1) + 1").
Scan(&maxOrder)
item.DisplayOrder = maxOrder
}
Issues with this approach:
- Parent ID not considered: When creating a child item (with a parent_id), it would still calculate the max order from top-level items, causing incorrect ordering
- Admin vs Frontend mixing: Admin navigation items and frontend navigation items were being mixed together because
requires_adminwasn't considered - Potential conflicts: This could lead to duplicate display_order values and database constraint violations
Solution
1. Fixed Display Order Calculation
Updated the CreateNavigationItem function to properly consider:
- Parent ID: Calculate max order within the same parent level
- Admin status: Separate admin and frontend navigation items
- Proper scoping: Each level (parent/child) and type (admin/frontend) maintains its own ordering
if item.DisplayOrder == 0 {
var maxOrder int
query := nc.DB.Model(&models.NavigationItem{})
// Calculate max order for items at the same level (same parent) and same admin status
if item.ParentID == nil {
query = query.Where("parent_id IS NULL")
} else {
query = query.Where("parent_id = ?", *item.ParentID)
}
// Also consider requires_admin to keep frontend and admin items separate
query = query.Where("requires_admin = ?", item.RequiresAdmin)
query.Select("COALESCE(MAX(display_order), -1) + 1").Scan(&maxOrder)
item.DisplayOrder = maxOrder
}
2. Added Better Error Messages
Enhanced error responses to include detailed error information for debugging:
CreateNavigationItem:
if err := nc.DB.Create(&item).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Failed to create navigation item",
"details": err.Error(), // ← Added detailed error
})
return
}
UpdateNavigationItem:
if err := nc.DB.Save(&item).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Failed to update navigation item",
"details": err.Error(), // ← Added detailed error
})
return
}
Files Modified
internal/controllers/navigation_controller.go- Fixed
CreateNavigationItemfunction (lines 108-125) - Enhanced error messages in
CreateNavigationItem(lines 127-134) - Enhanced error messages in
UpdateNavigationItem(lines 184-190)
- Fixed
Testing Instructions
- Start the backend server
- Navigate to Admin → Navigace (Navigation)
- Test creating a new navigation item:
- Click "Přidat hlavní položku" (Add main item)
- Fill in the form and save
- Verify the item appears in the list
- Test editing an existing item:
- Click edit icon on any navigation item
- Modify fields and save
- Verify changes are saved
- Test creating child items:
- Create a dropdown item
- Add child items to it
- Verify proper ordering
Expected Behavior After Fix
- ✅ Navigation items save successfully
- ✅ No 500 errors when creating or updating items
- ✅ Proper ordering maintained for frontend and admin navigation separately
- ✅ Child items (dropdown submenu items) order correctly within their parent
- ✅ Detailed error messages shown if database issues occur
Related Files
- Frontend:
frontend/src/pages/admin/NavigationAdminPage.tsx - Service:
frontend/src/services/navigation.ts - Model:
internal/models/navigation.go - Routes:
internal/routes/routes.go(lines 332-340) - Migration:
database/migrations/20251010154600_create_navigation_system.up.sql