import 'dart:convert'; import 'package:http/http.dart' as http; class AdminRepository { AdminRepository({required this.client, required this.baseUrl}); final http.Client client; final String baseUrl; Future> permissions() async => ((await _get('/me'))['permissions'] as List).cast().toSet(); Future> dashboard() async { final values = await Future.wait([ _get('/admin/metrics'), _list('/admin/organization/departments'), _list('/admin/organization/roles'), _list('/admin/organization/users'), _list('/admin/workflows/definitions'), _list('/admin/workflows/instances'), _list('/admin/audit-events?limit=100'), _list('/admin/process-configuration/forms'), _list('/admin/process-configuration/bindings'), ]); return { 'metrics': values[0], 'departments': values[1], 'roles': values[2], 'users': values[3], 'definitions': values[4], 'instances': values[5], 'audits': values[6], 'formVersions': values[7], 'bindings': values[8], }; } Future createDepartment(String code, String name) => _write( 'POST', '/admin/organization/departments', {'code': code, 'name': name}, ); Future replaceRoles(String userId, Set roles) => _write( 'PUT', '/admin/organization/users/$userId/roles', {'roles': roles.toList()}, ); Future> _get(String path) async { final r = await client.get(Uri.parse('$baseUrl$path')); _ok(r); return Map.from(jsonDecode(r.body) as Map); } Future>> _list(String path) async { final r = await client.get(Uri.parse('$baseUrl$path')); _ok(r); return (jsonDecode(r.body) as List) .map((e) => Map.from(e as Map)) .toList(); } Future _write( String method, String path, Map body, ) async { final request = http.Request(method, Uri.parse('$baseUrl$path')) ..headers['Content-Type'] = 'application/json' ..body = jsonEncode(body); final r = await http.Response.fromStream(await client.send(request)); _ok(r); } void _ok(http.Response r) { if (r.statusCode < 200 || r.statusCode >= 300) { throw Exception('管理请求失败(${r.statusCode})'); } } }