searchBooks method

Future<List<Libro>> searchBooks({
  1. String? query,
  2. String? isbn,
})

Esegue una ricerca di libri tramite l'API di Google Books.

Se viene fornito un isbn, la ricerca viene effettuata per ISBN. Altrimenti, se viene fornita una query, la ricerca viene effettuata per titolo o autore. Restituisce una lista di oggetti Libro trovati oppure una lista vuota se non ci sono risultati o in caso di errore.

Implementation

Future<List<Libro>> searchBooks({String? query, String? isbn}) async {
  String searchParam = '';

  // Se é presente un ISBN, lo uso come parametro di ricerca, altrimenti uso la query
  if (isbn != null && isbn.isNotEmpty) {
    searchParam = 'isbn:$isbn';
  } else if (query != null && query.isNotEmpty) {
    searchParam = query;
  } else {
    return []; // Nessun parametro di ricerca valido
  }

  // https://www.googleapis.com/books/v1/volumes?q=isbn:....
  final url = '$_baseUrl?q=$searchParam&key=$_apiKey&maxResults=10';

  debugPrint('DEBUG API: Calling API: $url');

  try {
    final response = await http.get(Uri.parse(url));

    debugPrint('DEBUG API: Stato risposta: ${response.statusCode}');
    debugPrint('DEBUG API: Corpo risposta: ${response.body}');

    if (response.statusCode == 200) {
      // Con decode prendo la risposta JSON e la converto in una struttura nativa di Dart (una mappa)
      final Map<String, dynamic> data = json.decode(response.body);

      /* Struttura della risposta JSON
        {
          "kind": "books#volumes",
          "totalItems": 123,
          "items": [ // array contenente i libri trovati
            {
              "kind": "books#volume",
              "id": "...",
              "volumeInfo": { ... }, // Dettagli del libro
              // ... altri campi sul libro
            },
            {
              // ... un altro libro
            }
          ]
        }

      */

      // Accedo alla lista di libri trovati
      final List<dynamic>? items = data['items'];

      if (items != null && items.isNotEmpty) {
        // Mappa tutti gli elementi trovati in una lista di Libri
        return items
            .map((jsonItem) => Libro.fromGoogleBooksJson(jsonItem))
            .toList();
      } else {
        debugPrint('DEBUG API: Nessun elemento trovato nella risposta.');
      }
    } else {
      debugPrint('Errore API: ${response.statusCode}');
      debugPrint('Corpo della risposta: ${response.body}');
    }
  } catch (e) {
    debugPrint('Errore nella chiamata API (catch): $e');
  }
  return []; // Nessun libro trovato o errore, ritorna una lista vuota
}