feat: 添加账号删除功能

This commit is contained in:
qzl
2026-04-10 10:40:44 +08:00
parent 17a1303f00
commit 46513829cd
30 changed files with 1510 additions and 664 deletions
+27 -1
View File
@@ -1,3 +1,6 @@
import 'package:dio/dio.dart';
import '../../../../core/network/api_problem.dart';
import '../../../../data/network/api_client.dart';
import '../models/session_response.dart';
@@ -25,9 +28,32 @@ class AuthApi {
}
Future<void> deleteSession({required String refreshToken}) async {
await _apiClient.deleteNoContent(
final response = await _apiClient.rawDio.delete<Map<String, dynamic>>(
'/api/v1/auth/sessions',
data: {'refresh_token': refreshToken},
options: Options(
validateStatus: (status) => status != null && status < 500,
),
);
final status = response.statusCode ?? 500;
if (status == 204 || status == 401) {
return;
}
final data = response.data;
if (data is Map<String, dynamic>) {
throw ApiProblem(
status: status,
title: (data['title'] as String?) ?? 'Request failed',
detail: (data['detail'] as String?) ?? '',
code: data['code'] as String?,
);
}
throw ApiProblem(
status: status,
title: 'Request failed',
detail: 'Failed to delete session',
);
}
@@ -1,4 +1,5 @@
import '../../../../core/auth/session_store.dart';
import '../../../../core/network/api_problem.dart';
import '../apis/auth_api.dart';
import '../models/auth_user.dart';
@@ -70,7 +71,14 @@ class AuthRepositoryImpl implements AuthRepository {
try {
final refreshToken = await _sessionStore.getRefreshToken();
if (refreshToken != null && refreshToken.isNotEmpty) {
await _authApi.deleteSession(refreshToken: refreshToken);
try {
await _authApi.deleteSession(refreshToken: refreshToken);
} on ApiProblem catch (problem) {
if (problem.status != 401 ||
problem.code != 'AUTH_REFRESH_TOKEN_INVALID') {
rethrow;
}
}
}
} finally {
await clearLocalSession();
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import '../../../../core/logging/logger.dart';
@@ -56,18 +58,19 @@ class AuthBloc extends ChangeNotifier {
}
Future<void> logout() async {
try {
await _repository.logout();
} catch (error, stackTrace) {
_logger.error(
message: 'User logout failed: ${error.runtimeType}',
error: error.runtimeType.toString(),
stackTrace: stackTrace,
);
}
_logger.info(message: 'User logged out');
_state = const AuthState(status: AuthStatus.unauthenticated);
notifyListeners();
unawaited(
_repository.logout().catchError((Object error, StackTrace stackTrace) {
_logger.error(
message: 'User logout failed: ${error.runtimeType}',
error: error.runtimeType.toString(),
stackTrace: stackTrace,
);
}),
);
}
Future<void> handleUnauthorized401() async {