247 lines
7.5 KiB
TypeScript
247 lines
7.5 KiB
TypeScript
// server/api/permission.get.ts
|
|
// Proxy endpoint to fetch permissions from backend API with placeholder fallback
|
|
|
|
// Placeholder data for testing (matching the example API response)
|
|
const PLACEHOLDER_PERMISSIONS: Record<string, any> = {
|
|
'superadmin_STIM': {
|
|
message: "Data permission berhasil diambil",
|
|
data: [
|
|
{
|
|
id: 1,
|
|
create: false,
|
|
read: true,
|
|
update: false,
|
|
disable: false,
|
|
delete: false,
|
|
active: true,
|
|
pagename: "Halaman Utama",
|
|
pagesID: 1,
|
|
level: 1,
|
|
sort: 1
|
|
},
|
|
{
|
|
id: 6,
|
|
create: false,
|
|
read: true,
|
|
update: false,
|
|
disable: false,
|
|
delete: false,
|
|
active: true,
|
|
pagename: "Halaman Utama",
|
|
pagesID: 1,
|
|
level: 1,
|
|
sort: 1
|
|
},
|
|
{
|
|
id: 2,
|
|
create: false,
|
|
read: true,
|
|
update: false,
|
|
disable: false,
|
|
delete: false,
|
|
active: true,
|
|
pagename: "Pengaturan",
|
|
pagesID: 2,
|
|
level: 1,
|
|
sort: 2
|
|
},
|
|
{
|
|
id: 3,
|
|
create: false,
|
|
read: true,
|
|
update: false,
|
|
disable: true,
|
|
delete: false,
|
|
active: true,
|
|
pagename: "Halaman",
|
|
pagesID: 3,
|
|
level: 2,
|
|
sort: 3,
|
|
parent: 2
|
|
},
|
|
{
|
|
id: 7,
|
|
create: false,
|
|
read: true,
|
|
update: false,
|
|
disable: true,
|
|
delete: false,
|
|
active: true,
|
|
pagename: "Dashboard",
|
|
pagesID: 15,
|
|
level: 1,
|
|
sort: 2
|
|
}
|
|
],
|
|
meta: {
|
|
count: 5,
|
|
total: 5
|
|
}
|
|
}
|
|
};
|
|
|
|
// Mapping untuk role dan group yang berbeda
|
|
const roleGroupMapping: Record<string, { role: string; group: string }> = {
|
|
// Mapping untuk role default-roles-sandbox dengan group Instalasi STIM
|
|
'default-roles-sandbox_instalasi stim': { role: 'superadmin', group: 'STIM' },
|
|
'default-roles-sandbox_stim': { role: 'superadmin', group: 'STIM' },
|
|
// Tambahkan mapping lain jika diperlukan
|
|
};
|
|
|
|
// Normalize group name (remove "Instalasi" prefix if exists)
|
|
const normalizeGroup = (group: string): string => {
|
|
const normalized = group.trim();
|
|
// Jika group mengandung "Instalasi STIM", ambil hanya "STIM"
|
|
if (normalized.toLowerCase().includes('instalasi')) {
|
|
const parts = normalized.split(/\s+/);
|
|
const stimIndex = parts.findIndex(p => p.toLowerCase() === 'stim');
|
|
if (stimIndex !== -1) {
|
|
return 'STIM';
|
|
}
|
|
}
|
|
// Jika group adalah "Instalasi STIM", return "STIM"
|
|
if (normalized.toLowerCase() === 'instalasi stim') {
|
|
return 'STIM';
|
|
}
|
|
return normalized.toUpperCase();
|
|
};
|
|
|
|
// Normalize role name
|
|
const normalizeRole = (role: string): string => {
|
|
const normalized = role.toLowerCase().trim();
|
|
// Mapping khusus untuk role default
|
|
if (normalized === 'default-roles-sandbox') {
|
|
return 'superadmin';
|
|
}
|
|
return normalized;
|
|
};
|
|
|
|
// Get placeholder data for a role+group combination
|
|
const getPlaceholderData = (role: string, group: string): any | null => {
|
|
const normalizedRole = normalizeRole(role);
|
|
const normalizedGroup = normalizeGroup(group);
|
|
const key = `${normalizedRole}_${normalizedGroup}`;
|
|
|
|
// Check direct match
|
|
let data = PLACEHOLDER_PERMISSIONS[key];
|
|
if (data) return data;
|
|
|
|
// Check mapping
|
|
const mappingKey = `${role.toLowerCase()}_${group.toLowerCase()}`;
|
|
const mapping = roleGroupMapping[mappingKey];
|
|
if (mapping) {
|
|
const mappedKey = `${mapping.role.toLowerCase()}_${mapping.group.toUpperCase()}`;
|
|
return PLACEHOLDER_PERMISSIONS[mappedKey] || null;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
console.log("🔐 Permission endpoint called");
|
|
|
|
const query = getQuery(event);
|
|
const roles = query.roles as string | string[];
|
|
const groups = query.groups as string | string[];
|
|
|
|
// Check if placeholder mode is enabled via query parameter or environment variable
|
|
// Default to true for testing/development (use placeholder if backend fails)
|
|
const forcePlaceholder = query.usePlaceholder === 'true' ||
|
|
process.env.USE_PLACEHOLDER_PERMISSIONS === 'true';
|
|
const disablePlaceholder = query.usePlaceholder === 'false';
|
|
|
|
if (!roles && !groups) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: "roles or groups parameter is required",
|
|
});
|
|
}
|
|
|
|
// Convert to arrays and handle single values
|
|
const rolesArray = Array.isArray(roles) ? roles : roles ? [roles] : [];
|
|
const groupsArray = Array.isArray(groups) ? groups : groups ? [groups] : [];
|
|
|
|
// Extract primary role and group (use first one or combine)
|
|
let primaryRole = rolesArray[0] || '';
|
|
let primaryGroup = groupsArray[0] || '';
|
|
|
|
// Normalize role and group
|
|
primaryRole = normalizeRole(primaryRole);
|
|
primaryGroup = normalizeGroup(primaryGroup);
|
|
|
|
console.log(`📋 Normalized params - roles: ${primaryRole}, groups: ${primaryGroup}`);
|
|
|
|
// Check for placeholder data first if placeholder mode is forced
|
|
if (forcePlaceholder && !disablePlaceholder) {
|
|
const placeholderData = getPlaceholderData(primaryRole, primaryGroup);
|
|
if (placeholderData) {
|
|
console.log(`📦 Using placeholder data (forced) for role: ${primaryRole}, group: ${primaryGroup}`);
|
|
return placeholderData;
|
|
}
|
|
console.log(`⚠️ No placeholder data found for role: ${primaryRole}, group: ${primaryGroup}`);
|
|
}
|
|
|
|
// Build query parameters (use normalized values for API)
|
|
const params = new URLSearchParams();
|
|
if (primaryRole) params.append('roles', primaryRole);
|
|
if (primaryGroup) params.append('groups', primaryGroup);
|
|
|
|
// Backend API URL - adjust this to match your backend
|
|
const backendUrl = `http://10.10.123.140:8089/api/v1/permission?${params.toString()}`;
|
|
|
|
try {
|
|
console.log(`📡 Fetching permissions from: ${backendUrl}`);
|
|
console.log(`📋 Query params - roles: ${primaryRole}, groups: ${primaryGroup}`);
|
|
|
|
const response = await $fetch(backendUrl, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Accept': 'application/json',
|
|
},
|
|
});
|
|
|
|
console.log("✅ Permission data fetched successfully");
|
|
console.log("📦 Response structure:", {
|
|
hasMessage: !!(response as any).message,
|
|
hasData: !!(response as any).data,
|
|
dataLength: Array.isArray((response as any).data) ? (response as any).data.length : 0,
|
|
hasMeta: !!(response as any).meta,
|
|
});
|
|
|
|
// Log first permission item for debugging
|
|
if ((response as any).data && Array.isArray((response as any).data) && (response as any).data.length > 0) {
|
|
console.log("📄 Sample permission item:", (response as any).data[0]);
|
|
}
|
|
|
|
// Return the response as-is (it should have { message, data, meta } structure)
|
|
return response;
|
|
} catch (error: any) {
|
|
console.error("❌ Error fetching permissions:", error);
|
|
console.error("❌ Error details:", {
|
|
message: error.message,
|
|
status: error.status || error.statusCode,
|
|
statusText: error.statusText || error.statusMessage,
|
|
data: error.data,
|
|
});
|
|
|
|
// Fallback to placeholder data if available
|
|
const placeholderData = getPlaceholderData(primaryRole, primaryGroup);
|
|
if (placeholderData) {
|
|
console.log(`📦 Falling back to placeholder data for role: ${primaryRole}, group: ${primaryGroup}`);
|
|
return placeholderData;
|
|
}
|
|
|
|
// Return empty permissions structure if API fails and no placeholder available
|
|
return {
|
|
message: error.message || "Failed to fetch permissions",
|
|
data: [],
|
|
meta: {
|
|
count: 0,
|
|
total: 0
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|