108 lines
3.1 KiB
TypeScript
108 lines
3.1 KiB
TypeScript
import fs from 'fs';
|
||
import path from 'path';
|
||
|
||
interface User {
|
||
id: string;
|
||
namaUser: string;
|
||
email: string;
|
||
hakAkses: string[];
|
||
status: string;
|
||
}
|
||
|
||
const filePath = path.resolve('data/mock/users.json');
|
||
|
||
// Helper to read JSON file
|
||
const readData = (): User[] => {
|
||
try {
|
||
const data = fs.readFileSync(filePath, 'utf-8');
|
||
return JSON.parse(data);
|
||
} catch (error) {
|
||
console.error('Error reading users.json:', error);
|
||
return [];
|
||
}
|
||
};
|
||
|
||
// Helper to write JSON file
|
||
const writeData = (data: User[]): boolean => {
|
||
try {
|
||
fs.writeFileSync(filePath, JSON.stringify(data, null, 4), 'utf-8');
|
||
return true;
|
||
} catch (error) {
|
||
console.error('Error writing users.json:', error);
|
||
return false;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Sync user data from Keycloak to users.json
|
||
* Add user if not exists, update hakAkses if exists
|
||
*/
|
||
export const syncUserData = (userData: {
|
||
id: string;
|
||
name: string;
|
||
email: string;
|
||
roles: string[];
|
||
}): { action: 'created' | 'updated' | 'skipped', message: string } => {
|
||
const data = readData();
|
||
|
||
// Check if user exists
|
||
const existingUserIndex = data.findIndex(user => user.id === userData.id);
|
||
|
||
if (existingUserIndex === -1) {
|
||
// User doesn't exist, create new
|
||
const newUser: User = {
|
||
id: userData.id,
|
||
namaUser: userData.name,
|
||
email: userData.email,
|
||
hakAkses: userData.roles,
|
||
status: 'aktif'
|
||
};
|
||
|
||
data.push(newUser);
|
||
|
||
const success = writeData(data);
|
||
if (success) {
|
||
console.log(`✅ Created new user: ${userData.name} (${userData.email})`);
|
||
return {
|
||
action: 'created',
|
||
message: `User ${userData.name} created successfully`
|
||
};
|
||
} else {
|
||
console.error('❌ Failed to create user');
|
||
return {
|
||
action: 'skipped',
|
||
message: 'Failed to write user data'
|
||
};
|
||
}
|
||
} else {
|
||
// User exists, update hakAkses if different
|
||
const existingUser = data[existingUserIndex];
|
||
const rolesChanged = JSON.stringify(existingUser.hakAkses.sort()) !== JSON.stringify(userData.roles.sort());
|
||
|
||
if (rolesChanged) {
|
||
existingUser.hakAkses = userData.roles;
|
||
|
||
const success = writeData(data);
|
||
if (success) {
|
||
console.log(`✅ Updated user roles: ${userData.name}`);
|
||
return {
|
||
action: 'updated',
|
||
message: `User ${userData.name} roles updated`
|
||
};
|
||
} else {
|
||
console.error('❌ Failed to update user');
|
||
return {
|
||
action: 'skipped',
|
||
message: 'Failed to write user data'
|
||
};
|
||
}
|
||
} else {
|
||
console.log(`ℹ️ User ${userData.name} already exists with same roles`);
|
||
return {
|
||
action: 'skipped',
|
||
message: `User ${userData.name} already up to date`
|
||
};
|
||
}
|
||
}
|
||
};
|