getEntityFieldsData method

Future<List> getEntityFieldsData({
  1. required String entity,
  2. List<String>? fields,
  3. String? keyField,
  4. String? keyValue,
})

Retrieves data from any Dynamics 365 entity as a list.

Supports optional field selection and filtering: entity - the name of the target entity. fields - optional list of fields to select from the entity. keyField & keyValue - optional filter to return only matching records.

Returns a list of records (dynamic objects) or an empty list if the request fails.

Implementation

Future<List<dynamic>> getEntityFieldsData({
  required String entity,
  List<String>? fields,
  String? keyField,
  String? keyValue,
}) async {
  final token = await getAccessToken();
  if (token == null) return [];

  // Build select query if fields are provided
  String selectQuery = '';
  if (fields != null && fields.isNotEmpty) {
    selectQuery = "\$select=${fields.join(',')}";
  }

  // Build filter query if keyField and keyValue are provided
  String filterQuery = '';
  if (keyField != null && keyValue != null) {
    filterQuery = "\$filter=$keyField eq '$keyValue'";
  }

  // Combine select + filter
  String query = '';
  if (selectQuery.isNotEmpty && filterQuery.isNotEmpty) {
    query = "$selectQuery&$filterQuery";
  } else if (selectQuery.isNotEmpty) {
    query = selectQuery;
  } else if (filterQuery.isNotEmpty) {
    query = filterQuery;
  }

  final String url = query.isNotEmpty
      ? "$resource/data/$entity?$query"
      : "$resource/data/$entity";

  final response = await http.get(
    Uri.parse(url),
    headers: {
      "Authorization": "Bearer $token",
      "Content-Type": "application/json",
      "Accept": "application/json",
    },
  );

  if (response.statusCode == 200) {
    return jsonDecode(response.body)["value"] ?? [];
  } else {
    print(
        "❌ Failed to get $entity: ${response.statusCode} - ${response.body}");
    return [];
  }
}