update user login baru dan hakakses

This commit is contained in:
Fanrouver
2025-12-18 15:11:41 +07:00
parent dfcd59481c
commit c95da96017
20 changed files with 2564 additions and 404 deletions

No files matched your search

+56 -5
View File
@@ -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 || '[]'),