]> git.frustrated-labs.net Git - larousseapi/commitdiff
refactor: separate network logic into repository
authorAlexander Goussas <[email protected]>
Fri, 22 May 2026 23:42:12 +0000 (18:42 -0500)
committerAlexander Goussas <[email protected]>
Fri, 22 May 2026 23:42:12 +0000 (18:42 -0500)
src/main/java/net/frustratedfunctor/GreetingResource.java [deleted file]
src/main/java/net/frustratedfunctor/WordDefinition.java [deleted file]
src/main/java/net/frustratedfunctor/WordTranslationResource.java [deleted file]
src/main/java/net/frustratedfunctor/WordTranslationService.java [deleted file]
src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/WordTranslation.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/WordTranslationService.java [new file with mode: 0644]

diff --git a/src/main/java/net/frustratedfunctor/GreetingResource.java b/src/main/java/net/frustratedfunctor/GreetingResource.java
deleted file mode 100644 (file)
index ab13b68..0000000
+++ /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 (file)
index ed5d79b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package net.frustratedfunctor;
-
-import java.util.List;
-
-public record WordDefinition(
-        String word,
-        List<String> definitions
-) {
-}
diff --git a/src/main/java/net/frustratedfunctor/WordTranslationResource.java b/src/main/java/net/frustratedfunctor/WordTranslationResource.java
deleted file mode 100644 (file)
index 5145dfe..0000000
+++ /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 (file)
index 7ea96a2..0000000
+++ /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<String>();
-
-        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 (file)
index 0000000..553b645
--- /dev/null
@@ -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<String> 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<String>();
+
+            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 (file)
index 0000000..85778fc
--- /dev/null
@@ -0,0 +1,9 @@
+package net.frustratedfunctor.translations;
+
+import java.util.List;
+
+public record WordTranslation(
+        String word,
+        List<String> 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 (file)
index 0000000..dc73314
--- /dev/null
@@ -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<String> 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 (file)
index 0000000..3d35730
--- /dev/null
@@ -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 (file)
index 0000000..b98c68d
--- /dev/null
@@ -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
+        );
+    }
+
+}