From fa5d5e151d40838b8b9d2da37709cd3c8910cabb Mon Sep 17 00:00:00 2001 From: s5260822 Date: Tue, 18 Mar 2025 16:40:42 +0100 Subject: [PATCH] improved Controller and Rest Front-end structure --- .../gruppe_05_1/database/MongoDBHandler.java | 8 + .../gruppe_05_1/database/MongoPprUtils.java | 15 ++ .../gruppe_05_1/rest/FrontEndController.java | 147 ++++++++++++++++++ .../project/gruppe_05_1/rest/RESTHandler.java | 136 ++++++++-------- .../gruppe_05_1/rest/RESTHandlerOld.java | 69 ++++++++ 5 files changed, 306 insertions(+), 69 deletions(-) create mode 100644 src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java create mode 100644 src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java index 4cce3c5..6ac6e28 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java @@ -764,6 +764,14 @@ public class MongoDBHandler { } } + public String getMemberPhoto(String memberId) { + Document photoDocument = memberPhotoCollection.find(eq("memberId", memberId)).first(); + if (photoDocument == null) { + return null; + } + return photoDocument.getString("base64"); + } + public void close() { mongoClient.close(); } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java index 89fe15c..22ce309 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java @@ -65,6 +65,11 @@ public class MongoPprUtils { return agendaItemsCollection; } + public static MongoCollection getPicturesCollection() { + if (picturesCollection == null) picturesCollection = MongoDBHandler.getMongoDatabase().getCollection(PICTURES_COLLECTION_NAME); + return picturesCollection; + } + /** * Create the Speaker Collection and useful indices for it */ @@ -400,4 +405,14 @@ public class MongoPprUtils { return new HtmlSpeech(speechDoc); } + + public static String getMemberPhoto(String memberId) { + Document filter = new Document("memberId", memberId); + Document pictureDoc = getPicturesCollection().find(filter).first(); + if (pictureDoc == null) { + return null; + } else { + return (String) pictureDoc.get("base64"); + } + } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java new file mode 100644 index 0000000..60a8771 --- /dev/null +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java @@ -0,0 +1,147 @@ +package org.texttechnologylab.project.gruppe_05_1.rest; + +import gnu.trove.impl.sync.TSynchronizedShortObjectMap; +import io.javalin.http.Context; +import io.javalin.openapi.*; +import org.apache.commons.collections.bag.SynchronizedSortedBag; +import org.texttechnologylab.project.gruppe_05_1.database.MongoPprUtils; +import org.texttechnologylab.project.gruppe_05_1.domain.html.HtmlSpeech; +import org.texttechnologylab.project.gruppe_05_1.domain.html.Parlamentarier; +import org.texttechnologylab.project.gruppe_05_1.domain.html.ParlamentarierDetails; +import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; +import org.texttechnologylab.project.gruppe_05_1.util.Logger; +import org.texttechnologylab.project.gruppe_05_1.util.PPRUtils; +import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FrontEndController { + @OpenApi( + summary = "Get alle Parlamentarier. Man kann nach Vor-, Nachname oder Partei filtern.", + description = "Listet alle Parlamentarier bzw. diejenige, welche den Filter entsprechen", + operationId = "getAllParlamentarier", + path = "/", + methods = HttpMethod.GET, + tags = {"Parlamentarier"}, + queryParams = { + @OpenApiParam(name = "filter", description = "Full-Text-Filter. Kann Vorname, Nachname oder Partei filtern", required = false), + }, + responses = { + @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Parlamentarier[].class)}) + }) + public static void getAllParlamentarier(Context ctx) { + String filter = ctx.queryParam("filter"); + Logger.info("Filter: '" + filter + "'"); + + List parlamentarier = MongoPprUtils.getAllParlamentarier(filter); + PPRUtils.sortParlamentarierByName(parlamentarier); + Logger.info(parlamentarier.size() + " MdBs gefunden"); + + Map attributes = new HashMap<>(); + attributes.put("parlamentarier", parlamentarier); + attributes.put("filter", filter); + ctx.render("parlamentarier.ftl", attributes); + } + + /** + * Zeigt die Details eines Parlamentariers an: + * - persönliche Daten (Geburtsdatum, -ort, Vita, Religion etc.). + * - Mitgliederschaften, falls vorhanden + * - Fotos, falls vorhanden + * @param ctx JavaLin-Context + */ + + @OpenApi( + summary = "Zeigt die Details eines Parlamentariers an", + description = "Zeigt persönliche Daten, Mitgliederschaften, Fotos", + operationId = "getParlamentarierDetails", + path = "/portfolio/{id}", + methods = HttpMethod.GET, + tags = {"Parlamentarier"}, + pathParams = { + @OpenApiParam(name = "id", description = "id des Parlamentariers", required = true), + }, + responses = { + @OpenApiResponse(status = "200", content = {@OpenApiContent(from = ParlamentarierDetails.class)}) + }) + public static void getParlamentarierDetails(Context ctx) { + String id = ctx.pathParam("id"); + Logger.info("getParlamentarierDetails, ID = " + id); + + ParlamentarierDetails pd = MongoPprUtils.getParlamentarierDetailsByID(id); + + Map attributes = new HashMap<>(); + attributes.put("p", pd); + Long speechCount = MongoPprUtils.countSpeechesOfSpeaker(pd.getId()); + attributes.put("speechesCount", speechCount); + attributes.put("pic", MongoPprUtils.getMemberPhoto(pd.getId())); + if (speechCount == 0) { + attributes.put("speechesPlaceholder", null); + } else { + attributes.put("speechesPlaceholder", new ArrayList<>()); + } + + ctx.render("parlamentarierDetails.ftl", attributes); + } + + /** + * Liste alle Reden eines Parlamentariers an + * @param ctx Javalin Context + */ + @OpenApi( + summary = "Liste alle Reden eines Parlamentariers an", + description = "Liste alle Reden eines Parlamentariers an", + operationId = "listSpeeches", + path = "/reden/{id}", + methods = HttpMethod.GET, + tags = {"Rede"}, + pathParams = { + @OpenApiParam(name = "id", description = "id des Parlamentariers", required = true), + }, + responses = { + @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Speech[].class)}) + }) + public static void listSpeeches(Context ctx) { + String parlamentarierId = ctx.pathParam("id"); + + ParlamentarierDetails p = MongoPprUtils.getParlamentarierDetailsByID(parlamentarierId); + List speechMetaDataList = MongoPprUtils.getSpeechesMetadataForSpeaker(parlamentarierId); + + Map attributes = new HashMap<>(); + attributes.put("p", p); + attributes.put("speechesMetaDataList", speechMetaDataList); + ctx.render("showSpeechesList.ftl", attributes); + } + + /** + * Zeige eine bestimmte Rede des Parlamentariers an + * @param ctx Javalin Context + */ + @OpenApi( + summary = "Zeige eine bestimmte Rede des Parlamentariers an", + description = "Zeige eine bestimmte Rede des Parlamentariers an", + operationId = "showSpeech", + path = "/reden/{id}/{redeID}", + methods = HttpMethod.GET, + tags = {"Rede"}, + pathParams = { + @OpenApiParam(name = "id", description = "id des Parlamentariers", required = true), + @OpenApiParam(name = "redeId", description = "id der Rede", required = true), + }, + responses = { + @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Speech.class)}) + }) + public static void showSpeech(Context ctx) { + String redeId = ctx.pathParam("redeId"); + + Map attributes = new HashMap<>(); + + HtmlSpeech speech = MongoPprUtils.getSpeechByKey(redeId); + attributes.put("s", speech); + + ctx.render("speech.ftl", attributes); + } +} diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java index e1de2a4..3235002 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java @@ -1,69 +1,67 @@ -package org.texttechnologylab.project.gruppe_05_1.rest; - -import freemarker.template.Configuration; -import freemarker.template.TemplateExceptionHandler; -import io.javalin.Javalin; -import io.javalin.http.staticfiles.Location; -import io.javalin.openapi.plugin.OpenApiPlugin; -import io.javalin.openapi.plugin.redoc.ReDocPlugin; -import io.javalin.rendering.template.JavalinFreemarker; -import org.texttechnologylab.project.gruppe_05_1.util.Logger; - -import java.io.File; -import java.io.IOException; - -import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_STATIC_FILES_DIR; -import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_TEMPLATE_DIR; - -public class RESTHandler { - - public void startJavalin() { - - // Javalin Konfiguration (z.B. port) - JavalinConfig jlConfig = new JavalinConfig(); - int port = jlConfig.getPort(); - - // FreeMarker Konfiguration - Configuration fmConfig = new Configuration(Configuration.VERSION_2_3_33); - fmConfig.setDefaultEncoding("UTF-8"); - try { - fmConfig.setDirectoryForTemplateLoading(new File(JAVALIN_TEMPLATE_DIR)); - } catch (IOException e) { - throw new RuntimeException(e); - } - fmConfig.setLogTemplateExceptions(true); - fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - // Erzeuge die Javalin app - Javalin app = Javalin.create(config -> { - config.staticFiles.add(JAVALIN_STATIC_FILES_DIR, Location.EXTERNAL); // momentan nicht benutzt - - config.fileRenderer(new JavalinFreemarker(fmConfig)); - - config.registerPlugin(new OpenApiPlugin(pluginConfig -> { - // Define OpenAPI spec configuration - pluginConfig.withDefinitionConfiguration((version, definition) -> { - definition.withOpenApiInfo(info -> info.setTitle("Javalin OpenAPI Documentation")); - }); - })); - - config.registerPlugin(new ReDocPlugin()); - - }) - .start(port); - Logger.info("Javalin app started on http://localhost:" + port); - - // Routes - // ====== - - // Parlamentarier - app.get("/", ParlamentarierController::getAllParlamentarier); - app.get("/portfolio/{id}", ParlamentarierController::getParlamentarierDetails); - app.delete("/deleteParlamentarier", ParlamentarierController::deleteAllParlamentarier); - - // Reden - app.get("/reden/{id}", SpeechController::listSpeeches); // zeige Reden eines Parlamentariers an - app.get("/reden/{id}/{redeId}", SpeechController::showSpeech); // zeige eine bestimmte Rede des Parlamentariers an - - } -} +package org.texttechnologylab.project.gruppe_05_1.rest; + +import freemarker.template.Configuration; +import freemarker.template.TemplateExceptionHandler; +import io.javalin.Javalin; +import io.javalin.http.staticfiles.Location; +import io.javalin.openapi.plugin.OpenApiPlugin; +import io.javalin.openapi.plugin.redoc.ReDocPlugin; +import io.javalin.rendering.template.JavalinFreemarker; +import org.texttechnologylab.project.gruppe_05_1.util.Logger; + +import java.io.File; +import java.io.IOException; + +import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_STATIC_FILES_DIR; +import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_TEMPLATE_DIR; + +public class RESTHandler { + public void startJavalin() { + + // Javalin Konfiguration (z.B. port) + JavalinConfig jlConfig = new JavalinConfig(); + int port = jlConfig.getPort(); + + // FreeMarker Konfiguration + Configuration fmConfig = new Configuration(Configuration.VERSION_2_3_33); + fmConfig.setDefaultEncoding("UTF-8"); + try { + fmConfig.setDirectoryForTemplateLoading(new File(JAVALIN_TEMPLATE_DIR)); + } catch (IOException e) { + throw new RuntimeException(e); + } + fmConfig.setLogTemplateExceptions(true); + fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + // Erzeuge die Javalin app + Javalin app = Javalin.create(config -> { + config.staticFiles.add(JAVALIN_STATIC_FILES_DIR, Location.EXTERNAL); // momentan nicht benutzt + + config.fileRenderer(new JavalinFreemarker(fmConfig)); + + config.registerPlugin(new OpenApiPlugin(pluginConfig -> { + // Define OpenAPI spec configuration + pluginConfig.withDefinitionConfiguration((version, definition) -> { + definition.withOpenApiInfo(info -> info.setTitle("Javalin OpenAPI Documentation")); + }); + })); + + config.registerPlugin(new ReDocPlugin()); + + }) + .start(port); + Logger.info("Javalin app started on http://localhost:" + port); + + // Routes + // ====== + + // Parlamentarier + app.get("/", FrontEndController::getAllParlamentarier); + app.get("/portfolio/{id}", FrontEndController::getParlamentarierDetails); + app.delete("/deleteParlamentarier", ParlamentarierController::deleteAllParlamentarier); + + // Reden + app.get("/reden/{id}", FrontEndController::listSpeeches); // zeige Reden eines Parlamentariers an + app.get("/reden/{id}/{redeId}", FrontEndController::showSpeech); // zeige eine bestimmte Rede des Parlamentariers an + } +} diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java new file mode 100644 index 0000000..84be658 --- /dev/null +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java @@ -0,0 +1,69 @@ +package org.texttechnologylab.project.gruppe_05_1.rest; + +import freemarker.template.Configuration; +import freemarker.template.TemplateExceptionHandler; +import io.javalin.Javalin; +import io.javalin.http.staticfiles.Location; +import io.javalin.openapi.plugin.OpenApiPlugin; +import io.javalin.openapi.plugin.redoc.ReDocPlugin; +import io.javalin.rendering.template.JavalinFreemarker; +import org.texttechnologylab.project.gruppe_05_1.util.Logger; + +import java.io.File; +import java.io.IOException; + +import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_STATIC_FILES_DIR; +import static org.texttechnologylab.project.gruppe_05_1.Main.JAVALIN_TEMPLATE_DIR; + +public class RESTHandlerOld { + + public void startJavalin() { + + // Javalin Konfiguration (z.B. port) + JavalinConfig jlConfig = new JavalinConfig(); + int port = jlConfig.getPort(); + + // FreeMarker Konfiguration + Configuration fmConfig = new Configuration(Configuration.VERSION_2_3_33); + fmConfig.setDefaultEncoding("UTF-8"); + try { + fmConfig.setDirectoryForTemplateLoading(new File(JAVALIN_TEMPLATE_DIR)); + } catch (IOException e) { + throw new RuntimeException(e); + } + fmConfig.setLogTemplateExceptions(true); + fmConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + + // Erzeuge die Javalin app + Javalin app = Javalin.create(config -> { + config.staticFiles.add(JAVALIN_STATIC_FILES_DIR, Location.EXTERNAL); // momentan nicht benutzt + + config.fileRenderer(new JavalinFreemarker(fmConfig)); + + config.registerPlugin(new OpenApiPlugin(pluginConfig -> { + // Define OpenAPI spec configuration + pluginConfig.withDefinitionConfiguration((version, definition) -> { + definition.withOpenApiInfo(info -> info.setTitle("Javalin OpenAPI Documentation")); + }); + })); + + config.registerPlugin(new ReDocPlugin()); + + }) + .start(port); + Logger.info("Javalin app started on http://localhost:" + port); + + // Routes + // ====== + + // Parlamentarier + app.get("/", ParlamentarierController::getAllParlamentarier); + app.get("/portfolio/{id}", ParlamentarierController::getParlamentarierDetails); + app.delete("/deleteParlamentarier", ParlamentarierController::deleteAllParlamentarier); + + // Reden + app.get("/reden/{id}", SpeechController::listSpeeches); // zeige Reden eines Parlamentariers an + app.get("/reden/{id}/{redeId}", SpeechController::showSpeech); // zeige eine bestimmte Rede des Parlamentariers an + + } +}