From 0240d9e79584d6b449646e73ddeffd1beb8d654f Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Fri, 28 Nov 2025 20:18:06 +0100 Subject: [PATCH] auto create shows on plan creation --- .../backend/task/ShowPlanner.java | 64 +++++++++++-------- .../backend/util/BetterRequestReply.java | 20 ++++++ 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/infinimotion/backend/task/ShowPlanner.java b/src/main/java/de/infinimotion/backend/task/ShowPlanner.java index 7831008..f8ac4cf 100644 --- a/src/main/java/de/infinimotion/backend/task/ShowPlanner.java +++ b/src/main/java/de/infinimotion/backend/task/ShowPlanner.java @@ -9,49 +9,59 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; @ApplicationScoped public class ShowPlanner { + private static final ReentrantLock LOCK = new ReentrantLock(); + @Inject RequestReply requester; @Scheduled(every = "1h", delay = 10, delayUnit = TimeUnit.SECONDS) - void planShows() throws Exception { - CommandWrapper requestPlans = new CommandListPlan().serialize().generateIds(); - List plans = CommandListPlanResponse.deserialize(requester.request(requestPlans)).getList(); + public void planShows() throws Exception { + LOCK.lock(); + try { + LocalDateTime today = LocalDateTime.now(); + LocalDateTime todayPlus14 = LocalDateTime.now().plusDays(14); - CommandWrapper requestShows = new CommandListVorstellung().serialize().tx(requestPlans); - List shows = CommandListVorstellungResponse.deserialize(requester.request(requestShows)).getList(); + List planFilter = List.of("le;first;date;" + todayPlus14); + CommandWrapper requestPlans = new CommandListPlan(planFilter).serialize().generateIds(); + List plans = CommandListPlanResponse.deserialize(requester.request(requestPlans)).getList(); - LocalDate todayPlus14 = LocalDate.now().plusDays(14); - for (Plan plan : plans) { - if (plan.getFirst().isAfter(todayPlus14)) continue; + List showFilter = List.of("ge;start;date;" + today.minusDays(1), "le;start;date;" + todayPlus14.plusDays(1)); + CommandWrapper requestShows = new CommandListVorstellung(showFilter).serialize().tx(requestPlans); + List shows = CommandListVorstellungResponse.deserialize(requester.request(requestShows)).getList(); - for (int i = 0; i < 14; i++) { - LocalDate day = LocalDate.now().plusDays(i); - if (day.getDayOfWeek().getValue() != plan.getWeekday()) continue; + for (Plan plan : plans) { + 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; + boolean exists = shows.stream().anyMatch(show -> show.getHall().getId().equals(plan.getHall().getId()) + //&& show.getMovie().getId().equals(plan.getMovie().getId()) // nicht notwendige Überprüfung! + && 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())); + 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); + CommandCreateVorstellung requestNewShow = new CommandCreateVorstellung(); + requestNewShow.setVorstellung(show); + Vorstellung newShow = CommandCreateVorstellungResponse.deserialize(requester.request(requestNewShow.serialize().tx(requestPlans))).getVorstellung(); + System.out.println("Creating show: " + newShow); + } } - } - CommandWrapper commit = new CommandListVorstellung().serialize().tx(requestPlans).commit(); - CommandListVorstellungResponse.deserialize(requester.request(commit)); + CommandWrapper commit = new CommandListVorstellung().serialize().tx(requestPlans).commit(); + CommandListVorstellungResponse.deserialize(requester.request(commit)); + } finally { + LOCK.unlock(); + } } } diff --git a/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java b/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java index caf29a3..e940b73 100644 --- a/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java +++ b/src/main/java/de/infinimotion/backend/util/BetterRequestReply.java @@ -1,9 +1,13 @@ package de.infinimotion.backend.util; +import de.infinimotion.backend.task.ShowPlanner; +import de.infinimotion.model.backend.CommandCreatePlanResponse; import de.infinimotion.model.backend.CommandException; import de.infinimotion.model.backend.CommandWrapper; import de.infinimotion.model.backend.RequestReply; +import io.quarkus.scheduler.Scheduler; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.eclipse.microprofile.reactive.messaging.Channel; import org.eclipse.microprofile.reactive.messaging.Emitter; import org.eclipse.microprofile.reactive.messaging.Incoming; @@ -55,6 +59,7 @@ public class BetterRequestReply implements RequestReply { if (CommandException.isType(response)) { throw new RuntimeException(CommandException.deserialize(response).getException()); } + intercept(response); return response; } finally { RESPONSES.remove(wrapper.getRequest()); @@ -62,4 +67,19 @@ public class BetterRequestReply implements RequestReply { } } + @Inject + ShowPlanner showPlanner; + + private void intercept(CommandWrapper response) { + if (response.getType().equals(CommandCreatePlanResponse.class.getSimpleName())) { + new Thread(() -> { + try { + showPlanner.planShows(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); + } + } + }