From: Alexander Goussas Date: Sun, 31 May 2026 15:26:10 +0000 (-0500) Subject: feat: add endpoint to define a word X-Git-Url: http://git.frustrated-labs.net/?a=commitdiff_plain;h=af182d2995fc846fe8d694a20b62a5330bedb239;p=larousseapi feat: add endpoint to define a word --- diff --git a/collections/larousse API/Define a word.yml b/collections/larousse API/Define a word.yml new file mode 100644 index 0000000..bf0eea8 --- /dev/null +++ b/collections/larousse API/Define a word.yml @@ -0,0 +1,19 @@ +info: + name: Define a word + type: http + seq: 2 + +http: + method: GET + url: "{{api.base_url}}/words/:word/definition" + params: + - name: word + value: chien + type: path + auth: inherit + +settings: + encodeUrl: true + timeout: 0 + followRedirects: true + maxRedirects: 5 diff --git a/collections/larousse API/Translate a word.yml b/collections/larousse API/Translate a word.yml index 18b0b7a..dc7cbf1 100644 --- a/collections/larousse API/Translate a word.yml +++ b/collections/larousse API/Translate a word.yml @@ -5,10 +5,10 @@ info: http: method: GET - url: http://localhost:8080/words/:word/translation + url: "{{api.base_url}}/words/:word/translation" params: - name: word - value: voiture + value: grenouille type: path auth: inherit diff --git a/collections/larousse API/opencollection.yml b/collections/larousse API/opencollection.yml index 5cfa09e..edae829 100644 --- a/collections/larousse API/opencollection.yml +++ b/collections/larousse API/opencollection.yml @@ -2,6 +2,25 @@ opencollection: 1.0.0 info: name: larousse API +config: + proxy: + inherit: true + config: + protocol: http + hostname: "" + port: "" + auth: + username: "" + password: "" + bypassProxy: "" + +request: + variables: + - name: api.base_url + value: https://lang.frustrated-labs.net + disabled: true + - name: api.base_url + value: http://localhost:8080 bundled: false extensions: bruno: diff --git a/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java new file mode 100644 index 0000000..b1bb296 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java @@ -0,0 +1,29 @@ +package net.frustratedfunctor.definitions; + +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class JsoupWordDefinitionRepository implements WordDefinitionRepository { + @Override + public List definitionsForWord(String word) { + try { + final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais/" + word).toURL(); + final var doc = Jsoup.parse(larousseUrl, 10_000); + return doc + .select("li.DivisionDefinition") + .stream() + .map(Element::ownText) + .toList(); + } catch (Exception e) { + Log.error("Error while fetching word definitions", e); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/net/frustratedfunctor/definitions/WordDefinition.java b/src/main/java/net/frustratedfunctor/definitions/WordDefinition.java index 178f95d..f59ad8b 100644 --- a/src/main/java/net/frustratedfunctor/definitions/WordDefinition.java +++ b/src/main/java/net/frustratedfunctor/definitions/WordDefinition.java @@ -1,5 +1,10 @@ package net.frustratedfunctor.definitions; -public record WordDefinition() { +import java.util.List; + +public record WordDefinition( + String word, + List definitions +) { } diff --git a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java index 226b517..de8dd35 100644 --- a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java +++ b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java @@ -1,4 +1,15 @@ package net.frustratedfunctor.definitions; +import java.util.List; + public interface WordDefinitionRepository { + + /** + * Get a list of definitions for the given word. + * + * @param word The word to get definitions for. + * @return A list of found definitions for the word. + */ + List definitionsForWord(String word); + } diff --git a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionResource.java b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionResource.java index 2c2410f..6f3b78d 100644 --- a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionResource.java +++ b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionResource.java @@ -9,11 +9,17 @@ import jakarta.ws.rs.core.MediaType; @Path("/words") public class WordDefinitionResource { + private final WordDefinitionService definitions; + + public WordDefinitionResource(WordDefinitionService definitions) { + this.definitions = definitions; + } + @Path("/{word}/definition") @GET @Produces(MediaType.APPLICATION_JSON) public WordDefinition definition(@PathParam("word") String word) { - return null; + return definitions.define(word); } } diff --git a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionService.java b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionService.java index 32bd003..44696e2 100644 --- a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionService.java +++ b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionService.java @@ -4,4 +4,18 @@ import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class WordDefinitionService { + + private final WordDefinitionRepository definitions; + + public WordDefinitionService(WordDefinitionRepository definitions) { + this.definitions = definitions; + } + + public WordDefinition define(String word) { + return new WordDefinition( + word, + definitions.definitionsForWord(word) + ); + } + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5860cd8..a2c0b74 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,6 +5,7 @@ quarkus.docker.buildx.platform=linux/amd64 quarkus.kubernetes.namespace=default quarkus.kubernetes.service-type=node-port quarkus.otel.exporter.otlp.endpoint=http://localhost:4317 +%prod.quarkus.otel.exporter.otlp.endpoint=http://otel-collector.default.svc.cluster.local:4317 quarkus.application.name=larousse-api quarkus.otel.simple=true %prod.quarkus.otel.simple=false