update user login baru dan hakakses
This commit is contained in:
No files matched your search
@@ -79,6 +79,47 @@ const getLastAccessFromKeycloak = async (userId: string, accessToken: string, co
|
||||
}
|
||||
};
|
||||
|
||||
// Helper to ensure database schema is up to date
|
||||
const ensureSchema = (db: any) => {
|
||||
try {
|
||||
const tableInfo = db.prepare("PRAGMA table_info(users)").all() as any[];
|
||||
const columnNames = tableInfo.map(col => col.name);
|
||||
|
||||
// Add missing columns one by one
|
||||
if (!columnNames.includes('realmRoles')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN realmRoles TEXT DEFAULT '[]'`);
|
||||
console.log('✅ Added column: realmRoles');
|
||||
}
|
||||
|
||||
if (!columnNames.includes('accountRoles')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN accountRoles TEXT DEFAULT '[]'`);
|
||||
console.log('✅ Added column: accountRoles');
|
||||
}
|
||||
|
||||
if (!columnNames.includes('resourceRoles')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN resourceRoles TEXT DEFAULT '[]'`);
|
||||
console.log('✅ Added column: resourceRoles');
|
||||
}
|
||||
|
||||
if (!columnNames.includes('lastLogin')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN lastLogin INTEGER`);
|
||||
console.log('✅ Added column: lastLogin');
|
||||
}
|
||||
|
||||
if (!columnNames.includes('given_name')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN given_name TEXT`);
|
||||
console.log('✅ Added column: given_name');
|
||||
}
|
||||
|
||||
if (!columnNames.includes('family_name')) {
|
||||
db.exec(`ALTER TABLE users ADD COLUMN family_name TEXT`);
|
||||
console.log('✅ Added column: family_name');
|
||||
}
|
||||
} catch (e: any) {
|
||||
console.error('❌ Schema migration error:', e.message);
|
||||
}
|
||||
};
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
console.log("📋 Users list endpoint called");
|
||||
|
||||
@@ -108,23 +149,33 @@ export default defineEventHandler(async (event) => {
|
||||
console.log("ℹ️ No valid session found, will use database values for last access");
|
||||
}
|
||||
|
||||
// Open database connection
|
||||
const db = new Database(dbPath);
|
||||
|
||||
// Ensure schema is up to date before querying
|
||||
ensureSchema(db);
|
||||
|
||||
// Get all users
|
||||
const users = db.prepare('SELECT * FROM users ORDER BY updatedAt DESC').all() as any[];
|
||||
|
||||
// Parse JSON fields and enrich with last access from Keycloak
|
||||
const formattedUsers = await Promise.all(users.map(async (user) => {
|
||||
// Try to get last access from Keycloak, fallback to database value
|
||||
let lastLogin = user.lastLogin || null;
|
||||
// Get lastLogin from database (handle null, 0, or undefined)
|
||||
let lastLogin: number | null = null;
|
||||
if (user.lastLogin !== null && user.lastLogin !== undefined && user.lastLogin !== 0) {
|
||||
lastLogin = user.lastLogin;
|
||||
}
|
||||
|
||||
// Only fetch from Keycloak if we have a valid user ID, access token, and config
|
||||
// And only if we don't have a valid lastLogin in database
|
||||
if (user.id && accessToken && config.keycloakIssuer) {
|
||||
try {
|
||||
const keycloakLastAccess = await getLastAccessFromKeycloak(user.id, accessToken, config);
|
||||
// Use Keycloak last access if available, otherwise keep database value
|
||||
// Use Keycloak last access if available and newer than database value
|
||||
if (keycloakLastAccess) {
|
||||
lastLogin = keycloakLastAccess;
|
||||
if (!lastLogin || keycloakLastAccess > lastLogin) {
|
||||
lastLogin = keycloakLastAccess;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
// Silently fail and use database value
|
||||
@@ -138,7 +189,7 @@ export default defineEventHandler(async (event) => {
|
||||
namaUser: user.namaUser,
|
||||
email: user.email,
|
||||
tipeUser: user.tipeUser || '',
|
||||
lastLogin: lastLogin,
|
||||
lastLogin: lastLogin, // Will be null if never logged in, otherwise timestamp in seconds
|
||||
roles: JSON.parse(user.roles || '[]'),
|
||||
realmRoles: JSON.parse(user.realmRoles || '[]'),
|
||||
accountRoles: JSON.parse(user.accountRoles || '[]'),
|
||||
|
||||
Reference in New Issue
Block a user