Files
AIOA/mobile/lib/features/profile/data/device_repository.dart
T
2026-07-18 19:20:07 +08:00

53 lines
1.6 KiB
Dart

import 'dart:convert';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
class UserDeviceItem {
const UserDeviceItem({
required this.id,
required this.name,
required this.platform,
required this.status,
required this.lastSeenAt,
});
final String id, name, platform, status;
final DateTime lastSeenAt;
factory UserDeviceItem.fromJson(Map<String, Object?> json) => UserDeviceItem(
id: json['id']! as String,
name: json['name']! as String,
platform: json['platform']! as String,
status: json['status']! as String,
lastSeenAt: DateTime.parse(json['lastSeenAt']! as String),
);
}
class DeviceRepository {
DeviceRepository({required this.client, required this.baseUrl});
static const _storage = FlutterSecureStorage();
final http.Client client;
final String baseUrl;
Future<List<UserDeviceItem>> list() async {
final response = await client.get(Uri.parse('$baseUrl/devices'));
if (response.statusCode < 200 || response.statusCode >= 300) {
throw Exception('设备列表加载失败');
}
return (jsonDecode(response.body) as List)
.map(
(item) =>
UserDeviceItem.fromJson(Map<String, Object?>.from(item as Map)),
)
.toList();
}
Future<void> revoke(String id) async {
final response = await client.delete(Uri.parse('$baseUrl/devices/$id'));
if (response.statusCode < 200 || response.statusCode >= 300) {
throw Exception('撤销设备失败');
}
}
Future<bool> isCurrent(String id) async =>
await _storage.read(key: 'device_id') == id;
}