From: Alexander Goussas Date: Fri, 22 May 2026 23:42:12 +0000 (-0500) Subject: refactor: separate network logic into repository X-Git-Url: http://git.frustrated-labs.net/?a=commitdiff_plain;h=9e41bb275e959f4e1fe78fb3af962b5d36eef7e2;p=larousseapi refactor: separate network logic into repository --- diff --git a/src/main/java/net/frustratedfunctor/GreetingResource.java b/src/main/java/net/frustratedfunctor/GreetingResource.java deleted file mode 100644 index ab13b68..0000000 --- a/src/main/java/net/frustratedfunctor/GreetingResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.frustratedfunctor; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/hello") -public class GreetingResource { - - @GET - @Produces(MediaType.TEXT_PLAIN) - public String hello() { - return "Hello from Quarkus REST"; - } -} diff --git a/src/main/java/net/frustratedfunctor/WordDefinition.java b/src/main/java/net/frustratedfunctor/WordDefinition.java deleted file mode 100644 index ed5d79b..0000000 --- a/src/main/java/net/frustratedfunctor/WordDefinition.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.frustratedfunctor; - -import java.util.List; - -public record WordDefinition( - String word, - List definitions -) { -} diff --git a/src/main/java/net/frustratedfunctor/WordTranslationResource.java b/src/main/java/net/frustratedfunctor/WordTranslationResource.java deleted file mode 100644 index 5145dfe..0000000 --- a/src/main/java/net/frustratedfunctor/WordTranslationResource.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.frustratedfunctor; - - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; -import org.jboss.resteasy.reactive.RestQuery; - -@Path("/translate") -public class WordTranslationResource { - - private final WordTranslationService words; - - public WordTranslationResource(WordTranslationService words) { - this.words = words; - } - - @GET - @Produces(MediaType.APPLICATION_JSON) - public WordDefinition translate(@RestQuery("q") String word) throws Exception { - final var definition = words.translate(word); - return definition; - } - -} diff --git a/src/main/java/net/frustratedfunctor/WordTranslationService.java b/src/main/java/net/frustratedfunctor/WordTranslationService.java deleted file mode 100644 index 7ea96a2..0000000 --- a/src/main/java/net/frustratedfunctor/WordTranslationService.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.frustratedfunctor; - -import jakarta.enterprise.context.ApplicationScoped; -import org.jsoup.Jsoup; - -import java.net.URI; -import java.util.ArrayList; - -@ApplicationScoped -public class WordTranslationService { - - public WordDefinition translate(String word) throws Exception { - if (word == null || word.isEmpty()) { - throw new InvalidWordException("The word cannot be empty"); - } - - final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL(); - final var doc = Jsoup.parse(larousseUrl, 10_000); - - final var defs = doc.select("li.itemZONESEM"); - final var wordDefs = new ArrayList(); - - for (final var def : defs) { - final var translation = def.selectFirst("span.Traduction"); - if (translation != null) { - wordDefs.add(translation.text()); - } - } - - return new WordDefinition( - word, - wordDefs - ); - } - -} diff --git a/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java new file mode 100644 index 0000000..553b645 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java @@ -0,0 +1,36 @@ +package net.frustratedfunctor.translations; + +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class JsoupWordTranslationRepository implements WordTranslationRepository { + + @Override + public List translationsForWord(String word) { + try { + final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL(); + final var doc = Jsoup.parse(larousseUrl, 10_000); + + final var defs = doc.select("li.itemZONESEM"); + final var wordDefs = new ArrayList(); + + for (final var def : defs) { + final var translation = def.selectFirst("span.Traduction"); + if (translation != null) { + wordDefs.add(translation.text()); + } + } + + return wordDefs; + } catch (Exception e) { + Log.error("", e); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslation.java b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java new file mode 100644 index 0000000..85778fc --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java @@ -0,0 +1,9 @@ +package net.frustratedfunctor.translations; + +import java.util.List; + +public record WordTranslation( + String word, + List definitions +) { +} diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java new file mode 100644 index 0000000..dc73314 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java @@ -0,0 +1,15 @@ +package net.frustratedfunctor.translations; + +import java.util.List; + +public interface WordTranslationRepository { + + /** + * Get the list of translations for the given word. + * + * @param word The word to translate. + * @return A list of all available translations for the given word. + */ + List translationsForWord(String word); + +} diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java new file mode 100644 index 0000000..3d35730 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java @@ -0,0 +1,25 @@ +package net.frustratedfunctor.translations; + + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import org.jboss.resteasy.reactive.RestQuery; + +@Path("/translate") +public class WordTranslationResource { + + private final WordTranslationService words; + + public WordTranslationResource(WordTranslationService words) { + this.words = words; + } + + @GET + @Produces(MediaType.APPLICATION_JSON) + public WordTranslation translate(@RestQuery("q") String word) { + return words.translate(word); + } + +} diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java new file mode 100644 index 0000000..b98c68d --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java @@ -0,0 +1,28 @@ +package net.frustratedfunctor.translations; + +import jakarta.enterprise.context.ApplicationScoped; +import net.frustratedfunctor.InvalidWordException; + +@ApplicationScoped +public class WordTranslationService { + + private final WordTranslationRepository repository; + + public WordTranslationService(WordTranslationRepository repository) { + this.repository = repository; + } + + public WordTranslation translate(String word) { + if (word == null || word.isEmpty()) { + throw new InvalidWordException("The word cannot be empty"); + } + + final var wordDefs = repository.translationsForWord(word); + + return new WordTranslation( + word, + wordDefs + ); + } + +}