79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import { randomUUID } from 'crypto';
|
|
import type { HakAkses } from '~/types/setting';
|
|
|
|
const filePath = path.resolve('data/mock/hakAkses.json');
|
|
|
|
// Helper to read JSON file
|
|
const readData = (): HakAkses[] => {
|
|
try {
|
|
const data = fs.readFileSync(filePath, 'utf-8');
|
|
return JSON.parse(data);
|
|
} catch (error) {
|
|
console.error('Error reading hakAkses.json:', error);
|
|
return [];
|
|
}
|
|
};
|
|
|
|
// Helper to write JSON file
|
|
const writeData = (data: HakAkses[]): boolean => {
|
|
try {
|
|
fs.writeFileSync(filePath, JSON.stringify(data, null, 4), 'utf-8');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('Error writing hakAkses.json:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Sync roles from Keycloak to hakAkses.json
|
|
* Add any missing roles with inactive status and empty pages
|
|
*/
|
|
export const syncHakAksesFromRoles = (roles: string[]): { added: string[], skipped: string[] } => {
|
|
const data = readData();
|
|
const added: string[] = [];
|
|
const skipped: string[] = [];
|
|
|
|
let hasChanges = false;
|
|
|
|
for (const role of roles) {
|
|
// Check if role already exists
|
|
const exists = data.some(item => item.namaHakAkses === role);
|
|
|
|
if (!exists) {
|
|
// Generate new UUID
|
|
const newId = randomUUID();
|
|
|
|
// Add new hak akses
|
|
const newHakAkses: HakAkses = {
|
|
id: newId,
|
|
namaHakAkses: role,
|
|
status: 'tidak aktif',
|
|
pages: []
|
|
};
|
|
|
|
data.push(newHakAkses);
|
|
added.push(role);
|
|
hasChanges = true;
|
|
|
|
console.log(`✅ Added new hak akses: ${role} (id: ${newId})`);
|
|
} else {
|
|
skipped.push(role);
|
|
}
|
|
}
|
|
|
|
// Write back to file if there are changes
|
|
if (hasChanges) {
|
|
const success = writeData(data);
|
|
if (success) {
|
|
console.log(`📝 Updated hakAkses.json with ${added.length} new roles`);
|
|
} else {
|
|
console.error('❌ Failed to update hakAkses.json');
|
|
}
|
|
}
|
|
|
|
return { added, skipped };
|
|
};
|