|
import 'package:itasmob/presentation/resources/strings_manager.dart';
|
|
import 'package:dio/dio.dart';
|
|
|
|
import 'failure.dart';
|
|
|
|
enum DataSource {
|
|
SUCCESS,
|
|
NO_CONTENT,
|
|
BAD_REQUEST,
|
|
FORBIDDEN,
|
|
UNAUTHORISED,
|
|
NOT_FOUND,
|
|
INTERNAL_SERVER_ERROR,
|
|
CONNECT_TIMEOUT,
|
|
CANCEL,
|
|
RECEIVE_TIMEOUT,
|
|
SEND_TIMEOUT,
|
|
CACHE_ERROR,
|
|
NO_INTERNET_CONNECTION,
|
|
DEFAULT
|
|
}
|
|
|
|
class ErrorHandler implements Exception {
|
|
late Failure failure;
|
|
|
|
ErrorHandler.handle(dynamic error) {
|
|
if (error is DioError) {
|
|
// dio error so its error from response of the API
|
|
failure = _handleError(error);
|
|
} else {
|
|
// default error
|
|
failure = DataSource.DEFAULT.getFailure();
|
|
}
|
|
}
|
|
|
|
Failure _handleError(DioError error) {
|
|
switch (error.type) {
|
|
case DioErrorType.connectTimeout:
|
|
return DataSource.CONNECT_TIMEOUT.getFailure();
|
|
case DioErrorType.sendTimeout:
|
|
return DataSource.SEND_TIMEOUT.getFailure();
|
|
case DioErrorType.receiveTimeout:
|
|
return DataSource.RECEIVE_TIMEOUT.getFailure();
|
|
case DioErrorType.response:
|
|
switch (error.response?.statusCode) {
|
|
case ResponseCode.BAD_REQUEST:
|
|
return DataSource.BAD_REQUEST.getFailure();
|
|
case ResponseCode.FORBIDDEN:
|
|
return DataSource.FORBIDDEN.getFailure();
|
|
case ResponseCode.UNAUTHORISED:
|
|
return DataSource.UNAUTHORISED.getFailure();
|
|
case ResponseCode.NOT_FOUND:
|
|
return DataSource.NOT_FOUND.getFailure();
|
|
case ResponseCode.INTERNAL_SERVER_ERROR:
|
|
return DataSource.INTERNAL_SERVER_ERROR.getFailure();
|
|
default:
|
|
return DataSource.DEFAULT.getFailure();
|
|
}
|
|
case DioErrorType.cancel:
|
|
return DataSource.CANCEL.getFailure();
|
|
case DioErrorType.other:
|
|
return DataSource.DEFAULT.getFailure();
|
|
}
|
|
}
|
|
}
|
|
|
|
extension DataSourceExtension on DataSource {
|
|
Failure getFailure() {
|
|
switch (this) {
|
|
case DataSource.BAD_REQUEST:
|
|
return Failure(ResponseCode.BAD_REQUEST, ResponseMessage.BAD_REQUEST);
|
|
case DataSource.FORBIDDEN:
|
|
return Failure(ResponseCode.FORBIDDEN, ResponseMessage.FORBIDDEN);
|
|
case DataSource.UNAUTHORISED:
|
|
return Failure(ResponseCode.UNAUTHORISED, ResponseMessage.UNAUTHORISED);
|
|
case DataSource.NOT_FOUND:
|
|
return Failure(ResponseCode.NOT_FOUND, ResponseMessage.NOT_FOUND);
|
|
case DataSource.INTERNAL_SERVER_ERROR:
|
|
return Failure(ResponseCode.INTERNAL_SERVER_ERROR,
|
|
ResponseMessage.INTERNAL_SERVER_ERROR);
|
|
case DataSource.CONNECT_TIMEOUT:
|
|
return Failure(
|
|
ResponseCode.CONNECT_TIMEOUT, ResponseMessage.CONNECT_TIMEOUT);
|
|
case DataSource.CANCEL:
|
|
return Failure(ResponseCode.CANCEL, ResponseMessage.CANCEL);
|
|
case DataSource.RECEIVE_TIMEOUT:
|
|
return Failure(
|
|
ResponseCode.RECEIVE_TIMEOUT, ResponseMessage.RECEIVE_TIMEOUT);
|
|
case DataSource.SEND_TIMEOUT:
|
|
return Failure(ResponseCode.SEND_TIMEOUT, ResponseMessage.SEND_TIMEOUT);
|
|
case DataSource.CACHE_ERROR:
|
|
return Failure(ResponseCode.CACHE_ERROR, ResponseMessage.CACHE_ERROR);
|
|
case DataSource.NO_INTERNET_CONNECTION:
|
|
return Failure(ResponseCode.NO_INTERNET_CONNECTION,
|
|
ResponseMessage.NO_INTERNET_CONNECTION);
|
|
case DataSource.DEFAULT:
|
|
return Failure(ResponseCode.DEFAULT, ResponseMessage.DEFAULT);
|
|
default:
|
|
return Failure(ResponseCode.DEFAULT, ResponseMessage.DEFAULT);
|
|
}
|
|
}
|
|
}
|
|
|
|
class ResponseCode {
|
|
// API status codes
|
|
static const int SUCCESS = 200; // success with data
|
|
static const int NO_CONTENT = 201; // success with no content
|
|
static const int BAD_REQUEST = 400; // failure, api rejected the request
|
|
static const int FORBIDDEN = 403; // failure, api rejected the request
|
|
static const int UNAUTHORISED = 401; // failure user is not authorised
|
|
static const int NOT_FOUND =
|
|
404; // failure, api url is not correct and not found
|
|
static const int INTERNAL_SERVER_ERROR =
|
|
500; // failure, crash happened in server side
|
|
|
|
// local status code
|
|
static const int DEFAULT = -1;
|
|
static const int CONNECT_TIMEOUT = -2;
|
|
static const int CANCEL = -3;
|
|
static const int RECEIVE_TIMEOUT = -4;
|
|
static const int SEND_TIMEOUT = -5;
|
|
static const int CACHE_ERROR = -6;
|
|
static const int NO_INTERNET_CONNECTION = -7;
|
|
}
|
|
|
|
class ResponseMessage {
|
|
// API status codes
|
|
// API response codes
|
|
static const String SUCCESS = AppStrings.success; // success with data
|
|
static const String NO_CONTENT =
|
|
AppStrings.noContent; // success with no content
|
|
static const String BAD_REQUEST =
|
|
AppStrings.badRequestError; // failure, api rejected our request
|
|
static const String FORBIDDEN =
|
|
AppStrings.forbiddenError; // failure, api rejected our request
|
|
static const String UNAUTHORISED =
|
|
AppStrings.unauthorizedError; // failure, user is not authorised
|
|
static const String NOT_FOUND = AppStrings
|
|
.notFoundError; // failure, API url is not correct and not found in api side.
|
|
static const String INTERNAL_SERVER_ERROR =
|
|
AppStrings.internalServerError; // failure, a crash happened in API side.
|
|
|
|
// local responses codes
|
|
static const String DEFAULT =
|
|
AppStrings.defaultError; // unknown error happened
|
|
static const String CONNECT_TIMEOUT =
|
|
AppStrings.timeoutError; // issue in connectivity
|
|
static const String CANCEL =
|
|
AppStrings.defaultError; // API request was cancelled
|
|
static const String RECEIVE_TIMEOUT =
|
|
AppStrings.timeoutError; // issue in connectivity
|
|
static const String SEND_TIMEOUT =
|
|
AppStrings.timeoutError; // issue in connectivity
|
|
static const String CACHE_ERROR = AppStrings
|
|
.defaultError; // issue in getting data from local data source (cache)
|
|
static const String NO_INTERNET_CONNECTION =
|
|
AppStrings.noInternetError; // issue in connectivity
|
|
}
|
|
|
|
class ApiInternalStatus {
|
|
static const String SUCCESS = "ok";
|
|
static const int FAILURE = 1;
|
|
}
|