From 30fb52a6062ac9442a246c7ee03325aff81ae715 Mon Sep 17 00:00:00 2001 From: Jottyfan Date: Thu, 30 Jan 2025 22:37:22 +0100 Subject: [PATCH] camp admin added --- build.gradle | 2 +- .../jottyfan/bico/config/SecurityConfig.java | 1 + .../bico/modules/CommonController.java | 17 ++-- .../camp/AdminRegistrationController.java | 51 ++++++++++++ .../camp/AdminRegistrationService.java | 33 ++++++++ .../modules/camp/RegistrationRepository.java | 52 ++++++++++++ src/main/resources/static/css/style.css | 15 ++++ src/main/resources/templates/camp/list.html | 81 +++++++++++++++++++ src/main/resources/templates/template.html | 1 + 9 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationController.java create mode 100644 src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationService.java create mode 100644 src/main/resources/templates/camp/list.html diff --git a/build.gradle b/build.gradle index a6c1b49..3baa97c 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { } group = 'de.jottyfan.bico' -version = '0.2.1' +version = '0.2.2' description = """BibleClassOrganizer""" diff --git a/src/main/java/de/jottyfan/bico/config/SecurityConfig.java b/src/main/java/de/jottyfan/bico/config/SecurityConfig.java index 3ed7529..32cf44c 100644 --- a/src/main/java/de/jottyfan/bico/config/SecurityConfig.java +++ b/src/main/java/de/jottyfan/bico/config/SecurityConfig.java @@ -12,6 +12,7 @@ import org.springframework.security.web.SecurityFilterChain; */ @Configuration public class SecurityConfig { + @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests( diff --git a/src/main/java/de/jottyfan/bico/modules/CommonController.java b/src/main/java/de/jottyfan/bico/modules/CommonController.java index 4d65350..80fd37a 100644 --- a/src/main/java/de/jottyfan/bico/modules/CommonController.java +++ b/src/main/java/de/jottyfan/bico/modules/CommonController.java @@ -3,8 +3,6 @@ package de.jottyfan.bico.modules; import java.security.Principal; import java.util.List; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; @@ -12,6 +10,7 @@ import org.springframework.security.oauth2.client.authentication.OAuth2Authentic import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.bind.annotation.ModelAttribute; +import de.jottyfan.bico.Main; import de.jottyfan.bico.modules.profile.ProfileService; /** @@ -20,8 +19,7 @@ import de.jottyfan.bico.modules.profile.ProfileService; * */ public abstract class CommonController { - - private static final Logger LOGGER = LogManager.getLogger(CommonController.class); + private static final List admins = List.of("andre.sieber", "tobias.kuehne", "jotty"); @Autowired private ProfileService profileService; @@ -29,6 +27,11 @@ public abstract class CommonController { @Value("${spring.security.oauth2.client.provider.nextcloud.issuer-uri}") private String nextcloudUrl; + @ModelAttribute("isCampAdmin") + public Boolean isCampAdmin(Principal principal) { + return admins.contains(principal.getName()); + } + @ModelAttribute("hasBUrole") public Boolean hasBURole(Principal principal) { OAuth2AuthenticationToken token = (OAuth2AuthenticationToken) principal; @@ -38,7 +41,7 @@ public abstract class CommonController { List roles = (List) user.getAttributes().get("roles"); return roles.contains("Bibelunterricht"); } else { - LOGGER.warn("token is null, no roles can be detected"); + Main.LOGGER.warn("token is null, no roles can be detected"); return false; } } @@ -52,7 +55,7 @@ public abstract class CommonController { List roles = (List) user.getAttributes().get("roles"); return roles.contains("Kinderstunde klein"); } else { - LOGGER.warn("token is null, no roles can be detected"); + Main.LOGGER.warn("token is null, no roles can be detected"); return false; } } @@ -66,7 +69,7 @@ public abstract class CommonController { List roles = (List) user.getAttributes().get("roles"); return roles.size() > 0; } else { - LOGGER.warn("token is null, no roles can be detected"); + Main.LOGGER.warn("token is null, no roles can be detected"); return false; } } diff --git a/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationController.java b/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationController.java new file mode 100644 index 0000000..ca9f0ee --- /dev/null +++ b/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationController.java @@ -0,0 +1,51 @@ +package de.jottyfan.bico.modules.camp; + +import java.io.IOException; +import java.security.Principal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import de.jottyfan.bico.modules.CommonController; +import jakarta.servlet.http.HttpServletResponse; + +/** + * + * @author jotty + * + */ +@Configuration +@Controller +public class AdminRegistrationController extends CommonController { + + @Autowired + private AdminRegistrationService service; + + @GetMapping("/camp/registration/admin") + public String getList(Model model, Principal principal) { + if (isCampAdmin(principal)) { + model.addAttribute("list", service.getAllRegistrations()); + model.addAttribute("ages", service.getAges()); + } + return "/camp/list"; + } + + @GetMapping("/camp/registration/admin/download") + @ResponseBody + public String download(HttpServletResponse response, Principal principal) throws IOException { + if (isCampAdmin(principal)) { + response.setHeader("Content-Disposition", String.format("attachment; filename=Gemeindefreizeit-Anmeldungen-%s.csv", + LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME))); + response.setContentType("text/csv; charset=utf-8"); + return service.getDownload(); + } else { + return "forbidden"; + } + } +} diff --git a/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationService.java b/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationService.java new file mode 100644 index 0000000..3ed7a69 --- /dev/null +++ b/src/main/java/de/jottyfan/bico/modules/camp/AdminRegistrationService.java @@ -0,0 +1,33 @@ +package de.jottyfan.bico.modules.camp; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import de.jottyfan.bico.db.camp.tables.records.TAgeRecord; +import de.jottyfan.bico.modules.camp.model.RegistrationBean; + +/** + * + * @author jotty + * + */ +@Service +public class AdminRegistrationService { + + @Autowired + private RegistrationRepository repository; + + public List getAllRegistrations() { + return repository.getAllRegistrations(); + } + + public List getAges() { + return repository.getAges(); + } + + public String getDownload() { + return repository.getDownload(); + } +} diff --git a/src/main/java/de/jottyfan/bico/modules/camp/RegistrationRepository.java b/src/main/java/de/jottyfan/bico/modules/camp/RegistrationRepository.java index 3b28b03..ee80d8b 100644 --- a/src/main/java/de/jottyfan/bico/modules/camp/RegistrationRepository.java +++ b/src/main/java/de/jottyfan/bico/modules/camp/RegistrationRepository.java @@ -3,12 +3,15 @@ package de.jottyfan.bico.modules.camp; import static de.jottyfan.bico.db.camp.Tables.T_AGE; import static de.jottyfan.bico.db.camp.Tables.T_REGISTRATION; +import java.time.LocalDateTime; import java.util.List; import org.jooq.DSLContext; import org.jooq.DeleteConditionStep; import org.jooq.InsertValuesStep20; +import org.jooq.Record19; import org.jooq.SelectConditionStep; +import org.jooq.SelectOnConditionStep; import org.jooq.SelectSeekStep1; import org.jooq.UpdateConditionStep; import org.jooq.impl.DSL; @@ -102,6 +105,21 @@ public class RegistrationRepository { }); } + /** + * get all registrations (for admins only) + * + * @return the registrations + */ + public List getAllRegistrations() { + SelectSeekStep1 sql = jooq + // @formatter:off + .selectFrom(T_REGISTRATION) + .orderBy(T_REGISTRATION.CREATED); + // @formatter:on + Main.LOGGER.trace(sql); + return sql.fetchInto(RegistrationBean.class); + } + /** * get all registrations of name * @@ -167,4 +185,38 @@ public class RegistrationRepository { Main.LOGGER.trace(sql); return sql.fetchInto(TAgeRecord.class); } + + /** + * get CSV version of the list, only for admins + * + * @return the csv + */ + public String getDownload() { + SelectOnConditionStep> sql = jooq + // @formatter:off + .select(T_REGISTRATION.CREATED, + T_REGISTRATION.FORENAME, + T_REGISTRATION.SURNAME, + T_REGISTRATION.SEX, + T_AGE.NAME, + T_REGISTRATION.DAY0, + T_REGISTRATION.DAY1, + T_REGISTRATION.DAY2, + T_REGISTRATION.DAY3, + T_REGISTRATION.DAY4, + T_REGISTRATION.BARRIER_FREE, + T_REGISTRATION.TOWELS, + T_REGISTRATION.BED_LINEN, + T_REGISTRATION.COT, + T_REGISTRATION.REQUIRE_PAYMENT, + T_REGISTRATION.DISEASES, + T_REGISTRATION.NUTRITION, + T_REGISTRATION.DRIVER_PROVIDE_PLACES, + T_REGISTRATION.WANT_PLACE_IN_CAR) + .from(T_REGISTRATION) + .leftJoin(T_AGE).on(T_AGE.PK_AGE.eq(T_REGISTRATION.FK_AGE)); + // @formatter:on + Main.LOGGER.trace(sql); + return sql.fetch().formatCSV(true); + } } diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index ce1c47c..5ebd39f 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -50,4 +50,19 @@ body { .centeredalert { width: 400px; margin: auto; +} + +.campbadge { + border: 1px solid #222; + color: #222; +} + +[data-bs-theme=dark] .campbadge { + border-color: silver; + color: silver; +} + +.full-size { + width: 100% !important; + max-width: inherit !important; } \ No newline at end of file diff --git a/src/main/resources/templates/camp/list.html b/src/main/resources/templates/camp/list.html new file mode 100644 index 0000000..ac02521 --- /dev/null +++ b/src/main/resources/templates/camp/list.html @@ -0,0 +1,81 @@ + + + + +
+
+
+
+

Anmeldungen zur Gemeindefreizeit 2025

+
+
+
Sie haben keine Berechtigung, die Anmeldungen einzusehen.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
VornameNachnameGeschlechtAlterTage dabeiExtrasUnverträglichkeitMitfahrplätzeBesonderheiten
+ + + + + Donnerstag + Freitag + Sonnabend + Sonntag + Montag + + barrierefrei + Handtücher + Bettwäsche + Kinderbett + finanzielle Unterstützung erbeten + + biete + benötige 1 +
+ +
+
+
+ Download +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/template.html b/src/main/resources/templates/template.html index 86bcb52..9968937 100644 --- a/src/main/resources/templates/template.html +++ b/src/main/resources/templates/template.html @@ -26,6 +26,7 @@