1
resposta

Evoluindo o Codigo Agendando consultas para uma clínica veterinária

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart';
import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:diacritic/diacritic.dart'; 

void main() async {
  await initializeDateFormatting('pt_BR', null);
  await exibirMenu();
}

Future<void> exibirMenu() async {
  while (true) {
    print("=== Sistema de Consultas Veterinárias ===");
    print("1 Buscar por nome do profissional");
    print("2 Buscar por nome do pet");
    print("0 Sair");
    stdout.write("Escolha uma opção: ");
    String? opcao = stdin.readLineSync();

    if (opcao == '1') {
      stdout.write("\nDigite o nome do profissional: ");
      String? nome = stdin.readLineSync();
      if (nome != null && nome.isNotEmpty) {
        await buscarConsultas(filtro: nome, tipo: "veterinarian");
      }
    } else if (opcao == '2') {
      stdout.write("\nDigite o nome do pet: ");
      String? nomePet = stdin.readLineSync();
      if (nomePet != null && nomePet.isNotEmpty) {
        await buscarConsultas(filtro: nomePet, tipo: "pet_name");
      }
    } else if (opcao == '0') {
      print("\nSaindo do sistema. Até logo!");
      break;
    } else {
      print("\nOpção inválida! Tente novamente.\n");
    }
  }
}

Future<void> buscarConsultas({required String filtro, required String tipo}) async {
  print("\nBuscando dados no servidor...");

  String url =
      "https://raw.githubusercontent.com/alura-cursos/dart_assincronismo_api/aula05/.json/vet.json";

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

    if (response.statusCode == 200) {
      List<dynamic> consultas = jsonDecode(response.body);

      // Remove acentos e faz comparação sem diferenciação de maiúsculas/minúsculas
      List<Map<String, dynamic>> resultados = consultas
          .where((element) =>
              removeDiacritics((element[tipo] as String).toLowerCase()) ==
              removeDiacritics(filtro.toLowerCase()))
          .cast<Map<String, dynamic>>()
          .toList();

      print("\nResposta recebida com sucesso!\n");

      if (resultados.isNotEmpty) {
        final DateFormat formatoBR =
            DateFormat("EEEE, dd/MM/yyyy HH:mm", "pt_BR");

        print("Foram encontradas ${resultados.length} consultas para '$filtro':\n");

        for (var consulta in resultados) {
          DateTime dataConsulta = DateTime.parse(consulta["appointment"]);
          String dataFormatada = formatoBR.format(dataConsulta);

          print("Data: $dataFormatada");
          print("Veterinário: ${consulta["veterinarian"]}");
          print("Pet: ${consulta["pet_name"]}");
          print("-----------------------------");
        }
      } else {
        print("Nenhuma consulta encontrada para '$filtro'.");
      }
    } else {
      print("Erro na requisição. Código HTTP: ${response.statusCode}");
    }
  } catch (e) {
    print("Erro no método async/await: $e");
  }

  print("Fim da busca.\n");
}

Fiz algumas melhorias como: Ordenar em ordem crescente, Data no formato BR, e criei um menu interativo para poder filtrar por profissional e por pet e coloquei o removeDiacritics, pra evitar erro de digitação por conta das acentuações

1 resposta

Olá, Paulo, como vai?

Seu código está bem estruturado e cumpre o objetivo proposto de buscar e filtrar as consultas de forma dinâmica, tanto por nome do veterinário quanto por nome do pet. A utilização do pacote diacritic e do intl foi uma boa escolha, deixando o sistema mais robusto e legível.

Seu código está muito bom e demonstra domínio do uso de funções assíncronas e manipulação de dados em JSON. Continue compartilhando seus exercícios aqui no fórum, estamos à disposição para acompanhar sua evolução.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!