- Reorganized admin settings into tabbed interface (General, Security, Payment Methods) - Vertical tabs on desktop, horizontal scrollable on mobile - Moved Payment Methods from separate menu to Settings tab - Fixed admin profile reuse and dashboard blocking - Fixed maintenance mode guard to use AppConfig model - Added admin auto-redirect after login (admins → /admin, users → /) - Reorganized documentation into docs/ folder structure - Created comprehensive README and documentation index - Added PWA and Web Push notifications to to-do list
7.2 KiB
7.2 KiB
Maintenance Mode - Testing Guide
✅ Fixed Implementation
What Was Wrong:
The original implementation had a critical flaw - it checked request.user which doesn't exist until AFTER the JWT guard runs. This meant:
- Admins would also be blocked
- The guard couldn't distinguish between admin and regular users
What Was Fixed:
- MaintenanceGuard now manually verifies JWT tokens using
JwtService - Extracts user role from token payload
- Allows admins through, blocks everyone else
- Works independently of the JWT guard
🧪 How to Test Maintenance Mode
Prerequisites:
- Have at least 2 user accounts:
- One admin account (role: 'admin')
- One regular user account (role: 'user')
- Both API and Web servers running
Test Scenario 1: Enable Maintenance Mode
Step 1: Login as Admin
1. Go to http://localhost:5174/auth/login
2. Login with admin credentials
3. Navigate to http://localhost:5174/admin/settings
Step 2: Enable Maintenance
1. Find "Maintenance Mode" section
2. Toggle the switch to ON
3. Optionally change the message to: "We're upgrading! Back in 10 minutes."
4. Click "Save Settings"
5. You should see success toast
Step 3: Verify Admin Still Has Access
1. Stay logged in as admin
2. Navigate to different admin pages:
- /admin (Dashboard)
- /admin/users
- /admin/plans
3. All should work normally ✅
4. Try accessing main app: http://localhost:5174/
5. Admin should see maintenance page ❌ (this is expected - only admin panel works)
Test Scenario 2: Regular User Experience
Step 1: Open Incognito/Private Window
1. Open new incognito window
2. Go to http://localhost:5174
Step 2: Try to Access Without Login
1. You'll be redirected to login page
2. Try to login with regular user credentials
3. After successful login, you should see MAINTENANCE PAGE ✅
4. The page should display your custom message
Step 3: Verify User is Blocked
1. Try to navigate to any route:
- /
- /wallets
- /transactions
2. All should show maintenance page ✅
3. Click "Refresh Page" button
4. Should still show maintenance (because it's still ON)
Test Scenario 3: Disable Maintenance Mode
Step 1: As Admin, Disable Maintenance
1. Go back to admin window (still logged in)
2. Navigate to /admin/settings
3. Toggle "Maintenance Mode" to OFF
4. Click "Save Settings"
Step 2: Verify User Can Access Again
1. Go to incognito window (with regular user)
2. Click "Refresh Page" button
3. User should now see the normal app ✅
4. Try navigating to different pages - all should work
📊 Expected Behavior Matrix
| User Type | Maintenance OFF | Maintenance ON |
|---|---|---|
| Not Logged In | Can login | Can login, then see maintenance page |
| Regular User | Full access | Maintenance page on all routes |
| Admin User | Full access | Admin panel works, main app shows maintenance |
🔍 How to Verify It's Working
Check 1: API Returns 503
Open browser DevTools (F12) → Network tab:
1. With maintenance ON, as regular user
2. Try to access any protected route
3. Look for API calls
4. Should see 503 status code
5. Response body should have:
{
"statusCode": 503,
"message": "Your custom message",
"maintenanceMode": true
}
Check 2: Admin Bypasses Maintenance
1. With maintenance ON, as admin
2. Open DevTools → Network tab
3. Navigate to /admin/users
4. API calls should return 200 OK (not 503)
5. Admin panel should work normally
Check 3: Database Config
Check the database directly:
SELECT * FROM "Config" WHERE key = 'maintenance_mode';
-- Should show: value = 'true' when ON, 'false' when OFF
SELECT * FROM "Config" WHERE key = 'maintenance_message';
-- Should show your custom message
🐛 Troubleshooting
Problem: Admin Also Sees Maintenance Page
Cause: JWT token might be invalid or expired Solution:
- Logout and login again as admin
- Check browser console for errors
- Verify JWT_SECRET in .env matches between sessions
Problem: Regular User Can Still Access
Cause: Maintenance mode not actually enabled in DB Solution:
- Check database:
SELECT * FROM "Config" WHERE key = 'maintenance_mode' - If value is not 'true', manually update:
UPDATE "Config" SET value = 'true' WHERE key = 'maintenance_mode'; - Or toggle it again in Admin Settings
Problem: Maintenance Page Never Shows
Cause: Axios interceptor not set up properly Solution:
- Check browser console for errors
- Verify App.tsx has
setupAxiosInterceptorscall - Hard refresh (Ctrl+Shift+R or Cmd+Shift+R)
Problem: Auth Routes Also Blocked
Cause: @SkipMaintenance decorator missing Solution:
- Verify auth.controller.ts has @SkipMaintenance on login/register
- Restart API server
🎯 Quick Test Checklist
- Admin can enable maintenance mode
- Admin can customize maintenance message
- Admin can still access admin panel when maintenance is ON
- Regular user sees maintenance page when maintenance is ON
- Maintenance page displays custom message
- Refresh button works on maintenance page
- Admin can disable maintenance mode
- Regular user can access app after maintenance is OFF
- Login/register still work during maintenance
- Health check endpoints still work during maintenance
📝 Notes
Routes That Always Work (Even During Maintenance):
/health- Health check/health/db- Database check/auth/login- Login/auth/register- Register/auth/verify-otp- OTP verification/auth/google- Google OAuth/admin/*- All admin routes (for admins only)
Routes That Get Blocked:
/- Main dashboard/wallets- Wallets page/transactions- Transactions page/api/users/me- User profile/api/wallets- Wallet API/api/transactions- Transaction API- Any other non-admin, non-auth route
How Admins Are Identified:
- MaintenanceGuard extracts JWT token from
Authorizationheader - Verifies token using JwtService
- Checks if
payload.role === 'admin' - If true, allows access
- If false or no token, blocks with 503
🚀 Production Deployment Notes
Before Enabling Maintenance:
- Notify users via email/notification
- Set a clear maintenance message with expected duration
- Schedule during low-traffic hours
- Have rollback plan ready
During Maintenance:
- Monitor admin panel access
- Check logs for any issues
- Test critical features before re-enabling
After Maintenance:
- Disable maintenance mode
- Monitor for any issues
- Verify all features work
- Notify users that system is back online
✅ Summary
Maintenance mode is now fully functional with proper admin bypass. The system:
- ✅ Blocks regular users when enabled
- ✅ Allows admins to continue working
- ✅ Shows professional maintenance page
- ✅ Displays custom admin messages
- ✅ Can be toggled on/off from Admin Settings
- ✅ Preserves auth functionality
- ✅ Keeps health checks working
Ready for production use!