fromResponse<T> static method

APIResponse<T> fromResponse<T>(
  1. String response,
  2. int statusCode, {
  3. bool log = true,
  4. String errorsField = 'errors',
  5. Map<String, String> decodeErrors(
    1. Map errors
    )?,
})

Implementation

static APIResponse<T> fromResponse<T>(
  String response,
  int statusCode, {
  bool log = true,
  String errorsField = 'errors',
  Map<String, String> Function(Map errors)? decodeErrors,
}) {
  try {
    Map responseData = jsonDecode(response);

    if (!responseData.containsKey('message')) {
      switch (statusCode) {
        case 200:
          responseData["message"] = "No response message";
          break;
        case 400:
          responseData["message"] = "Error[$statusCode]: Bad request";
          break;
        case 403:
          responseData["message"] =
              "Error[$statusCode]: Unauthorized response";
          break;
        default:
          responseData["message"] =
              "response failed with status: $statusCode";
      }
    }

    Map values = {
      for (var key in responseData.keys)
        if (!["success", "message", errorsField].contains(key))
          key: responseData[key]
    };

    Map<String, String> errors = responseData.containsKey(errorsField)
        ? decodeErrors?.call(responseData[errorsField]) ??
            Map<String, String>.from(responseData[errorsField]!)
        : {};

    final value = values.length == 1
        ? values[values.keys.first]
        : values.isNotEmpty
            ? values
            : null;

    dev.log(
      "[StorageDatabase.StorageAPI.Response] - reqErrors: ${jsonEncode(errors)}",
    );
    dev.log(
      "[StorageDatabase.StorageAPI.Response] - reqValue: ${jsonEncode(value)}",
    );

    return APIResponse<T>(
      responseData["success"] ?? false,
      responseData["message"] ?? 'No response message',
      statusCode,
      errors: errors,
      body: responseData,
      value: value as T,
    );
  } catch (e) {
    String strBody = response.toString();
    String body = strBody.substring(
      0,
      strBody.length < 50 ? strBody.length : 50,
    );

    dev.log("[StorageDatabase.StorageAPI.Response] - reqErr: $e");
    dev.log("[StorageDatabase.StorageAPI.Response] - resBody: $body");

    return APIResponse(
      false,
      "body: $body...",
      statusCode,
      body: strBody,
    );
  }
}