Fix admin users list on partially migrated v2 DB

This commit is contained in:
Christian 2026-03-07 03:02:45 +01:00
parent ba9622250a
commit 7e77266d97
2 changed files with 45 additions and 17 deletions

View File

@ -22,14 +22,37 @@ class UserPasswordResetRequest(BaseModel):
new_password: str = Field(..., min_length=8, max_length=128)
def _users_column_exists(column_name: str) -> bool:
result = execute_query_single(
"""
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'users'
AND column_name = %s
LIMIT 1
""",
(column_name,)
)
return bool(result)
@router.get("/admin/users", dependencies=[Depends(require_permission("users.manage"))])
async def list_users():
is_2fa_expr = "u.is_2fa_enabled" if _users_column_exists("is_2fa_enabled") else "FALSE AS is_2fa_enabled"
telefoni_extension_expr = "u.telefoni_extension" if _users_column_exists("telefoni_extension") else "NULL::varchar AS telefoni_extension"
telefoni_active_expr = "u.telefoni_aktiv" if _users_column_exists("telefoni_aktiv") else "FALSE AS telefoni_aktiv"
telefoni_ip_expr = "u.telefoni_phone_ip" if _users_column_exists("telefoni_phone_ip") else "NULL::varchar AS telefoni_phone_ip"
telefoni_username_expr = "u.telefoni_phone_username" if _users_column_exists("telefoni_phone_username") else "NULL::varchar AS telefoni_phone_username"
last_login_expr = "u.last_login_at" if _users_column_exists("last_login_at") else "NULL::timestamp AS last_login_at"
try:
users = execute_query(
"""
f"""
SELECT u.user_id, u.username, u.email, u.full_name,
u.is_active, u.is_superadmin, u.is_2fa_enabled,
u.telefoni_extension, u.telefoni_aktiv, u.telefoni_phone_ip, u.telefoni_phone_username,
u.created_at, u.last_login_at,
u.is_active, u.is_superadmin, {is_2fa_expr},
{telefoni_extension_expr}, {telefoni_active_expr}, {telefoni_ip_expr}, {telefoni_username_expr},
u.created_at, {last_login_expr},
COALESCE(array_remove(array_agg(g.name), NULL), ARRAY[]::varchar[]) AS groups
FROM users u
LEFT JOIN user_groups ug ON u.user_id = ug.user_id
@ -39,6 +62,9 @@ async def list_users():
"""
)
return users
except Exception as exc:
logger.error("❌ Failed to load admin users: %s", exc)
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Could not load users") from exc
@router.post("/admin/users", status_code=status.HTTP_201_CREATED, dependencies=[Depends(require_permission("users.manage"))])

View File

@ -2241,14 +2241,16 @@ async function loadUsers() {
async function loadAdminUsers() {
try {
const response = await fetch('/api/v1/admin/users');
if (!response.ok) throw new Error('Failed to load users');
if (!response.ok) {
throw new Error(await getErrorMessage(response, 'Kunne ikke indlaese brugere'));
}
usersCache = await response.json();
displayUsers(usersCache);
populateTelefoniTestUsers(usersCache);
} catch (error) {
console.error('Error loading users:', error);
const tbody = document.getElementById('usersTableBody');
tbody.innerHTML = '<tr><td colspan="11" class="text-center text-muted py-5">Kunne ikke indlæse brugere</td></tr>';
tbody.innerHTML = `<tr><td colspan="11" class="text-center text-muted py-5">${escapeHtml(error.message || 'Kunne ikke indlaese brugere')}</td></tr>`;
}
}