2
respostas

[Projeto] API de busca por receita com TheMealDB

Fiz o desafio número 3, mas de uma forma que acho ser mais profissional, como se estivesse fazendo isso para uma empresa, me colocando como um desenvolvedor júnior. Aí decidi usar coisas que ainda não sei totalmente, como o uso do Jackson, que é uma biblioteca para manipular arquivos JSON. Também usei engenharia de prompt e pedi ao ChatGPT para elaborar um desafio para mim sobre o que foi pedido no desafio 3:

"Crie um programa Java que faça uma consulta à API do TheMealDB utilizando as classes HttpClient, HttpRequest e HttpResponse. Solicite ao usuário que insira o nome de uma receita e exiba as informações disponíveis sobre essa receita."

O resultado eu postei no meu GitHub. Provavelmente o código todo não cabe aqui.

Class Main
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Package Util

Class MealParser
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Package Service

Interface SearchStragety
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Class MealService
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Enum URL
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Package Infra

Record HttpClientProvider
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Package Infra.http.response

Class MealResponse
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Package Factory

Class SearchFactory

package com.github.rickmvi.com.mealdb.app.factory;

import com.github.rickmvi.com.mealdb.app.service.SearchStrategy;
import com.github.rickmvi.com.mealdb.app.util.Verify;

import java.util.Map;

public class SearchFactory {
    private static final Map<Class<?>, SearchStrategy> strategies =
            Map.of(
                    String.class, (searchTerm, baseUrl) -> baseUrl + searchTerm,
                    Number.class, (searchTerm, baseUrl) -> baseUrl + searchTerm,
                    Character.class, (searchTerm, baseUrl) -> baseUrl + searchTerm
            );

    public static String create(Object searchTerm, String baseUrl) {
        Verify.notNull(searchTerm, "Search term cannot be null");

        SearchStrategy strategy = strategies.get(searchTerm.getClass());

        Verify.notNull(strategy, "No strategy found for search term type: " + searchTerm.getClass());

        return strategy.build(searchTerm, baseUrl);
    }
}

Final Class Verify

package com.github.rickmvi.com.mealdb.app.util;

import org.jetbrains.annotations.Contract;

@lombok.experimental.UtilityClass
public class Verify {

    @Contract(value = "null, _ -> fail", pure = true)
    public static void notNull(Object object, String message) {
        if (object == null) throw new IllegalArgumentException(message);
    }

    @Contract("null, _ -> fail")
    public static void notEmpty(String string, String message) {
        if (string == null || string.isEmpty()) throw new IllegalArgumentException(message);
    }

    @Contract(value = "true, _ -> fail", pure = true)
    public static void ifTrue(boolean condition, String message) {
        if (condition) throw new IllegalArgumentException(message);
    }

    @Contract(value = "false, _ -> fail", pure = true)
    public static void ifFalse(boolean condition, String message) {
        if (!condition) throw new IllegalArgumentException(message);
    }

    @Contract(value = "!null, _ -> fail", pure = true)
    public static void isNull(Object object, String message) {
        if (object != null) throw new IllegalArgumentException(message);
    }
}

Package Domain

Class Meal
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

pom.xml

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Olá, Rick! Tudo bem?

Vendo tanto pelos prints que você enviou quanto pelo projeto no repositório, é fácil notar o empenho que você teve ao fazer esse projeto, está bem organizado e utilizando de todo o conhecimento visto até aqui.

Além disso, você é guerreiro por aguentar usar um tema light kkk. Brincadeiras a parte, espero que continue com esse empenho em projetos futuros.

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

Kkkk, peguei essa mania do meu amigo Renato: durante o dia ele usa tema claro e à noite, tema escuro. Mas, fora isso, obrigado! Devo dizer que foi bem difícil fazer isso por ser minha primeira vez e, para dificultar ainda mais, acabei esquecendo de usar um bom aliado nessa hora, que é o Postman. Porque eu não sabia que, na hora da conversão, os dados precisavam estar exatamente iguais aos do JSON recebido. Ou seja, durante o parse eu precisava estruturar a classe Meal exatamente como estava no JSON, com os mesmos nomes. A única coisa que li foi o tópico Introdução ao Jackson, que ajudou um pouco, mas mesmo assim enfrentei muitos erros até descobrir o que realmente era.