From f579aae79176e12e4a4c4279601ef25c62d18c44 Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Fri, 31 Oct 2025 22:13:03 +0100 Subject: [PATCH] movie importer and show planner --- pom.xml | 14 ++- .../backend/endpoint/MovieImporter.java | 91 +++++++++++++++++++ .../backend/endpoint/OmdbApi.java | 27 ++++++ .../backend/task/ShowPlanner.java | 61 +++++++++++++ .../{ => util}/BetterRequestReply.java | 2 +- src/main/resources/application.properties | 10 ++ 6 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/infinimotion/backend/endpoint/MovieImporter.java create mode 100644 src/main/java/de/infinimotion/backend/endpoint/OmdbApi.java create mode 100644 src/main/java/de/infinimotion/backend/task/ShowPlanner.java rename src/main/java/de/infinimotion/backend/{ => util}/BetterRequestReply.java (98%) diff --git a/pom.xml b/pom.xml index 7a4f5cc..61ac5af 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ de.infinimotion model-backend - 0.0.67 + 0.0.76 @@ -59,6 +59,18 @@ io.quarkus quarkus-smallrye-openapi + + io.quarkus + quarkus-rest-client + + + io.quarkus + quarkus-rest-client-jackson + + + io.quarkus + quarkus-scheduler + diff --git a/src/main/java/de/infinimotion/backend/endpoint/MovieImporter.java b/src/main/java/de/infinimotion/backend/endpoint/MovieImporter.java new file mode 100644 index 0000000..d21baff --- /dev/null +++ b/src/main/java/de/infinimotion/backend/endpoint/MovieImporter.java @@ -0,0 +1,91 @@ +package de.infinimotion.backend.endpoint; + +import de.infinimotion.model.backend.*; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.Arrays; +import java.util.List; + +@ApplicationScoped +@Path("/importer") +public class MovieImporter { + + /* + Schnittstelle Abfrage für Vorstellung: Liste mit allen Sitzplätzen mit gebucht/reserviert/frei + */ + + @Inject + RequestReply requester; + + @RestClient + OmdbApi omdbApi; + + @POST + @Path("/import") + public Film importMovie(@QueryParam("id") String id) throws Exception { + OmdbMovie omdbMovie = omdbApi.getById(id); + Film film = new Film(); + film.setTitle(omdbMovie.getTitle()); + film.setImage(omdbMovie.getPoster()); + + CommandWrapper requestCategories = new CommandListFilmkategorie().serialize().generateIds(); + CommandWrapper responseCategories = requester.request(requestCategories); + List categories = CommandListFilmkategorieResponse.deserialize(responseCategories).getList(); + String[] splitGenres = omdbMovie.getGenre().split(","); + List genres = Arrays.stream(splitGenres).map(String::toLowerCase).toList(); + Filmkategorie category = categories.stream().filter(c -> genres.contains(c.getName().toLowerCase())).findFirst().orElse(null); + + if (category == null) { + CommandCreateFilmkategorie requestNewCategory = new CommandCreateFilmkategorie(); + Filmkategorie newCategory = new Filmkategorie(); + newCategory.setName(splitGenres[0]); + requestNewCategory.setFilmkategorie(newCategory); + + CommandWrapper responseNewCategory = requester.request(requestNewCategory.serialize().tx(requestCategories)); + category = CommandCreateFilmkategorie.deserialize(responseNewCategory).getFilmkategorie(); + } + + film.setCategory(category); + film.setDuration(Integer.parseInt(omdbMovie.getRuntime().split(" ")[0])); + film.setDescription(omdbMovie.getPlot()); + short rating = switch (omdbMovie.getRated()) { + case "G" -> 0; + case "PG" -> 6; + case "PG-13", "TV-14" -> 12; + case "R" -> 16; + case "NC-17" -> 18; + default -> 0; + }; + film.setRating(rating); + + CommandCreateFilm requestNewFilm = new CommandCreateFilm(); + requestNewFilm.setFilm(film); + CommandWrapper responseNewFilm = requester.request(requestNewFilm.serialize().tx(requestCategories).commit()); + return CommandCreateFilm.deserialize(responseNewFilm).getFilm(); + } + + @GET + @Path("/search") + public OmdbSearch search(@QueryParam("title") String title) { + return omdbApi.searchByTitle(title); + } + + @GET + @Path("/id") + public OmdbMovie getById(@QueryParam("id") String id) { + return omdbApi.getById(id); + } + + @GET + @Path("/title") + public OmdbMovie getByTitle(@QueryParam("title") String title) { + return omdbApi.getByTitle(title); + } + +} diff --git a/src/main/java/de/infinimotion/backend/endpoint/OmdbApi.java b/src/main/java/de/infinimotion/backend/endpoint/OmdbApi.java new file mode 100644 index 0000000..4399e93 --- /dev/null +++ b/src/main/java/de/infinimotion/backend/endpoint/OmdbApi.java @@ -0,0 +1,27 @@ +package de.infinimotion.backend.endpoint; + +import de.infinimotion.model.backend.OmdbMovie; +import de.infinimotion.model.backend.OmdbSearch; +import io.quarkus.rest.client.reactive.ClientQueryParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +@Path("/") +@RegisterRestClient(configKey = "omdb-api") +@ClientQueryParam(name = "apikey", value = "${omdb.api-key}") +public interface OmdbApi { + + @GET + OmdbSearch searchByTitle(@QueryParam("s") String title); + + @GET + @ClientQueryParam(name = "plot", value = "full") + OmdbMovie getById(@QueryParam("i") String id); + + @GET + @ClientQueryParam(name = "plot", value = "full") + OmdbMovie getByTitle(@QueryParam("t") String title); + +} diff --git a/src/main/java/de/infinimotion/backend/task/ShowPlanner.java b/src/main/java/de/infinimotion/backend/task/ShowPlanner.java new file mode 100644 index 0000000..15d63b4 --- /dev/null +++ b/src/main/java/de/infinimotion/backend/task/ShowPlanner.java @@ -0,0 +1,61 @@ +package de.infinimotion.backend.task; + +import de.infinimotion.model.backend.*; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@ApplicationScoped +public class ShowPlanner { + + @Inject + RequestReply requester; + + @Scheduled(every = "1h") + void planShows() throws Exception { + CommandWrapper requestPlans = new CommandListPlan().serialize().generateIds(); + List plans = CommandListPlanResponse.deserialize(requester.request(requestPlans)).getList(); + + CommandWrapper requestShows = new CommandListVorstellung().serialize().tx(requestPlans); + List shows = CommandListVorstellungResponse.deserialize(requester.request(requestShows)).getList(); + + boolean changed = false; + LocalDate todayPlus14 = LocalDate.now().plusDays(14); + for (Plan plan : plans) { + if (plan.getFirst().isAfter(todayPlus14)) continue; + + for (int i = 0; i < 14; i++) { + LocalDate day = LocalDate.now().plusDays(i); + if (day.getDayOfWeek().getValue() != plan.getWeekday()) continue; + + boolean exists = shows.stream().anyMatch(show -> show.getHall().getId().equals(plan.getHall().getId()) + && show.getMovie().getId().equals(plan.getMovie().getId()) + && show.getStart().toLocalTime().equals(plan.getTime()) + && show.getStart().toLocalDate().equals(day)); + if (exists) continue; + + Vorstellung show = new Vorstellung(); + show.setHall(plan.getHall()); + show.setMovie(plan.getMovie()); + show.setStart(LocalDateTime.of(day, plan.getTime())); + + CommandCreateVorstellung requestNewShow = new CommandCreateVorstellung(); + requestNewShow.setVorstellung(show); + Vorstellung newShow = CommandCreateVorstellungResponse.deserialize(requester.request(requestNewShow.serialize().tx(requestPlans))).getVorstellung(); + System.out.println("Creating show: " + newShow); + changed = true; + } + } + + if (changed) { + CommandWrapper commit = new CommandListVorstellung().serialize().tx(requestPlans).commit(); + CommandListVorstellungResponse.deserialize(requester.request(commit)); + System.out.println("Committed"); + } + } + +} diff --git a/src/main/java/de/infinimotion/backend/BetterRequestReply.java b/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java similarity index 98% rename from src/main/java/de/infinimotion/backend/BetterRequestReply.java rename to src/main/java/de/infinimotion/backend/util/BetterRequestReply.java index 058c8d5..caf29a3 100644 --- a/src/main/java/de/infinimotion/backend/BetterRequestReply.java +++ b/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java @@ -1,4 +1,4 @@ -package de.infinimotion.backend; +package de.infinimotion.backend.util; import de.infinimotion.model.backend.CommandException; import de.infinimotion.model.backend.CommandWrapper; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9d2ccc2..690aeaf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -20,3 +20,13 @@ mp.messaging.outgoing.command.connector=smallrye-kafka mp.messaging.incoming.command-replies.connector=smallrye-kafka mp.messaging.incoming.command-replies.auto.offset.reset=earliest + +omdb.api-key=2a3264fc +quarkus.rest-client.omdb-api.url=https://omdbapi.com/ +quarkus.rest-client.extensions-api.scope=jakarta.inject.Singleton + +quarkus.http.cors.enabled=true +quarkus.http.cors.origins=* +quarkus.http.cors.methods=* +quarkus.http.cors.headers=* +quarkus.http.cors.access-control-allow-credentials=true \ No newline at end of file