getLoginUsers method
fetches all selectable workers for the login dropdown.
Implementation
Future<List<DisplayUser>> getLoginUsers() async {
const candidateRoutes = <String>[
'/login/users',
'/loginUsers',
'/users/login',
];
List<DisplayUser> parseUsers(http.Response res) {
final raw = jsonDecode(res.body);
final entries = (raw is Map) ? raw['users'] : null;
if (entries is! List) return [];
final users = <DisplayUser>[];
for (final entry in entries) {
if (entry is! Map) continue;
final map = Map<String, dynamic>.from(entry);
String? pick(List<String> keys) {
for (final key in keys) {
final v = map[key];
if (v != null) {
final s = v.toString().trim();
if (s.isNotEmpty) return s;
}
}
for (final kv in map.entries) {
if (keys.any((k) => k.toLowerCase() == kv.key.toLowerCase())) {
final s = kv.value?.toString().trim() ?? '';
if (s.isNotEmpty) return s;
}
}
return null;
}
final kzl = (pick(['KZL', 'kzl']) ?? '').trim();
if (kzl.isEmpty || kzl == '??') continue;
final user = DisplayUser(kzl);
user.full_name = pick(['Vorname', 'vorname']);
user.full_surname = pick(['Name', 'name']);
users.add(user);
}
users.sort((a, b) {
final aName = '${a.full_surname ?? ''} ${a.full_name ?? ''} ${a.name}'
.toLowerCase();
final bName = '${b.full_surname ?? ''} ${b.full_name ?? ''} ${b.name}'
.toLowerCase();
return aName.compareTo(bName);
});
return users;
}
http.Response? lastResponse;
for (final route in candidateRoutes) {
final res = (await postJSON(RequestData(route)))?.forceRes();
lastResponse = res;
debugPrint(
'Remote.getLoginUsers route=$route status=${res?.statusCode} len=${res?.body.length ?? 0}',
);
if (res != null && (res.statusCode ~/ 100 == 2)) {
final users = parseUsers(res);
debugPrint('Remote.getLoginUsers parsed=${users.length} via $route');
return users;
}
if (res?.statusCode == 404) {
continue;
}
final preview = res?.body.substring(
0,
(res.body.length < 200) ? res.body.length : 200,
) ??
'';
debugPrint('Remote.getLoginUsers failed via $route: $preview');
throw ResponseException(res);
}
debugPrint(
'Remote.getLoginUsers failed: all candidate routes returned 404',
);
throw ResponseException(lastResponse);
}