dcb-backoffice/src/app/core/services/menu.service.ts

142 lines
4.6 KiB
TypeScript

import { Injectable, inject } from '@angular/core';
import { AuthService } from './auth.service';
import { PermissionsService } from './permissions.service';
import { MenuItemType, UserDropdownItemType } from '@/app/types/layout';
@Injectable({ providedIn: 'root' })
export class MenuService {
private authService = inject(AuthService);
private permissionsService = inject(PermissionsService);
getMenuItems(): MenuItemType[] {
const userRoles = this.authService.getCurrentUserRoles();
return this.filterMenuItems(this.getFullMenu(), userRoles);
}
getUserDropdownItems(): UserDropdownItemType[] {
const userRoles = this.authService.getCurrentUserRoles();
return this.filterUserDropdownItems(this.getFullUserDropdown(), userRoles);
}
canAccess(modulePath: string): boolean {
const userRoles = this.authService.getCurrentUserRoles();
return this.permissionsService.canAccessModule(modulePath, userRoles);
}
private filterMenuItems(items: MenuItemType[], userRoles: string[]): MenuItemType[] {
return items
.filter(item => this.shouldDisplayMenuItem(item, userRoles))
.map(item => ({
...item,
children: item.children ? this.filterMenuItems(item.children, userRoles) : undefined
}));
}
private shouldDisplayMenuItem(item: MenuItemType, userRoles: string[]): boolean {
if (item.isTitle) return true;
if (item.url && item.url !== '#') {
const modulePath = this.normalizePath(item.url);
return this.permissionsService.canAccessModule(modulePath, userRoles);
}
if (item.children) {
return this.filterMenuItems(item.children, userRoles).length > 0;
}
return true;
}
private filterUserDropdownItems(items: UserDropdownItemType[], userRoles: string[]): UserDropdownItemType[] {
return items.filter(item => {
if (item.isDivider || item.isHeader || !item.url || item.url === '#') {
return true;
}
const modulePath = this.normalizePath(item.url);
return this.permissionsService.canAccessModule(modulePath, userRoles);
});
}
private normalizePath(url: string): string {
return url.startsWith('/') ? url.substring(1) : url;
}
private getFullMenu(): MenuItemType[] {
return [
{ label: 'Pilotage', isTitle: true },
{
label: 'Tableau de Bord',
icon: 'lucideBarChart2',
url: '/dcb-dashboard',
},
{ label: 'Business & Transactions', isTitle: true },
{
label: 'Transactions DCB',
icon: 'lucideCreditCard',
url: '/transactions',
},
{
label: 'Gestions Merchants/Partenaires',
icon: 'lucideStore',
url: '/merchant-partners'
},
{
label: 'Opérateurs',
icon: 'lucideServer',
isCollapsed: true,
children: [
{ label: 'Paramètres d\'Intégration', url: '/operators/config' },
{ label: 'Performance & Monitoring', url: '/operators/stats' },
],
},
{
label: 'Webhooks',
icon: 'lucideShare',
isCollapsed: true,
children: [
{ label: 'Historique', url: '/webhooks/history' },
{ label: 'Statut des Requêtes', url: '/webhooks/status' },
{ label: 'Relancer Webhook', url: '/webhooks/retry' },
],
},
{ label: 'Utilisateurs & Sécurité', isTitle: true },
{
label: 'Gestion des Utilisateurs',
icon: 'lucideUsers',
url: '/users',
},
{ label: 'Configuration', isTitle: true },
{ label: 'Paramètres Système', icon: 'lucideSettings', url: '/settings' },
{ label: 'Intégrations Externes', icon: 'lucidePlug', url: '/integrations' },
{ label: 'Support & Profil', isTitle: true },
{ label: 'Support', icon: 'lucideLifeBuoy', url: '/support' },
{ label: 'Mon Profil', icon: 'lucideUser', url: '/profile' },
{ label: 'Informations', isTitle: true },
{ label: 'Documentation', icon: 'lucideBookOpen', url: '/documentation' },
{ label: 'Aide', icon: 'lucideHelpCircle', url: '/help' },
{ label: 'À propos', icon: 'lucideInfo', url: '/about' },
];
}
private getFullUserDropdown(): UserDropdownItemType[] {
return [
{ label: 'Welcome back!', isHeader: true },
{ label: 'Profile', icon: 'tablerUserCircle', url: '/profile' },
{ label: 'Account Settings', icon: 'tablerSettings2', url: '/settings' },
{ label: 'Support Center', icon: 'tablerHeadset', url: '/support' },
{ isDivider: true },
{
label: 'Log Out',
icon: 'tablerLogout2',
url: '/auth/logout',
class: 'fw-semibold text-danger'
},
];
}
}