diff --git a/src/main/java/mops/gruppen2/controller/WebController.java b/src/main/java/mops/gruppen2/controller/WebController.java index 2e78495..b15b5eb 100644 --- a/src/main/java/mops/gruppen2/controller/WebController.java +++ b/src/main/java/mops/gruppen2/controller/WebController.java @@ -108,11 +108,8 @@ public class WebController { @RequestParam(value = "parent", required = false) String parent) throws EventException { Account account = keyCloakService.createAccountFromPrincipal(token); - visibility = visibility == null; - maxInfiniteUsers = maxInfiniteUsers != null; UUID parentUUID = controllerService.getUUID(parent); controllerService.createGroup(account, title, description, visibility, maxInfiniteUsers, userMaximum, parentUUID); - return "redirect:/gruppen2/"; } diff --git a/src/main/java/mops/gruppen2/domain/exception/BadParameterException.java b/src/main/java/mops/gruppen2/domain/exception/BadParameterException.java new file mode 100644 index 0000000..b1767d2 --- /dev/null +++ b/src/main/java/mops/gruppen2/domain/exception/BadParameterException.java @@ -0,0 +1,10 @@ +package mops.gruppen2.domain.exception; + +import org.springframework.http.HttpStatus; + +public class BadParameterException extends EventException { + + public BadParameterException(String info) { + super(HttpStatus.INTERNAL_SERVER_ERROR, "Fehlerhafter Parameter angegeben!", info); + } +} diff --git a/src/main/java/mops/gruppen2/repository/EventRepository.java b/src/main/java/mops/gruppen2/repository/EventRepository.java index f2e6d4d..b306452 100644 --- a/src/main/java/mops/gruppen2/repository/EventRepository.java +++ b/src/main/java/mops/gruppen2/repository/EventRepository.java @@ -31,4 +31,13 @@ public interface EventRepository extends CrudRepository { @Query("SELECT * FROM event WHERE event_type = :type") List findAllEventsByType(@Param("type") String type); + + @Query("SELECT * FROM event WHERE event_type = :type AND user_id = :userId") + List findEventsByTypeAndUserId(@Param("type") String type, @Param("userId") String userId); + + @Query("SELECT COUNT(*) FROM event WHERE event_type = :type AND group_id = :groupId") + Long countEventsByTypeAndGroupId(@Param("type") String type, @Param("groupId") String groupId); + + @Query("SELECT COUNT(*) FROM event WHERE group_id = :groupId AND user_id = :userId AND event_type = :type") + Long countEventsByGroupIdAndUserIdAndEventType(@Param("groupId") String groupId, @Param("userId") String userId, @Param("type") String type); } diff --git a/src/main/java/mops/gruppen2/service/ControllerService.java b/src/main/java/mops/gruppen2/service/ControllerService.java index c7dd424..d88fe24 100644 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ b/src/main/java/mops/gruppen2/service/ControllerService.java @@ -15,6 +15,7 @@ import mops.gruppen2.domain.event.UpdateGroupTitleEvent; import mops.gruppen2.domain.event.UpdateRoleEvent; import mops.gruppen2.domain.event.UpdateUserMaxEvent; import mops.gruppen2.domain.exception.EventException; +import mops.gruppen2.domain.exception.BadParameterException; import mops.gruppen2.domain.exception.UserNotFoundException; import mops.gruppen2.domain.exception.WrongFileException; import mops.gruppen2.security.Account; @@ -44,6 +45,26 @@ public class ControllerService { this.logger = Logger.getLogger("controllerServiceLogger"); } + /** + * Überprüft ob alle Felder richtig gesetzt sind. + * @param description + * @param title + * @param userMaximum + */ + private void checkFields(String description, String title, Long userMaximum ) { + if(description == null) { + throw new BadParameterException("Die Beschreibung wurde nicht korrekt angegeben"); + } + + if(title == null) { + throw new BadParameterException("Der Titel wurde nicht korrekt angegeben"); + } + + if (userMaximum == null) { + throw new BadParameterException("Teilnehmeranzahl wurde nicht korrekt angegeben"); + } + } + /** * Erzeugt eine neue Gruppe, fügt den User, der die Gruppe erstellt hat, hinzu und setzt seine Rolle als Admin fest. * Zudem wird der Gruppentitel und die Gruppenbeschreibung erzeugt, welche vorher der Methode übergeben wurden. @@ -53,20 +74,27 @@ public class ControllerService { * @param title Gruppentitel * @param description Gruppenbeschreibung */ - public void createGroup(Account account, String title, String description, Boolean maxInfiniteUsers, Boolean visibility, Long userMaximum, UUID parent) throws EventException { + public void createGroup(Account account, String title, String description, Boolean visibility, Boolean maxInfiniteUsers, Long userMaximum, UUID parent) throws EventException { Visibility visibility1; UUID groupId = eventService.checkGroup(); + maxInfiniteUsers = maxInfiniteUsers != null; + + + if(maxInfiniteUsers) { + userMaximum = 100000L; + } + + checkFields(description, title, userMaximum); + + visibility = visibility == null; + if (visibility) { visibility1 = Visibility.PUBLIC; } else { visibility1 = Visibility.PRIVATE; } - if(maxInfiniteUsers){ - userMaximum = 100000L; - } - CreateGroupEvent createGroupEvent = new CreateGroupEvent(groupId, account.getName(), parent, GroupType.SIMPLE, visibility1, userMaximum); eventService.saveEvent(createGroupEvent); @@ -78,12 +106,12 @@ public class ControllerService { public UUID createOrga(Account account, String title, String description, Boolean visibility, Boolean lecture, Boolean maxInfiniteUsers, Long userMaximum, UUID parent) throws EventException, IOException { List userList = new ArrayList<>(); - if (userMaximum == null) { + maxInfiniteUsers = maxInfiniteUsers != null; + if(maxInfiniteUsers) { userMaximum = 100000L; } visibility = visibility == null; lecture = lecture != null; - maxInfiniteUsers = maxInfiniteUsers != null; Visibility visibility1; UUID groupId = eventService.checkGroup(); if (visibility) { diff --git a/src/main/java/mops/gruppen2/service/EventService.java b/src/main/java/mops/gruppen2/service/EventService.java index 3fbc8e8..4d52888 100644 --- a/src/main/java/mops/gruppen2/service/EventService.java +++ b/src/main/java/mops/gruppen2/service/EventService.java @@ -127,13 +127,13 @@ public class EventService { } public List findGroupIdsByUser(String userId) { - List groupIDs = eventStore.findGroup_idsWhereUser_id(userId); - - System.out.println(groupIDs); - - return groupIDs.stream() - .map(UUID::fromString) - .collect(Collectors.toList()); + return eventStore.findGroup_idsWhereUser_id(userId).stream() + .map(UUID::fromString) + .collect(Collectors.toList()); } + public boolean userInGroup(UUID groupId, String userId) { + return eventStore.countEventsByGroupIdAndUserIdAndEventType(groupId.toString(), userId, "AddUserEvent") + > eventStore.countEventsByGroupIdAndUserIdAndEventType(groupId.toString(), userId, "DeleteUserEvent"); + } } diff --git a/src/main/java/mops/gruppen2/service/GroupService.java b/src/main/java/mops/gruppen2/service/GroupService.java index 9a9b6d7..aa22132 100644 --- a/src/main/java/mops/gruppen2/service/GroupService.java +++ b/src/main/java/mops/gruppen2/service/GroupService.java @@ -69,31 +69,37 @@ public class GroupService { } /** - * Sucht alle Zeilen in der DB mit visibility=true. - * Erstellt eine Liste aus öffentlichen Gruppen (ohen bereits beigetretenen Gruppen). + * Wird verwendet bei der Suche nach Gruppen: Titel, Beschreibung werden benötigt. + * Außerdem wird beachtet, ob der eingeloggte User bereits in entsprechenden Gruppen mitglied ist. * * @return Liste von projizierten Gruppen * @throws EventException Projektionsfehler */ public List getAllGroupWithVisibilityPublic(String userId) throws EventException { - List createEvents = eventService.translateEventDTOs(eventRepository.findAllEventsByType("CreateGroupEvent")); - createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupDescriptionEvent"))); - createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupTitleEvent"))); - createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("DeleteGroupEvent"))); - List visibleGroups = projectEventList(createEvents); + List groupEvents = eventService.translateEventDTOs(eventRepository.findAllEventsByType("CreateGroupEvent")); + groupEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupDescriptionEvent"))); + groupEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupTitleEvent"))); + groupEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("DeleteGroupEvent"))); + groupEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateUserMaxEvent"))); - List userGroupIds = eventService.findGroupIdsByUser(userId); + List visibleGroups = projectEventList(groupEvents); return visibleGroups.parallelStream() .filter(group -> group.getType() != null) - .filter(group -> !userGroupIds.contains(group.getId())) + .filter(group -> !eventService.userInGroup(group.getId(), userId)) .filter(group -> group.getVisibility() == Visibility.PUBLIC) .collect(Collectors.toList()); - } + /** + * Wird verwendet beim Gruppe erstellen bei der Parent-Auswahl: nur Titel benötigt. + * + * @return + * @throws EventException + */ public List getAllLecturesWithVisibilityPublic() throws EventException { List createEvents = eventService.translateEventDTOs(eventRepository.findAllEventsByType("CreateGroupEvent")); + createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("DeleteGroupEvent"))); createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupTitleEvent"))); List visibleGroups = projectEventList(createEvents); @@ -115,6 +121,10 @@ public class GroupService { * @throws EventException Projektionsfehler */ public List findGroupWith(String search, Account account) throws EventException { + if (search.isEmpty()) { + return getAllGroupWithVisibilityPublic(account.getName()); + } + return getAllGroupWithVisibilityPublic(account.getName()) .parallelStream() .filter(group -> diff --git a/src/main/resources/templates/detailsNoMember.html b/src/main/resources/templates/detailsNoMember.html index 7895e4e..f57f300 100644 --- a/src/main/resources/templates/detailsNoMember.html +++ b/src/main/resources/templates/detailsNoMember.html @@ -12,7 +12,7 @@