feat: complete leave approval MVP
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user