0
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