Room per User and KalenderTag

This commit is contained in:
mbremer
2021-08-01 11:49:32 +02:00
parent 6f02239bdc
commit 0d4dcd4df4
12 changed files with 228 additions and 34 deletions

View File

@@ -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

View File

@@ -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<KalenderTag> week = getWeek(offsetInWeeks);
return kalenderpage
.data("today", LocalDate.now())
.data("offset", offsetInWeeks)
.data("week", week);
}
private List<KalenderTag> 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<Event> getEvents(int offsetInWeeks) {
List<KalenderTag> week = getWeek(offsetInWeeks);
List<KalenderTag> 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

View File

@@ -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<KalenderTag> 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());
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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.
*/

View File

@@ -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();
}
}