From 37463afef417bc3edc050eca7361292d7b980ab7 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Thu, 21 May 2026 19:01:01 -0500 Subject: [PATCH] feat: implement first version of translation service --- .../WordDefinitionService.java | 15 -------- ...urce.java => WordTranslationResource.java} | 12 +++---- .../WordTranslationService.java | 36 +++++++++++++++++++ 3 files changed, 42 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/net/frustratedfunctor/WordDefinitionService.java rename src/main/java/net/frustratedfunctor/{WordDefinitionResource.java => WordTranslationResource.java} (51%) create mode 100644 src/main/java/net/frustratedfunctor/WordTranslationService.java diff --git a/src/main/java/net/frustratedfunctor/WordDefinitionService.java b/src/main/java/net/frustratedfunctor/WordDefinitionService.java deleted file mode 100644 index 53474c1..0000000 --- a/src/main/java/net/frustratedfunctor/WordDefinitionService.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.frustratedfunctor; - -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class WordDefinitionService { - - public WordDefinition search(String word) { - if (word == null || word.isEmpty()) { - throw new InvalidWordException("The word cannot be empty"); - } - return null; - } - -} diff --git a/src/main/java/net/frustratedfunctor/WordDefinitionResource.java b/src/main/java/net/frustratedfunctor/WordTranslationResource.java similarity index 51% rename from src/main/java/net/frustratedfunctor/WordDefinitionResource.java rename to src/main/java/net/frustratedfunctor/WordTranslationResource.java index 82b3fb0..5145dfe 100644 --- a/src/main/java/net/frustratedfunctor/WordDefinitionResource.java +++ b/src/main/java/net/frustratedfunctor/WordTranslationResource.java @@ -7,19 +7,19 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.jboss.resteasy.reactive.RestQuery; -@Path("/search") -public class WordDefinitionResource { +@Path("/translate") +public class WordTranslationResource { - private final WordDefinitionService words; + private final WordTranslationService words; - public WordDefinitionResource(WordDefinitionService words) { + public WordTranslationResource(WordTranslationService words) { this.words = words; } @GET @Produces(MediaType.APPLICATION_JSON) - public WordDefinition search(@RestQuery String word) { - final var definition = words.search(word); + 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 new file mode 100644 index 0000000..7ea96a2 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/WordTranslationService.java @@ -0,0 +1,36 @@ +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 + ); + } + +} -- 2.43.0