Room per User and KalenderTag
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
36
src/main/java/de/mbremer/kalender/KalenderService.java
Normal file
36
src/main/java/de/mbremer/kalender/KalenderService.java
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
22
src/main/java/de/mbremer/room/Room.java
Normal file
22
src/main/java/de/mbremer/room/Room.java
Normal 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;
|
||||
}
|
||||
11
src/main/java/de/mbremer/room/RoomForm.java
Normal file
11
src/main/java/de/mbremer/room/RoomForm.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
17
src/main/java/de/mbremer/secutity/UserService.java
Normal file
17
src/main/java/de/mbremer/secutity/UserService.java
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user