feat(ADM-018): completed feature
This commit is contained in:
63
project/apps/admin/src/lib/permissions.ts
Normal file
63
project/apps/admin/src/lib/permissions.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import type { Role } from '@/types';
|
||||
|
||||
export type Permission =
|
||||
| 'dashboard'
|
||||
| 'products.read'
|
||||
| 'products.write'
|
||||
| 'orders.read'
|
||||
| 'orders.write'
|
||||
| 'inventory.read'
|
||||
| 'inventory.write'
|
||||
| 'customers.read'
|
||||
| 'customers.write'
|
||||
| 'categories.read'
|
||||
| 'categories.write'
|
||||
| 'categories.delete'
|
||||
| 'brands.read'
|
||||
| 'brands.write'
|
||||
| 'promotions.read'
|
||||
| 'promotions.write'
|
||||
| 'reviews.read'
|
||||
| 'reviews.moderate'
|
||||
| 'cms.read'
|
||||
| 'cms.write'
|
||||
| 'admin-users.read'
|
||||
| 'admin-users.write'
|
||||
| 'audit.read';
|
||||
|
||||
export function can(role: Role, permission: Permission): boolean {
|
||||
if (role === 'admin') return true;
|
||||
// Future: granular permission checks when backend supports them
|
||||
return false;
|
||||
}
|
||||
|
||||
export interface NavItem {
|
||||
href: string;
|
||||
label: string;
|
||||
icon: string;
|
||||
permission: Permission;
|
||||
badge?: number;
|
||||
}
|
||||
|
||||
export const NAV_ITEMS: NavItem[] = [
|
||||
{ href: '/', label: 'Dashboard', icon: '📊', permission: 'dashboard' },
|
||||
{ href: '/products', label: 'Productos', icon: '📦', permission: 'products.read' },
|
||||
{ href: '/orders', label: 'Pedidos', icon: '🧾', permission: 'orders.read' },
|
||||
{ href: '/payments', label: 'Pagos', icon: '💳', permission: 'orders.read' },
|
||||
{ href: '/inventory', label: 'Inventario', icon: '📊', permission: 'inventory.read' },
|
||||
{ href: '/customers', label: 'Clientes', icon: '👥', permission: 'customers.read' },
|
||||
{ href: '/categories', label: 'Categorías', icon: '🏷️', permission: 'categories.read' },
|
||||
{ href: '/brands', label: 'Marcas', icon: '🏷️', permission: 'brands.read' },
|
||||
{ href: '/promotions', label: 'Promociones', icon: '🏷️', permission: 'promotions.read' },
|
||||
{ href: '/shipping', label: 'Envíos', icon: '📦', permission: 'orders.read' },
|
||||
{ href: '/reviews', label: 'Reseñas', icon: '⭐', permission: 'reviews.read' },
|
||||
{ href: '/cms', label: 'CMS', icon: '📄', permission: 'cms.read' },
|
||||
{ href: '/users', label: 'Usuarios', icon: '🔐', permission: 'admin-users.read' },
|
||||
{ href: '/tax-rates', label: 'IVA', icon: '📊', permission: 'orders.read' },
|
||||
{ href: '/audit', label: 'Auditoría', icon: '📋', permission: 'audit.read' },
|
||||
{ href: '/settings', label: 'Ajustes', icon: '⚙️', permission: 'dashboard' },
|
||||
];
|
||||
|
||||
export function visibleNavItems(role: Role): NavItem[] {
|
||||
return NAV_ITEMS.filter((item) => can(role, item.permission));
|
||||
}
|
||||
Reference in New Issue
Block a user