From daf3234b59355d6b7e4efc221fe85c6d781999cd Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sun, 31 May 2026 11:51:59 -0500 Subject: [PATCH] feat: add web ui --- build.gradle | 2 + .../frustratedfunctor/ExceptionMappers.java | 2 +- .../JsoupWordDefinitionRepository.java | 2 +- .../definitions/WordDefinitionRepository.java | 6 +- .../translations/WordTranslation.java | 2 +- .../translations/WordTranslationService.java | 2 +- .../net/frustratedfunctor/ui/UiResource.java | 39 ++++++++ .../ui/WordTranslationsDefinitions.java | 9 ++ .../resources/META-INF/resources/logo.png | Bin 0 -> 45775 bytes .../resources/META-INF/resources/styles.css | 41 +++++++++ src/main/resources/application.properties | 2 + src/main/resources/templates/pub/index.html | 87 ++++++++++++++++++ 12 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/frustratedfunctor/ui/UiResource.java create mode 100644 src/main/java/net/frustratedfunctor/ui/WordTranslationsDefinitions.java create mode 100644 src/main/resources/META-INF/resources/logo.png create mode 100644 src/main/resources/META-INF/resources/styles.css create mode 100644 src/main/resources/templates/pub/index.html diff --git a/build.gradle b/build.gradle index b5a4601..e4461d8 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,8 @@ repositories { } dependencies { + implementation 'io.quarkiverse.qute.web:quarkus-qute-web' + implementation 'io.quarkus:quarkus-rest-qute' implementation 'io.quarkus:quarkus-micrometer-opentelemetry' implementation 'io.quarkus:quarkus-opentelemetry' implementation 'io.quarkus:quarkus-kubernetes' diff --git a/src/main/java/net/frustratedfunctor/ExceptionMappers.java b/src/main/java/net/frustratedfunctor/ExceptionMappers.java index 1e2290e..f473355 100644 --- a/src/main/java/net/frustratedfunctor/ExceptionMappers.java +++ b/src/main/java/net/frustratedfunctor/ExceptionMappers.java @@ -7,7 +7,7 @@ import org.jboss.resteasy.reactive.server.ServerExceptionMapper; final public class ExceptionMappers { @ServerExceptionMapper public RestResponse mapException(InvalidWordException ex) { - Log.info("Got bad word"); + Log.infof("Got bad word: %s", ex.getMessage()); return RestResponse.status(400); } } diff --git a/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java index b1bb296..96e7d78 100644 --- a/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java +++ b/src/main/java/net/frustratedfunctor/definitions/JsoupWordDefinitionRepository.java @@ -22,7 +22,7 @@ public class JsoupWordDefinitionRepository implements WordDefinitionRepository { .map(Element::ownText) .toList(); } catch (Exception e) { - Log.error("Error while fetching word definitions", e); + Log.error("Error while fetching word translations", e); return new ArrayList<>(); } } diff --git a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java index de8dd35..f5e2d90 100644 --- a/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java +++ b/src/main/java/net/frustratedfunctor/definitions/WordDefinitionRepository.java @@ -5,10 +5,10 @@ import java.util.List; public interface WordDefinitionRepository { /** - * Get a list of definitions for the given word. + * Get a list of translations for the given word. * - * @param word The word to get definitions for. - * @return A list of found definitions for the word. + * @param word The word to get translations for. + * @return A list of found translations for the word. */ List definitionsForWord(String word); diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslation.java b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java index 85778fc..2ea5957 100644 --- a/src/main/java/net/frustratedfunctor/translations/WordTranslation.java +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java @@ -4,6 +4,6 @@ import java.util.List; public record WordTranslation( String word, - List definitions + List translations ) { } diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java index b98c68d..6f547f9 100644 --- a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java @@ -14,7 +14,7 @@ public class WordTranslationService { public WordTranslation translate(String word) { if (word == null || word.isEmpty()) { - throw new InvalidWordException("The word cannot be empty"); + throw new InvalidWordException("The word cannot be empty:" + word); } final var wordDefs = repository.translationsForWord(word); diff --git a/src/main/java/net/frustratedfunctor/ui/UiResource.java b/src/main/java/net/frustratedfunctor/ui/UiResource.java new file mode 100644 index 0000000..0fe5dc2 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/ui/UiResource.java @@ -0,0 +1,39 @@ +package net.frustratedfunctor.ui; + +import io.quarkus.qute.Location; +import io.quarkus.qute.Template; +import io.quarkus.qute.TemplateInstance; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import net.frustratedfunctor.definitions.WordDefinitionService; +import net.frustratedfunctor.translations.WordTranslationService; + +@Path("/ui") +public class UiResource { + + private final WordDefinitionService definitions; + private final WordTranslationService translations; + + @Location("pub/index.html") + Template index; + + public UiResource(WordDefinitionService definitions, WordTranslationService translations) { + this.definitions = definitions; + this.translations = translations; + } + + @Path("getTranslationsDefinitions") + @POST + @Produces(MediaType.TEXT_HTML) + public TemplateInstance getTranslationsDefinitions(@FormParam("word") String word) { + final var data = new WordTranslationsDefinitions( + translations.translate(word).translations(), + definitions.define(word).definitions() + ); + return index.data("translationsDefinitions", data); + } + +} diff --git a/src/main/java/net/frustratedfunctor/ui/WordTranslationsDefinitions.java b/src/main/java/net/frustratedfunctor/ui/WordTranslationsDefinitions.java new file mode 100644 index 0000000..281a626 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/ui/WordTranslationsDefinitions.java @@ -0,0 +1,9 @@ +package net.frustratedfunctor.ui; + +import java.util.List; + +public record WordTranslationsDefinitions( + List translations, + List definitions +) { +} diff --git a/src/main/resources/META-INF/resources/logo.png b/src/main/resources/META-INF/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..764882d27096f0bdeaf90a17139d24c15b3dd05f GIT binary patch literal 45775 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 VxBhPLkK0OUp3pg-eat-I{{ifWJfZ*q literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/resources/styles.css b/src/main/resources/META-INF/resources/styles.css new file mode 100644 index 0000000..756ece5 --- /dev/null +++ b/src/main/resources/META-INF/resources/styles.css @@ -0,0 +1,41 @@ +main { + max-width: 60%; + margin: auto; + margin-top: 48px; + min-height: 90vh; + + h1 { + text-align: center; + } +} + +fieldset { + width: 100%; + + input, button { + width: 100%; + margin-bottom: 2px; + } +} + +form { + margin-bottom: 10px; +} + +.card { + padding: 0.4rem !important; +} + +footer { + padding: 1rem; + background-color: black; + min-height: 10vh; + color: white; + text-align: center; +} + +@media only screen and (max-width: 600px) { + main { + max-width: 90%; + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a2c0b74..11c18a6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,3 +9,5 @@ quarkus.otel.exporter.otlp.endpoint=http://localhost:4317 quarkus.application.name=larousse-api quarkus.otel.simple=true %prod.quarkus.otel.simple=false +quarkus.qute.property-not-found-strategy=default +quarkus.qute.strict-rendering=false \ No newline at end of file diff --git a/src/main/resources/templates/pub/index.html b/src/main/resources/templates/pub/index.html new file mode 100644 index 0000000..e3a5cba --- /dev/null +++ b/src/main/resources/templates/pub/index.html @@ -0,0 +1,87 @@ +{@net.frustratedfunctor.ui.WordTranslationsDefinitions translationsDefinitions} + + + + +Frustrated Langs + + + + + + + + + + +
+ +
+ +
+

Frustrated Langs

+ +
+ + + Search for a word in the box below. + +
+
+ + +
+
+ {#if translationsDefinitions && !translationsDefinitions.translations.empty} +
+

Translations

+ {#each translationsDefinitions.translations} + {it} + {/each} +
+ {/if} + {#if translationsDefinitions && !translationsDefinitions.definitions.empty} +
+

Definitions

+ {#each translationsDefinitions.definitions} + {it} + {/each} +
+ {/if} +
+
+ + + + + \ No newline at end of file -- 2.43.0