refactor(apps): 重构数据层目录结构并新增启动预热编排器

This commit is contained in:
zl-q
2026-03-29 20:26:30 +08:00
parent 33340de8f9
commit 4db9a13bfe
108 changed files with 1653 additions and 1320 deletions
@@ -0,0 +1,127 @@
import 'package:social_app/data/network/i_api_client.dart';
class FriendsApi {
final IApiClient _client;
static const _prefix = '/api/v1/friends';
FriendsApi(this._client);
Future<List<FriendResponse>> getFriends() async {
final response = await _client.get(_prefix);
final List<dynamic> data = response.data;
return data.map((json) => FriendResponse.fromJson(json)).toList();
}
Future<List<FriendRequestResponse>> getOutgoingRequests() async {
final response = await _client.get('$_prefix/requests/outgoing');
final List<dynamic> data = response.data;
return data.map((json) => FriendRequestResponse.fromJson(json)).toList();
}
Future<FriendRequestResponse> sendRequest(
String targetUserId, {
String? content,
}) async {
final data = {'target_user_id': targetUserId, 'content': content};
final response = await _client.post('$_prefix/requests', data: data);
return FriendRequestResponse.fromJson(response.data);
}
Future<FriendRequestResponse> acceptRequest(String friendshipId) async {
final response = await _client.post(
'$_prefix/requests/$friendshipId/accept',
);
return FriendRequestResponse.fromJson(response.data);
}
Future<FriendRequestResponse> declineRequest(String friendshipId) async {
final response = await _client.post(
'$_prefix/requests/$friendshipId/decline',
);
return FriendRequestResponse.fromJson(response.data);
}
Future<void> removeFriend(String friendshipId) async {
await _client.delete('$_prefix/$friendshipId');
}
Future<FriendRequestResponse> getRequestById(String friendshipId) async {
final response = await _client.get('$_prefix/requests/$friendshipId');
return FriendRequestResponse.fromJson(response.data);
}
}
class FriendResponse {
final String id;
final UserBasicInfo friend;
final String status;
final DateTime createdAt;
final DateTime? acceptedAt;
FriendResponse({
required this.id,
required this.friend,
required this.status,
required this.createdAt,
this.acceptedAt,
});
factory FriendResponse.fromJson(Map<String, dynamic> json) {
return FriendResponse(
id: json['id'] as String,
friend: UserBasicInfo.fromJson(json['friend'] as Map<String, dynamic>),
status: json['status'] as String,
createdAt: DateTime.parse(json['created_at'] as String),
acceptedAt: json['accepted_at'] != null
? DateTime.parse(json['accepted_at'] as String)
: null,
);
}
}
class UserBasicInfo {
final String id;
final String username;
final String? avatarUrl;
UserBasicInfo({required this.id, required this.username, this.avatarUrl});
factory UserBasicInfo.fromJson(Map<String, dynamic> json) {
return UserBasicInfo(
id: json['id'] as String,
username: json['username'] as String,
avatarUrl: json['avatar_url'] as String?,
);
}
}
class FriendRequestResponse {
final String id;
final UserBasicInfo sender;
final UserBasicInfo recipient;
final String? content;
final String status;
final DateTime createdAt;
FriendRequestResponse({
required this.id,
required this.sender,
required this.recipient,
this.content,
required this.status,
required this.createdAt,
});
factory FriendRequestResponse.fromJson(Map<String, dynamic> json) {
return FriendRequestResponse(
id: json['id'] as String,
sender: UserBasicInfo.fromJson(json['sender'] as Map<String, dynamic>),
recipient: UserBasicInfo.fromJson(
json['recipient'] as Map<String, dynamic>,
),
content: json['content'] as String?,
status: json['status'] as String,
createdAt: DateTime.parse(json['created_at'] as String),
);
}
}
@@ -0,0 +1,73 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:social_app/data/network/i_api_client.dart';
import '../models/user_profile.dart';
class UserBasicInfo {
final String id;
final String username;
final String? avatarUrl;
UserBasicInfo({required this.id, required this.username, this.avatarUrl});
factory UserBasicInfo.fromJson(Map<String, dynamic> json) {
return UserBasicInfo(
id: json['id'] as String,
username: json['username'] as String,
avatarUrl: json['avatar_url'] as String?,
);
}
}
class UsersApi {
final IApiClient _client;
static const _prefix = '/api/v1/users';
UsersApi(this._client);
Future<UserBasicInfo> getById(String userId) async {
final response = await _client.get('$_prefix/$userId');
return UserBasicInfo.fromJson(response.data);
}
Future<UserProfile> getMe() async {
final response = await _client.get('$_prefix/me');
return UserProfile.fromJson(response.data);
}
Future<UserProfile> updateMe(UserUpdateRequest request) async {
final response = await _client.patch('$_prefix/me', data: request.toJson());
return UserProfile.fromJson(response.data);
}
Future<String> uploadAvatar(File file) async {
final formData = FormData.fromMap({
'file': await MultipartFile.fromFile(
file.path,
filename: file.path.split('/').last,
),
});
final response = await _client.post<Map<String, dynamic>>(
'$_prefix/me/avatar',
data: formData,
);
final payload = response.data;
if (payload is! Map<String, dynamic>) {
throw StateError('Invalid /users/me/avatar response');
}
final url = payload['url'];
if (url is! String) {
throw StateError('Missing url in /users/me/avatar response');
}
return url;
}
Future<List<UserProfile>> searchUsers(String query) async {
final response = await _client.post(
'$_prefix/search',
data: {'query': query},
);
final List<dynamic> data = response.data;
return data.map((json) => UserProfile.fromJson(json)).toList();
}
}