fromResponse<T> static method

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

Implementation

static APIResponse<T> fromResponse<T>(
  String response,
  int statusCode, {
  bool log = true,
  String errorsField = 'errors',
}) {
  if (log) dev.log("response body: $response");
  try {
    Map responseData = jsonDecode(response);
    if (statusCode == 200) {
      if (responseData.containsKey(errorsField)) {
        Map<String, String> errors = {};
        for (String name in (responseData[errorsField] as Map).keys) {
          try {
            errors[name] =
                (responseData[errorsField][name] as List).join(', ');
          } catch (e) {
            errors[name] = responseData[errorsField][name].toString();
          }
        }
        responseData[errorsField] = errors;
      }
    } else {
      switch (statusCode) {
        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 (key != "success" && key != "message") {
        values[key] = responseData[key];
      }
    }
    if (values.isEmpty) {
      return APIResponse<T>(
        responseData["success"] ?? false,
        responseData["message"] ?? "",
        statusCode,
        errors: responseData[errorsField],
        body: responseData,
      );
    } else if (values.length == 1) {
      return APIResponse(
        responseData["success"] ?? false,
        responseData["message"] ?? "",
        statusCode,
        errors: responseData[errorsField],
        body: responseData,
        value: values[values.keys.first],
      );
    } else {
      return APIResponse(
        responseData["success"] ?? false,
        responseData["message"] ?? "",
        statusCode,
        errors: responseData[errorsField],
        body: responseData,
        value: values as T,
      );
    }
  } catch (e) {
    String strBody = response.toString();
    String body = strBody.substring(
      0,
      strBody.length < 10 ? strBody.length : 10,
    );
    dev.log("ERROR:$e");
    dev.log("body: $body");
    return APIResponse(
      false,
      "body: $body...",
      statusCode,
      body: strBody,
    );
  }
}