feat: route permission guards, home page per role — RolePermissionsContext, PermissionGuard, App routes, DB migration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 10:50:22 +03:00
parent 80429cd52a
commit a701366216
5 changed files with 129 additions and 56 deletions

View File

@@ -54,7 +54,23 @@ import { PayDepositPage } from './pages/PayDepositPage'
import { BookingWidgetStandalonePage } from './pages/BookingWidgetStandalonePage'
import { BookingConfirmPage } from './pages/BookingConfirmPage'
import { ModuleGuard } from './components/ModuleGuard'
import { RolePermissionsProvider } from './contexts/RolePermissionsContext'
import { PermissionGuard } from './components/PermissionGuard'
import { RolePermissionsProvider, useRolePermissions } from './contexts/RolePermissionsContext'
import { useAuth } from './contexts/AuthContext'
// Redirects to the user's role home page after login
function HomeRedirect() {
const { user } = useAuth()
const { userHomePage, loading } = useRolePermissions()
if (!user) return <Navigate to="/login" replace />
if (loading) return null
return <Navigate to={userHomePage} replace />
}
// Shorthand: wrap element with PermissionGuard
function P({ perm, children }: { perm: string; children: React.ReactNode }) {
return <PermissionGuard permission={perm}>{children}</PermissionGuard>
}
export default function App() {
return (
@@ -78,49 +94,49 @@ export default function App() {
{/* PMS routes */}
<Route element={<AppLayout />}>
<Route path="/calendar" element={<CalendarPage />} />
<Route path="/bookings" element={<BookingsPage />} />
<Route path="/rooms" element={<RoomsPage />} />
<Route path="/housekeeping" element={<ModuleGuard moduleId="housekeeping"><HousekeepingPage /></ModuleGuard>} />
<Route path="/channels" element={<ModuleGuard moduleId="channel-manager"><ChannelsPage /></ModuleGuard>} />
<Route path="/api-docs" element={<ApiDocsPage />} />
<Route path="/modules" element={<ModulesPage />} />
<Route path="/settings" element={<SettingsPage />} />
<Route path="/reports" element={<ReportsPage />} />
<Route path="/website" element={<WebsitePage />} />
<Route path="/booking-widget" element={<BookingWidgetPage />} />
<Route path="/availability" element={<AvailabilityPage />} />
<Route path="/floor-map" element={<FloorMapPage />} />
<Route path="/migration" element={<MigrationPage />} />
<Route path="/pos" element={<ModuleGuard moduleId="pos"><PosPage /></ModuleGuard>} />
<Route path="/reviews" element={<ModuleGuard moduleId="reviews"><ReviewsPage /></ModuleGuard>} />
<Route path="/room-service" element={<ModuleGuard moduleId="room-service"><RoomServicePage /></ModuleGuard>} />
<Route path="/rental" element={<ModuleGuard moduleId="rental"><RentalPage /></ModuleGuard>} />
<Route path="/room-categories" element={<RoomCategoriesPage />} />
<Route path="/documents" element={<DocumentsPage />} />
<Route path="/users" element={<UsersPage />} />
<Route path="/schedule" element={<SchedulePage />} />
<Route path="/guests" element={<GuestsPage />} />
<Route path="/tariffs" element={<TariffsPage />} />
<Route path="/dynamic-pricing" element={<DynamicPricingPage />} />
<Route path="/loyalty" element={<LoyaltyPage />} />
<Route path="/maintenance" element={<MaintenancePage />} />
<Route path="/discounts" element={<DiscountsPage />} />
<Route path="/tv-welcome" element={<TvWelcomePage />} />
<Route path="/technical" element={<TechnicalPage />} />
<Route path="/billing" element={<BillingPage />} />
<Route path="/equipment" element={<EquipmentPage />} />
<Route path="/wifi" element={<WiFiPage />} />
<Route path="/ttlock" element={<TTLockPage />} />
<Route path="/settings/checklists" element={<ChecklistSettingsPage />} />
<Route path="/settings/payments" element={<PaymentSettingsPage />} />
<Route path="/settings/minibar" element={<MinibarSettingsPage />} />
<Route path="/settings/minibar/stock" element={<MinibarStockPage />} />
<Route path="/settings/deposit" element={<DepositSettingsPage />} />
<Route path="/settings/deposit/history" element={<DepositHistoryPage />} />
<Route path="/calendar" element={<P perm="calendar"> <CalendarPage /> </P>} />
<Route path="/bookings" element={<P perm="bookings"> <BookingsPage /> </P>} />
<Route path="/guests" element={<P perm="guests"> <GuestsPage /> </P>} />
<Route path="/rooms" element={<P perm="rooms"> <RoomsPage /> </P>} />
<Route path="/room-categories" element={<P perm="rooms"> <RoomCategoriesPage /></P>} />
<Route path="/availability" element={<P perm="availability"><AvailabilityPage /></P>} />
<Route path="/floor-map" element={<P perm="floor_map"> <FloorMapPage /> </P>} />
<Route path="/housekeeping" element={<P perm="housekeeping"><ModuleGuard moduleId="housekeeping"><HousekeepingPage /></ModuleGuard></P>} />
<Route path="/technical" element={<P perm="maintenance"> <TechnicalPage /> </P>} />
<Route path="/maintenance" element={<P perm="maintenance"> <MaintenancePage /> </P>} />
<Route path="/pos" element={<P perm="pos"> <ModuleGuard moduleId="pos"><PosPage /></ModuleGuard> </P>} />
<Route path="/room-service" element={<P perm="room_service"><ModuleGuard moduleId="room-service"><RoomServicePage /></ModuleGuard></P>} />
<Route path="/reviews" element={<P perm="reviews"> <ModuleGuard moduleId="reviews"><ReviewsPage /></ModuleGuard> </P>} />
<Route path="/tariffs" element={<P perm="tariffs"> <TariffsPage /> </P>} />
<Route path="/dynamic-pricing" element={<P perm="pricing"> <DynamicPricingPage /></P>} />
<Route path="/discounts" element={<P perm="discounts"> <DiscountsPage /> </P>} />
<Route path="/rental" element={<P perm="rental"> <ModuleGuard moduleId="rental"><RentalPage /></ModuleGuard> </P>} />
<Route path="/channels" element={<P perm="channels"> <ModuleGuard moduleId="channel-manager"><ChannelsPage /></ModuleGuard></P>} />
<Route path="/website" element={<P perm="website"> <WebsitePage /> </P>} />
<Route path="/booking-widget" element={<P perm="website"> <BookingWidgetPage /></P>} />
<Route path="/reports" element={<P perm="reports"> <ReportsPage /> </P>} />
<Route path="/loyalty" element={<P perm="loyalty"> <LoyaltyPage /> </P>} />
<Route path="/users" element={<P perm="users"> <UsersPage /> </P>} />
<Route path="/schedule" element={<P perm="users"> <SchedulePage /> </P>} />
<Route path="/documents" element={<P perm="documents"> <DocumentsPage /> </P>} />
<Route path="/settings" element={<P perm="settings"> <SettingsPage /> </P>} />
<Route path="/modules" element={<P perm="settings"> <ModulesPage /> </P>} />
<Route path="/billing" element={<P perm="settings"> <BillingPage /> </P>} />
<Route path="/equipment" element={<P perm="equipment"> <EquipmentPage /> </P>} />
<Route path="/wifi" element={<P perm="wifi"> <WiFiPage /> </P>} />
<Route path="/ttlock" element={<P perm="ttlock"> <TTLockPage /> </P>} />
<Route path="/settings/checklists" element={<P perm="settings"><ChecklistSettingsPage /></P>} />
<Route path="/settings/payments" element={<P perm="settings"><PaymentSettingsPage /> </P>} />
<Route path="/settings/minibar" element={<P perm="settings"><MinibarSettingsPage /> </P>} />
<Route path="/settings/minibar/stock" element={<P perm="settings"><MinibarStockPage /> </P>} />
<Route path="/settings/deposit" element={<P perm="settings"><DepositSettingsPage /> </P>} />
<Route path="/settings/deposit/history" element={<P perm="settings"><DepositHistoryPage /> </P>} />
<Route path="/migration" element={<P perm="settings"> <MigrationPage /> </P>} />
<Route path="/api-docs" element={<P perm="settings"> <ApiDocsPage /> </P>} />
<Route path="/tv-welcome" element={<TvWelcomePage />} />
</Route>
<Route path="/" element={<Navigate to="/login" replace />} />
<Route path="/" element={<HomeRedirect />} />
<Route path="*" element={<Navigate to="/login" replace />} />
</Routes>
</BrowserRouter>