Files
antrean-operasi/composables/useHakAkses.ts
2026-02-18 08:21:58 +07:00

82 lines
2.9 KiB
TypeScript

// composables/useHakAkses.ts
// Composable for handling user permissions/access based on hakAkses
import { useAuth } from "~/composables/useAuth";
export const useHakAkses = () => {
const {user, checkAuth} = useAuth();
/**
* Get all pages that user has access to based on their roles
*/
const getAllowedPages = async (): Promise<string[]> => {
// Pastikan user sudah ter-load dari cookie/session
// Jika user.value masih null, panggil checkAuth() untuk load dari API session
if (!user.value) {
console.log('🔄 User belum ter-load, memanggil checkAuth()...');
await checkAuth();
}
const currentUser = user.value;
console.log('Current User in getAllowedPages:', currentUser);
if (!currentUser || !currentUser.roles || currentUser.roles.length === 0) {
console.log('⚠️ User tidak memiliki roles');
return [];
}
try {
// Fetch all hak akses data
const response = await $fetch('/api/hak-akses');
if (response && typeof response === 'object' && 'success' in response && response.success && 'data' in response) {
const hakAksesList = Array.isArray(response.data) ? response.data : [];
// Filter hak akses that match user's roles and are active
const userHakAkses = hakAksesList.filter((hakAkses: any) =>
currentUser.roles?.includes(hakAkses.namaHakAkses) &&
hakAkses.status === 'aktif'
);
// Combine all pages from all matching hak akses
const allPages = userHakAkses.reduce((pages: string[], hakAkses: any) => {
if (hakAkses.pages && Array.isArray(hakAkses.pages)) {
return [...pages, ...hakAkses.pages];
}
return pages;
}, []);
// Remove duplicates
return [...new Set(allPages)];
}
return [];
} catch (error) {
console.error('Error fetching allowed pages:', error);
return [];
}
};
/**
* Check if user has access to a specific page
*/
const hasPageAccess = async (pagePath: string): Promise<boolean> => {
const allowedPages = await getAllowedPages();
return allowedPages.includes(pagePath);
};
/**
* Check if user has access to any page in a list
*/
const hasAnyPageAccess = async (pagePaths: string[]): Promise<boolean> => {
const allowedPages = await getAllowedPages();
return pagePaths.some(path => allowedPages.includes(path));
};
return {
getAllowedPages,
hasPageAccess,
hasAnyPageAccess
};
};