From f7d726b8a25a779ced15e7874d5aeac374b93083 Mon Sep 17 00:00:00 2001
From: Jottyfan
Date: Tue, 14 Apr 2026 20:20:37 +0200
Subject: [PATCH] preparations for online camp planning tool
---
build.gradle | 2 +-
.../module/campside/CampsideController.java | 38 ++++++
.../module/campside/CampsideRepository.java | 83 ++++++++++++
.../module/campside/CampsideService.java | 23 ++++
.../campside/model/MyCampBookingBean.java | 118 ++++++++++++++++++
.../module/campside/model/MyPersonBean.java | 66 ++++++++++
src/main/resources/templates/camplist.html | 4 +
.../resources/templates/campside/camp.html | 16 +++
.../resources/templates/campside/list.html | 39 ++++++
.../resources/templates/campside/plan.html | 16 +++
10 files changed, 404 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/de/jottyfan/camporganizer/module/campside/CampsideController.java
create mode 100644 src/main/java/de/jottyfan/camporganizer/module/campside/CampsideRepository.java
create mode 100644 src/main/java/de/jottyfan/camporganizer/module/campside/CampsideService.java
create mode 100644 src/main/java/de/jottyfan/camporganizer/module/campside/model/MyCampBookingBean.java
create mode 100644 src/main/java/de/jottyfan/camporganizer/module/campside/model/MyPersonBean.java
create mode 100644 src/main/resources/templates/campside/camp.html
create mode 100644 src/main/resources/templates/campside/list.html
create mode 100644 src/main/resources/templates/campside/plan.html
diff --git a/build.gradle b/build.gradle
index 67c655f..3e23820 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@ plugins {
}
group = 'de.jottyfan.camporganizer'
-version = '1.0.3'
+version = '1.0.4'
description = """CampOrganizer2"""
diff --git a/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideController.java b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideController.java
new file mode 100644
index 0000000..216cab6
--- /dev/null
+++ b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideController.java
@@ -0,0 +1,38 @@
+package de.jottyfan.camporganizer.module.campside;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import de.jottyfan.camporganizer.module.camplist.CommonController;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+@Controller
+public class CampsideController extends CommonController {
+ @Autowired
+ CampsideService service;
+
+ @GetMapping("/campside")
+ public String getCampside(final Model model) {
+ model.addAttribute("myCampBookings", service.getCampBookingsOf(super.getCurrentUser()));
+ return "/campside/list";
+ }
+
+ @GetMapping("/campside/{id}")
+ public String getCampDetails(@PathVariable("id") Integer fkCamp, final Model model) {
+ // TODO: load content for the camp with fkCamp
+ return "/campside/camp";
+ }
+
+ @GetMapping("/campside/{id}/plan")
+ public String getCampPlan(@PathVariable("id") Integer fkCamp, final Model model) {
+ // TODO: load camp plan from database
+ return "/campside/plan";
+ }
+}
diff --git a/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideRepository.java b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideRepository.java
new file mode 100644
index 0000000..fb47056
--- /dev/null
+++ b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideRepository.java
@@ -0,0 +1,83 @@
+package de.jottyfan.camporganizer.module.campside;
+
+import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON;
+import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE;
+import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.jooq.DSLContext;
+import org.jooq.Record;
+import org.jooq.Record9;
+import org.jooq.SelectSeekStep1;
+import org.jooq.impl.DSL;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import de.jottyfan.camporganizer.db.jooq.tables.TProfile;
+import de.jottyfan.camporganizer.module.campside.model.MyCampBookingBean;
+import de.jottyfan.camporganizer.module.campside.model.MyPersonBean;
+
+/**
+ *
+ * @author jotty
+ */
+@Repository
+public class CampsideRepository {
+ private static final Logger LOGGER = LogManager.getLogger(CampsideRepository.class);
+
+ @Autowired
+ private DSLContext jooq;
+
+ public List getMyCampBookings(String username) {
+ TProfile REGISTRATOR = TProfile.T_PROFILE.as("registrator");
+ SelectSeekStep1, LocalDateTime> sql = jooq
+ // @formatter:off
+ .select(V_CAMP.NAME,
+ V_CAMP.LOCATION_NAME,
+ V_CAMP.YEAR,
+ V_CAMP.IS_OVER,
+ V_CAMP.ARRIVE,
+ V_CAMP.DEPART,
+ V_CAMP.PK,
+ T_PERSON.FORENAME,
+ T_PERSON.SURNAME)
+ .from(T_PROFILE)
+ .leftJoin(T_PERSON).on(T_PERSON.FK_PROFILE.eq(T_PROFILE.PK))
+ .leftJoin(REGISTRATOR).on(REGISTRATOR.PK.eq(T_PERSON.FK_REGISTRATOR))
+ .leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP))
+ .where(DSL.trim(T_PROFILE.USERNAME).eq(username == null ? null : username.trim()))
+ .and(T_PERSON.PK.isNotNull())
+ .orderBy(V_CAMP.ARRIVE.desc());
+ // @formatter:on
+ LOGGER.trace(sql);
+ Map map = new HashMap<>();
+ Iterator> i = sql.fetch().iterator();
+ while (i.hasNext()) {
+ Record r = i.next();
+ Integer fkCamp = r.get(V_CAMP.PK);
+ MyCampBookingBean bean = map.get(fkCamp);
+ if (bean == null) {
+ bean = new MyCampBookingBean();
+ map.put(fkCamp, bean);
+ }
+ bean.setFkCamp(fkCamp);
+ bean.setLocationName(r.get(V_CAMP.LOCATION_NAME));
+ bean.setCampName(String.format("%s %4.0f", r.get(V_CAMP.NAME), r.get(V_CAMP.YEAR)).trim());
+ bean.setIsOver(r.get(V_CAMP.IS_OVER));
+ bean.setArrive(r.get(V_CAMP.ARRIVE));
+ bean.setDepart(r.get(V_CAMP.DEPART));
+ bean.getPerson().add(MyPersonBean.of(null, r.get(T_PERSON.FORENAME), r.get(T_PERSON.SURNAME)));
+ }
+ List list = new ArrayList<>(map.values());
+ list.sort((o1, o2) -> (o1 == null || o1.getArrive() == null || o2 == null) ? 0 : o1.getArrive().compareTo(o2.getArrive()));
+ return list;
+ }
+}
diff --git a/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideService.java b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideService.java
new file mode 100644
index 0000000..41af7b2
--- /dev/null
+++ b/src/main/java/de/jottyfan/camporganizer/module/campside/CampsideService.java
@@ -0,0 +1,23 @@
+package de.jottyfan.camporganizer.module.campside;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.jottyfan.camporganizer.module.campside.model.MyCampBookingBean;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+@Service
+public class CampsideService {
+ @Autowired
+ private CampsideRepository repository;
+
+ public List getCampBookingsOf(String currentUser) {
+ return repository.getMyCampBookings(currentUser);
+ }
+}
diff --git a/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyCampBookingBean.java b/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyCampBookingBean.java
new file mode 100644
index 0000000..0b15458
--- /dev/null
+++ b/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyCampBookingBean.java
@@ -0,0 +1,118 @@
+package de.jottyfan.camporganizer.module.campside.model;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class MyCampBookingBean implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Integer fkCamp;
+ private String locationName;
+ private String campName;
+ private Boolean isOver;
+ private LocalDateTime arrive;
+ private LocalDateTime depart;
+ private final List person;
+
+ public MyCampBookingBean() {
+ person = new ArrayList<>();
+ }
+
+ /**
+ * @return the fkCamp
+ */
+ public Integer getFkCamp() {
+ return fkCamp;
+ }
+
+ /**
+ * @param fkCamp the fkCamp to set
+ */
+ public void setFkCamp(Integer fkCamp) {
+ this.fkCamp = fkCamp;
+ }
+
+ /**
+ * @return the locationName
+ */
+ public String getLocationName() {
+ return locationName;
+ }
+
+ /**
+ * @param locationName the locationName to set
+ */
+ public void setLocationName(String locationName) {
+ this.locationName = locationName;
+ }
+
+ /**
+ * @return the campName
+ */
+ public String getCampName() {
+ return campName;
+ }
+
+ /**
+ * @param campName the campName to set
+ */
+ public void setCampName(String campName) {
+ this.campName = campName;
+ }
+
+ /**
+ * @return the isOver
+ */
+ public Boolean getIsOver() {
+ return isOver;
+ }
+
+ /**
+ * @param isOver the isOver to set
+ */
+ public void setIsOver(Boolean isOver) {
+ this.isOver = isOver;
+ }
+
+ /**
+ * @return the person
+ */
+ public List getPerson() {
+ return person;
+ }
+
+ /**
+ * @return the arrive
+ */
+ public LocalDateTime getArrive() {
+ return arrive;
+ }
+
+ /**
+ * @param arrive the arrive to set
+ */
+ public void setArrive(LocalDateTime arrive) {
+ this.arrive = arrive;
+ }
+
+ /**
+ * @return the depart
+ */
+ public LocalDateTime getDepart() {
+ return depart;
+ }
+
+ /**
+ * @param depart the depart to set
+ */
+ public void setDepart(LocalDateTime depart) {
+ this.depart = depart;
+ }
+}
diff --git a/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyPersonBean.java b/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyPersonBean.java
new file mode 100644
index 0000000..ac7dd74
--- /dev/null
+++ b/src/main/java/de/jottyfan/camporganizer/module/campside/model/MyPersonBean.java
@@ -0,0 +1,66 @@
+package de.jottyfan.camporganizer.module.campside.model;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class MyPersonBean implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Integer pkPerson;
+ private String forename;
+ private String surname;
+
+ public static final MyPersonBean of(Integer pkPerson, String forename, String surname) {
+ MyPersonBean bean = new MyPersonBean();
+ bean.setPkPerson(pkPerson);
+ bean.setForename(forename);
+ bean.setSurname(surname);
+ return bean;
+ }
+
+ /**
+ * @return the forename
+ */
+ public String getForename() {
+ return forename;
+ }
+
+ /**
+ * @param forename the forename to set
+ */
+ public void setForename(String forename) {
+ this.forename = forename;
+ }
+
+ /**
+ * @return the pkPerson
+ */
+ public Integer getPkPerson() {
+ return pkPerson;
+ }
+
+ /**
+ * @param pkPerson the pkPerson to set
+ */
+ public void setPkPerson(Integer pkPerson) {
+ this.pkPerson = pkPerson;
+ }
+
+ /**
+ * @return the surname
+ */
+ public String getSurname() {
+ return surname;
+ }
+
+ /**
+ * @param surname the surname to set
+ */
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+}
diff --git a/src/main/resources/templates/camplist.html b/src/main/resources/templates/camplist.html
index 0a4f62d..63441e7 100644
--- a/src/main/resources/templates/camplist.html
+++ b/src/main/resources/templates/camplist.html
@@ -8,6 +8,10 @@
+
+
+
+ Diese Übersicht wurde noch nicht entwickelt.
+
+
+
+
diff --git a/src/main/resources/templates/campside/camp.html b/src/main/resources/templates/campside/camp.html
new file mode 100644
index 0000000..deef8fc
--- /dev/null
+++ b/src/main/resources/templates/campside/camp.html
@@ -0,0 +1,16 @@
+
+
+