From 0d4dcd4df4307a0d7dae8a3ecdf588989328bc91 Mon Sep 17 00:00:00 2001 From: mbremer Date: Sun, 1 Aug 2021 11:49:32 +0200 Subject: [PATCH] Room per User and KalenderTag --- src/main/java/de/mbremer/image/Image.java | 3 +- .../de/mbremer/kalender/KalenderResource.java | 44 ++++---------- .../de/mbremer/kalender/KalenderService.java | 36 +++++++++++ .../java/de/mbremer/kalender/KalenderTag.java | 6 +- src/main/java/de/mbremer/room/Room.java | 22 +++++++ src/main/java/de/mbremer/room/RoomForm.java | 11 ++++ .../java/de/mbremer/room/RoomResource.java | 59 ++++++++++++++++++- src/main/java/de/mbremer/secutity/User.java | 6 ++ .../java/de/mbremer/secutity/UserService.java | 17 ++++++ .../resources/db/migration/V0003__room.sql | 10 ++++ src/main/resources/templates/room-modal.html | 25 ++++++++ src/main/resources/templates/room.html | 23 ++++++++ 12 files changed, 228 insertions(+), 34 deletions(-) create mode 100644 src/main/java/de/mbremer/kalender/KalenderService.java create mode 100644 src/main/java/de/mbremer/room/Room.java create mode 100644 src/main/java/de/mbremer/room/RoomForm.java create mode 100644 src/main/java/de/mbremer/secutity/UserService.java create mode 100644 src/main/resources/db/migration/V0003__room.sql create mode 100644 src/main/resources/templates/room-modal.html diff --git a/src/main/java/de/mbremer/image/Image.java b/src/main/java/de/mbremer/image/Image.java index 9792e57..a8d2d29 100644 --- a/src/main/java/de/mbremer/image/Image.java +++ b/src/main/java/de/mbremer/image/Image.java @@ -8,6 +8,7 @@ import lombok.Setter; import javax.persistence.Column; import javax.persistence.Entity; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -17,7 +18,7 @@ import javax.validation.constraints.NotNull; @AllArgsConstructor @Entity public class Image extends PanacheEntity { - @NotNull + @NotBlank @Column(nullable = false) private String name; @NotNull diff --git a/src/main/java/de/mbremer/kalender/KalenderResource.java b/src/main/java/de/mbremer/kalender/KalenderResource.java index 055d81c..b190143 100644 --- a/src/main/java/de/mbremer/kalender/KalenderResource.java +++ b/src/main/java/de/mbremer/kalender/KalenderResource.java @@ -1,10 +1,11 @@ package de.mbremer.kalender; +import de.mbremer.room.Room; import de.mbremer.secutity.User; +import de.mbremer.secutity.UserService; import io.quarkus.qute.Location; import io.quarkus.qute.Template; import io.quarkus.qute.TemplateInstance; -import io.quarkus.security.identity.SecurityIdentity; import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.providers.multipart.MultipartForm; @@ -18,7 +19,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; @Path("/kalender") @RolesAllowed({"USER", "ADMIN"}) @@ -27,7 +27,9 @@ public class KalenderResource { @Inject Logger log; @Inject - SecurityIdentity identity; + UserService userService; + @Inject + KalenderService kalenderService; @Inject Template kalenderpage; @Inject @@ -40,32 +42,14 @@ public class KalenderResource { @GET @Produces(MediaType.TEXT_HTML) public TemplateInstance kalender(@QueryParam("offset") @DefaultValue("0") int offsetInWeeks) { - List week = getWeek(offsetInWeeks); - return kalenderpage .data("today", LocalDate.now()) .data("offset", offsetInWeeks) - .data("week", week); - } - - private List getWeek(int offsetInWeeks) { - User currentUser = getCurrentUser(); - LocalDate today = LocalDate.now(); - LocalDate montag = today.minusDays(today.getDayOfWeek().getValue() - 1).plusDays(7 * offsetInWeeks); - - return Stream.iterate(0, i -> i < 5, i -> ++i) - .map(d -> { - LocalDate day = montag.plusDays(d); - KalenderTag tag = (KalenderTag) KalenderTag.find("day", day).singleResultOptional().orElse(new KalenderTag(day)); - tag.setCurrentUserInOffice(currentUser.equals(tag.getInOffice())); - tag.setToday(LocalDate.now().equals(day)); - return tag; - }) - .collect(Collectors.toList()); + .data("week", kalenderService.getWeek(offsetInWeeks)); } private List getEvents(int offsetInWeeks) { - List week = getWeek(offsetInWeeks); + List week = kalenderService.getWeek(offsetInWeeks); return week.stream() .filter(d -> d.isCurrentUserInOffice()) .map(d-> new Event(LocalDateTime.now(), d.getDay())) @@ -80,32 +64,30 @@ public class KalenderResource { @QueryParam("offset") int offsetInWeeks, @MultipartForm KalenderTagForm kalenderForm) { LocalDate dayParsed = LocalDate.parse(day); - User currentUser = getCurrentUser(); + User currentUser = userService.getCurrentUser(); + Room room = currentUser.getRoom(); try { - KalenderTag tag = KalenderTag.find("day", dayParsed).singleResult(); + KalenderTag tag = KalenderTag.find("day = ?1 and room = ?2", dayParsed, room).singleResult(); if (kalenderForm.isInOffice() && tag.getInOffice() == null) { tag.setInOffice(currentUser); } else if (!kalenderForm.isInOffice() && currentUser.equals(tag.getInOffice())) { tag.setInOffice(null); } } catch (NoResultException e) { - KalenderTag tag = new KalenderTag(dayParsed); + KalenderTag tag = new KalenderTag(dayParsed, room); tag.setInOffice(currentUser); + tag.setRoom(currentUser.getRoom()); tag.persist(); } return kalender(offsetInWeeks); } - private User getCurrentUser() { - return User.find("username", identity.getPrincipal().getName()).singleResult(); - } - @GET @Produces(MediaType.TEXT_PLAIN) @Path("export/txt") public TemplateInstance exportTxt(@QueryParam("offset") int offset) { - return textExport.data("week", getWeek(offset)); + return textExport.data("week", kalenderService.getWeek(offset)); } @GET diff --git a/src/main/java/de/mbremer/kalender/KalenderService.java b/src/main/java/de/mbremer/kalender/KalenderService.java new file mode 100644 index 0000000..f382f88 --- /dev/null +++ b/src/main/java/de/mbremer/kalender/KalenderService.java @@ -0,0 +1,36 @@ +package de.mbremer.kalender; + +import de.mbremer.room.Room; +import de.mbremer.secutity.User; +import de.mbremer.secutity.UserService; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@ApplicationScoped +public class KalenderService { + @Inject + UserService userService; + + public List getWeek(int offsetInWeeks) { + User currentUser = userService.getCurrentUser(); + Room room = currentUser.getRoom(); + LocalDate today = LocalDate.now(); + LocalDate montag = today.minusDays(today.getDayOfWeek().getValue() - 1).plusDays(7 * offsetInWeeks); + return Stream.iterate(0, i -> i < 5, i -> ++i) + .map(d -> { + LocalDate day = montag.plusDays(d); + KalenderTag tag = + (KalenderTag) KalenderTag.find("day = ?1 and room = ?2", day, room).singleResultOptional() + .orElse(new KalenderTag(day, room)); + tag.setCurrentUserInOffice(currentUser.equals(tag.getInOffice())); + tag.setToday(LocalDate.now().equals(day)); + return tag; + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/de/mbremer/kalender/KalenderTag.java b/src/main/java/de/mbremer/kalender/KalenderTag.java index e55a1e9..d37ef15 100644 --- a/src/main/java/de/mbremer/kalender/KalenderTag.java +++ b/src/main/java/de/mbremer/kalender/KalenderTag.java @@ -1,5 +1,6 @@ package de.mbremer.kalender; +import de.mbremer.room.Room; import de.mbremer.secutity.User; import io.quarkus.hibernate.orm.panache.PanacheEntity; import lombok.Getter; @@ -20,12 +21,15 @@ public class KalenderTag extends PanacheEntity { private LocalDate day; @OneToOne private User inOffice; + @OneToOne + private Room room; @Transient private boolean currentUserInOffice; @Transient private boolean today; - public KalenderTag(LocalDate day) { + public KalenderTag(LocalDate day, Room room) { this.day = day; + this.room = room; } } diff --git a/src/main/java/de/mbremer/room/Room.java b/src/main/java/de/mbremer/room/Room.java new file mode 100644 index 0000000..c698132 --- /dev/null +++ b/src/main/java/de/mbremer/room/Room.java @@ -0,0 +1,22 @@ +package de.mbremer.room; + +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Room extends PanacheEntity { + @NotBlank + @Column(nullable = false) + private String name; +} diff --git a/src/main/java/de/mbremer/room/RoomForm.java b/src/main/java/de/mbremer/room/RoomForm.java new file mode 100644 index 0000000..66d6a59 --- /dev/null +++ b/src/main/java/de/mbremer/room/RoomForm.java @@ -0,0 +1,11 @@ +package de.mbremer.room; + +import javax.ws.rs.FormParam; + +public class RoomForm { + public @FormParam("name") String name; + + public Room getRoom() { + return new Room(name); + } +} diff --git a/src/main/java/de/mbremer/room/RoomResource.java b/src/main/java/de/mbremer/room/RoomResource.java index 3b21396..8f9080f 100644 --- a/src/main/java/de/mbremer/room/RoomResource.java +++ b/src/main/java/de/mbremer/room/RoomResource.java @@ -1,37 +1,52 @@ package de.mbremer.room; import de.mbremer.image.ImageService; +import de.mbremer.kalender.KalenderTag; +import de.mbremer.secutity.User; +import de.mbremer.secutity.UserService; import io.quarkus.qute.Template; import io.quarkus.qute.TemplateInstance; import io.quarkus.security.identity.SecurityIdentity; +import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.providers.multipart.MultipartForm; import javax.annotation.security.RolesAllowed; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.persistence.NoResultException; +import javax.transaction.Transactional; import javax.validation.ValidationException; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; +import static io.quarkus.panache.common.Sort.ascending; + @Path("/room") @ApplicationScoped @RolesAllowed({"USER", "ADMIN"}) public class RoomResource { + @Inject + Logger log; @Inject SecurityIdentity identity; @Inject ImageService imageService; @Inject + UserService userService; + @Inject Template room; @GET @Produces(MediaType.TEXT_HTML) public TemplateInstance getRoom() { + Room currentRoom = userService.getCurrentUser().getRoom(); return room - .data("is_admin", identity.hasRole("ADMIN")); + .data("is_admin", identity.hasRole("ADMIN")) + .data("rooms", Room.listAll(ascending("name"))) + .data("current_room", currentRoom == null ? "" : currentRoom.getName()); } @POST @@ -58,4 +73,46 @@ public class RoomResource { byte[] roomplan = imageService.getRoomplan(); return roomplan.length == 0 ? Response.noContent().build() : Response.ok(roomplan).build(); } + + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_HTML) + @Transactional + @Path("/new") + public TemplateInstance add(@MultipartForm RoomForm roomForm) { + Room room = roomForm.getRoom(); + + if (Room.count("name", room.getName()) > 0) { + return getRoom().data("error", "Der Raum " + room.getName() + " ist bereits vorhanden"); + } + + room.persist(); + + if (Room.count() == 1) { + log.info("Migriere alle KalenderTage ohne Rooom zu " + room.getName()); + KalenderTag.find("room is null").stream() + .map(k -> (KalenderTag) k).forEach(k -> k.setRoom(room)); + } + + return getRoom().data("info", "Raum " + room.getName() + " angelegt."); + } + + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @Produces(MediaType.TEXT_HTML) + @Transactional + @Path("/user") + public TemplateInstance setRoom(@FormParam("room") String roomName) { + Room room; + try { + room = Room.find("name", roomName).singleResult(); + } catch (NoResultException e) { + return getRoom().data("error", "Raum " + roomName + " existiert nicht."); + } + User user = userService.getCurrentUser(); + user.setRoom(room); + log.info("Setze Raum " + roomName + " für User " + user.getUsername()); + + return getRoom(); + } } \ No newline at end of file diff --git a/src/main/java/de/mbremer/secutity/User.java b/src/main/java/de/mbremer/secutity/User.java index f5d5ec9..bd2d5b6 100644 --- a/src/main/java/de/mbremer/secutity/User.java +++ b/src/main/java/de/mbremer/secutity/User.java @@ -1,5 +1,6 @@ package de.mbremer.secutity; +import de.mbremer.room.Room; import io.quarkus.elytron.security.common.BcryptUtil; import io.quarkus.hibernate.orm.panache.PanacheEntity; import io.quarkus.security.jpa.Password; @@ -31,6 +32,11 @@ public class User extends PanacheEntity { @Column(nullable = false) private String password; + @OneToOne + @Getter + @Setter + private Room room; + /** * ADMIN or USER. */ diff --git a/src/main/java/de/mbremer/secutity/UserService.java b/src/main/java/de/mbremer/secutity/UserService.java new file mode 100644 index 0000000..ff226f3 --- /dev/null +++ b/src/main/java/de/mbremer/secutity/UserService.java @@ -0,0 +1,17 @@ +package de.mbremer.secutity; + +import io.quarkus.security.identity.SecurityIdentity; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +@ApplicationScoped +public class UserService { + + @Inject + SecurityIdentity identity; + + public User getCurrentUser() { + return User.find("username", identity.getPrincipal().getName()).singleResult(); + } +} diff --git a/src/main/resources/db/migration/V0003__room.sql b/src/main/resources/db/migration/V0003__room.sql new file mode 100644 index 0000000..972f568 --- /dev/null +++ b/src/main/resources/db/migration/V0003__room.sql @@ -0,0 +1,10 @@ +create table room ( + id bigint not null primary key, + name varchar not null unique +); + +alter table users add column room_id bigint references room; +alter table kalendertag add column room_id bigint references room; + +alter table kalendertag drop constraint kalendertag_day_key; + diff --git a/src/main/resources/templates/room-modal.html b/src/main/resources/templates/room-modal.html new file mode 100644 index 0000000..d9233ec --- /dev/null +++ b/src/main/resources/templates/room-modal.html @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/room.html b/src/main/resources/templates/room.html index 45d176d..202dee3 100644 --- a/src/main/resources/templates/room.html +++ b/src/main/resources/templates/room.html @@ -2,6 +2,24 @@ {#room_active}active{/} {#contents} +
+ {#if rooms.size == 0} + Kein Raum vorhanden + {#else} +

Raum wählen

+ {/if} + +
+ {#for room in rooms} +
+ + +
+ {/for} +
+
+
kein Raumplan vorhanden
@@ -17,6 +35,11 @@ + + +{#include room-modal.html}{/include} {/if} {/contents}