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