Api client with cashe

PHOTO EMBED

Wed Jan 24 2024 17:20:57 GMT+0000 (Coordinated Universal Time)

Saved by @Timur #dart #flutter

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:dio_http_cache/dio_http_cache.dart';

import 'api_constants.dart';
import 'api_exceptions.dart';

abstract class ApiClient {
  Future<dynamic> get(String path, {Map<String, dynamic>? params});
  Future<dynamic> post(String path, Map<String, dynamic> data);
  Future<dynamic> patch(String path, Map<String, dynamic> data);
  Future<dynamic> delete(String path);
}

class ApiClientImpl extends ApiClient {
  // final AuthLocalDataSource localDataSource; // GET TOKEN FROM LOCAL DB
  final Dio client; // FOR CREATING REQUIEST

  ApiClientImpl(this.client);

  @override
  Future get(String path, {Map<String, dynamic>? params}) async {
    // String? token = await localDataSource.getSessionId();

    final Map<String, String> header = {
      // "Authorization": "Bearer $token",
    };

    final response = await client.get(
      getPath(path, params: params),
      options: buildCacheOptions(
        const Duration(
          days: 1,
        ),
        forceRefresh: true,
        maxStale: const Duration(days: 7),
        options: Options(contentType: "application/json", headers: header),
      ),
    );

    return _errorHandler(response);
  }

  @override
  Future delete(String path) async {}

  @override
  Future patch(String path, Map<String, dynamic> data) async {}

  @override
  Future post(String path, Map<String, dynamic> data) async {}

  _errorHandler(Response response) {
    if (response.statusCode == 200) {
      return response.data;
    } else if (response.statusCode == 400 ||
        response.statusCode == 403 ||
        response.statusCode == 401 ||
        response.statusCode == 405 ||
        response.statusCode == 500 ||
        response.statusCode == 409) {
      String msg = "unknown_error";
      var resp = jsonDecode(utf8.decode(response.data));

      if (resp.containsKey("error")) {
        msg = resp["error"];
      } else if (resp.containsKey("message")) {
        var rsp = resp["message"];
        if (rsp.runtimeType == String) msg = resp["message"];
        if (rsp.runtimeType == List) msg = rsp[0];
      } else {
        msg = utf8
            .decode(response.data)
            .replaceAll("[", '')
            .replaceAll("]", '')
            .replaceAll("}", '')
            .replaceAll("{", '')
            .replaceAll("\\", '');
      }
      throw ExceptionWithMessage(msg);
    } else if (response.statusCode == 401) {
      throw UnauthorisedException();
    } else {
      throw Exception(response.statusMessage);
    }
  }

  String getPath(String path, {Map<dynamic, dynamic>? params}) {
    var paramsString = '';
    if (params?.isNotEmpty ?? false) {
      params?.forEach((key, value) {
        paramsString += '&$key=$value';
      });
    }

    return '${ApiConstants.baseApiUrl}$path$paramsString';
  }
}
content_copyCOPY

flutter pub add dio