mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 10:42:57 +00:00
120 lines
4.3 KiB
Markdown
120 lines
4.3 KiB
Markdown
# 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`:
|
|
|
|
```go
|
|
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:
|
|
1. **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
|
|
2. **Admin vs Frontend mixing**: Admin navigation items and frontend navigation items were being mixed together because `requires_admin` wasn't considered
|
|
3. **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
|
|
|
|
```go
|
|
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**:
|
|
```go
|
|
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**:
|
|
```go
|
|
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 `CreateNavigationItem` function (lines 108-125)
|
|
- Enhanced error messages in `CreateNavigationItem` (lines 127-134)
|
|
- Enhanced error messages in `UpdateNavigationItem` (lines 184-190)
|
|
|
|
## Testing Instructions
|
|
1. Start the backend server
|
|
2. Navigate to Admin → Navigace (Navigation)
|
|
3. 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
|
|
4. Test editing an existing item:
|
|
- Click edit icon on any navigation item
|
|
- Modify fields and save
|
|
- Verify changes are saved
|
|
5. 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`
|