networking and error handling

This commit is contained in:
amirrezaghabeli
2025-08-12 14:40:49 +03:30
parent 382ed4a2d6
commit 4aeb9229a4
14 changed files with 477 additions and 205 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
import 'network_manager.dart';
import '../../core/config/network_manager.dart';
class AuthService {
AuthService({required NetworkManager networkManager})
+2 -1
View File
@@ -6,7 +6,8 @@ import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/mock_data/home_mock_data.dart';
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart';
import 'package:tm_app/data/services/network_manager.dart';
import '../../core/config/network_manager.dart';
class HomeService {
HomeService({required NetworkManager networkManager})
-129
View File
@@ -1,129 +0,0 @@
import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';
class NetworkManager {
final Dio mainDio;
NetworkManager()
: mainDio = Dio(
BaseOptions(
// baseUrl: 'https://stage.cura-bau.de',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
contentType: 'application/json',
headers: {'Accept': 'application/json'},
),
);
Future<void> init() async {
await addInterceptors();
}
Future<void> addInterceptors() async {
final requestInterceptor = InterceptorsWrapper(
onRequest: (options, handler) {
// TODO: add more
return handler.next(options);
},
);
mainDio.interceptors.add(requestInterceptor);
}
Future<T> makeRequest<T>(
String endpoint,
T Function(Map<String, dynamic>) fromJson, {
String method = 'GET',
FormData? data,
}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
Dio dioInstance = mainDio;
await addInterceptors();
Future<Response> makeApiCall(String token, String url) async {
final headers =
token.isEmpty
? <String, String>{}
: {'Authorization': 'Bearer $token'};
switch (method.toUpperCase()) {
case 'POST':
return await dioInstance.post(
url + endpoint,
data: data,
options: Options(headers: headers),
);
case 'PUT':
return await dioInstance.put(
url + endpoint,
data: data,
options: Options(headers: headers),
);
case 'PATCH':
return await dioInstance.patch(
url + endpoint,
data: data,
options: Options(headers: headers),
);
case 'DELETE':
return await dioInstance.delete(
url + endpoint,
data: data,
options: Options(headers: headers),
);
case 'GET':
return await dioInstance.get(
url + endpoint,
data: data,
options: Options(headers: headers),
);
default:
return await dioInstance.get(
url + endpoint,
options: Options(headers: headers),
);
}
}
try {
String? bearerToken = prefs.getString('bearer');
String? url = prefs.getString('url');
Response res = await makeApiCall(bearerToken ?? '', url ?? '');
switch (res.statusCode) {
case 200:
case 201:
return fromJson(res.data);
case 401:
break;
case 403:
throw Exception('Forbidden: ${res.data['message']}');
case 404:
throw Exception('Not found: ${res.data['message']}');
case 423:
throw Exception('Locked: ${res.data['message']}');
case 500:
throw Exception('Internal server error: ${res.data['message']}');
default:
throw Exception('Error: ${res.data['message']}');
}
} on DioException catch (e) {
if (e.response?.statusCode == 401) {
// await api.refreshToken();
String? bearerToken = prefs.getString('bearer');
String? url = prefs.getString('url');
Response res = await makeApiCall(bearerToken ?? '', url ?? '');
if (res.statusCode == 200 || res.statusCode == 201) {
return fromJson(res.data);
}
throw Exception(e.message ?? 'Error occurred');
}
} catch (e) {
throw Exception(e.toString());
}
throw Exception('Unhandled error occurred');
}
}
+2 -1
View File
@@ -5,7 +5,8 @@ import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/mock_data/tender_detail_mock.dart';
import 'package:tm_app/data/services/model/tender_detail_request/tender_detail_request.dart';
import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_response_model.dart';
import 'package:tm_app/data/services/network_manager.dart';
import '../../core/config/network_manager.dart';
class TenderDetailService {
TenderDetailService({required NetworkManager networkManager})
+2 -1
View File
@@ -10,7 +10,8 @@ import 'package:tm_app/data/services/model/tenders/tender_reject_response/tender
import 'package:tm_app/data/services/model/tenders/tender_submit_response/tender_submit_response.dart';
import 'package:tm_app/data/services/model/tenders/tenders_request/tenders_request.dart';
import 'package:tm_app/data/services/model/tenders/tenders_response/tenders_response.dart';
import 'package:tm_app/data/services/network_manager.dart';
import '../../core/config/network_manager.dart';
class TendersService {
TendersService({required NetworkManager networkManager})